开发者

WinApi get number of available bytes from a USB port?

开发者 https://www.devze.com 2023-01-25 03:46 出处:网络
Is there a way to check the number of bytes available from a USB device (printer in our case)? We\'re using CreateFile and ReadFile and WriteFile for IO communications with our USB device, which work

Is there a way to check the number of bytes available from a USB device (printer in our case)?

We're using CreateFile and ReadFile and WriteFile for IO communications with our USB device, which works. But We can't figure out h开发者_开发技巧ow much data is available without actually doing a read. We can't use GetFileSize, as even the documentation says you can't use it for a :

"nonseeking device such as a pipe or a communications device"...

So that doesn't work. Any suggestions? Are we doing our USB I/O incorrectly? Is there a better way to Read/Write to USB?


You first need to open up the port in asynchronous mode. To do that, pass the flag FILE_FLAG_OVERLAPPED to CreateFile. Then, when you call ReadFile, pass in a pointer to an OVERLAPPED structure. This does an asynchronous read and immediately returns ERROR_IO_PENDING without blocking (or, if the OS already has the data buffered, you might get lucky and get a successful read -- be prepared to handle that case).

Once the asynchronous I/O has started, you can then periodically check if it has completed with GetOverlappedResult.

This allows you to answer the question "are X bytes of data available?" for a particular value of X (the one passed to ReadFile). 95% of the time, that's good enough, since you're looking for data in a particular format. The other 5% of the time, you'll need to add another layer of abstraction top, where you keep doing asynchronous reads and store the data in a buffer.

Note that asynchronous I/O is very tricky to get right, and there's a lot of edge cases to consider. Carefully read all of the documentation for these functions to make sure your code is correct.


Can you use C#? If so you can access the USB port using System.IO.SerialPort class, and then set up a DataReceived event handler for incoming data. There is a BytesToRead property that tells you how much data is waiting to be read.

All of this must be available in native code, if I can find it I'll edit this.

EDIT: the best I can find for native is ReadPrinter - I don't see how to check if data is there, this will block if it's not.

0

精彩评论

暂无评论...
验证码 换一张
取 消