WinApi从USB端口获取可用字节数?

时间:2010-11-16 16:03:02

标签: c++ winapi usb

有没有办法检查USB设备可用的字节数(在我们的例子中是打印机)?

我们正在使用CreateFileReadFile以及WriteFile与我们的USB设备进行IO通信,这有效。但是,如果没有实际读取,我们无法确定可用的数据量。我们无法使用GetFileSize,因为即使文档说您也不能将它用于:

  

“非寻道设备,如管道或通讯设备”......

所以这不起作用。有什么建议?我们是否错误地进行了USB I / O?有没有更好的方法来读/写USB?

2 个答案:

答案 0 :(得分:3)

首先需要以异步模式打开端口。为此,请将标记FILE_FLAG_OVERLAPPED传递给CreateFile。然后,当您调用ReadFile时,传入指向OVERLAPPED结构的指针。这会进行异步读取并立即返回ERROR_IO_PENDING而不会阻塞(或者,如果操作系统已经缓存了数据,那么您可能会很幸运并获得成功读取 - 准备好处理该情况)。

异步I / O启动后,您可以定期检查是否已完成GetOverlappedResult

这使您可以回答“X字节数据是否可用?”的问题。对于特定的X值(传递给ReadFile的值)。 95%的时间,这已经足够好了,因为您正在寻找特定格式的数据。另外5%的时间,你需要添加另一层抽象top,在那里你继续进行异步读取并将数据存储在缓冲区中。

请注意,异步I / O非常难以实现,并且需要考虑很多边缘情况。仔细阅读这些功能的所有文档,以确保您的代码正确无误。

答案 1 :(得分:0)

你能用C#吗?如果是这样,您可以使用System.IO.SerialPort类访问USB端口,然后为传入数据设置DataReceived事件处理程序。有一个BytesToRead属性可以告诉您等待读取的数据量。

所有这些必须在本机代码中可用,如果我能找到它,我将编辑它。

编辑:我能为本地人找到的最好的是ReadPrinter - 我不知道如何检查数据是否存在,如果数据不存在则会阻止。