WinApi получить количество доступных байтов от USB-порта? - PullRequest
2 голосов
/ 16 ноября 2010

Есть ли способ проверить количество байтов, доступных на USB-устройстве (в нашем случае, на принтере)?

Мы используем CreateFile и ReadFile и WriteFile для связи ввода-вывода с нашим USB-устройством, которое работает.Но мы не можем понять, сколько данных доступно, фактически не прочитав.Мы не можем использовать GetFileSize , так как даже в документации говорится, что вы не можете использовать его для:

«незапрашиваемого устройства, такого как канал или устройство связи».

Так что это не работает.Какие-либо предложения?Неправильно ли мы делаем наш ввод / вывод USB?Есть ли лучший способ чтения / записи на USB?

Ответы [ 2 ]

3 голосов
/ 16 ноября 2010

Сначала необходимо открыть порт в асинхронном режиме.Для этого передайте флаг FILE_FLAG_OVERLAPPED на CreateFile.Затем, когда вы вызываете ReadFile, передаете указатель на структуру OVERLAPPED.Это делает асинхронное чтение и немедленно возвращает ERROR_IO_PENDING без блокировки (или, если в ОС уже есть данные в буфере, вам может повезти и вы получите успешное чтение - будьте готовы обработать этот случай).

После запуска асинхронного ввода-вывода вы можете периодически проверять, завершилось ли оно с помощью GetOverlappedResult.

. Это позволяет вам ответить на вопрос "доступны ли X байтов данных?"для определенного значения X (переданного ReadFile).В 95% случаев этого достаточно, поскольку вы ищете данные в определенном формате.Остальные 5% времени вам нужно будет добавить еще один уровень вершины абстракции, где вы продолжаете выполнять асинхронное чтение и хранить данные в буфере.

Обратите внимание, что асинхронный ввод-вывод очень сложен дляполучить право, и есть много крайних случаев для рассмотрения.Внимательно прочитайте всю документацию по этим функциям, чтобы убедиться в правильности кода.

0 голосов
/ 16 ноября 2010

Можете ли вы использовать C #?В этом случае вы можете получить доступ к USB-порту, используя класс System.IO.SerialPort , а затем настроить обработчик событий DataReceived для входящих данных.Существует свойство BytesToRead , которое сообщает вам, сколько данных ожидает чтения.

Все это должно быть доступно в собственном коде, если я смогу его найти, я отредактирую это.

РЕДАКТИРОВАТЬ: лучшее, что я могу найти для нативного, это ReadPrinter - я не вижу, как проверить, есть ли данные, это заблокирует, если это не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...