2010-11-16 78 views
2

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

我们使用CreateFileReadFileWriteFile与我们的USB设备进行IO通信,但是如果不实际读取数据,我们无法弄清楚有多少数据可用。我们不能用GetFileSize,因为即使文档说,你不能将其用于:

“nonseeking设备,如管道或通信设备” ......

使不起作用。有什么建议么?我们是否错误地进行USB I/O?有没有更好的方式来读取/写入USB?

回答

0

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

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

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

+0

我可以使用C#(实际上会更喜欢它!)但是,如何从SerialPort类访问USB端口?你给了什么端口名称?我很快尝试过,但它不会连接USB端口名称,当我做SerialPort.GetPortNames()它只返回COM1,3,4,5,没有USB ... – 2010-11-16 17:46:54

+0

@OTisler - 是的,我想知道如何绑定工作。仍在挖掘。 – 2010-11-16 17:54:46

+0

@OTisler - 你运气不好,在.Net 4中'SerialPort'名称必须以“COM”开头 - http://connect.microsoft.com/VisualStudio/feedback/details/365891/system-io-serialport- portname-can-only-start-with-com – 2010-11-16 18:00:48

3

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

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

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

请注意,异步I/O非常复杂,需要考虑很多边界情况。仔细阅读这些函数的所有文档,以确保您的代码是正确的。

+0

抱歉,我应该在问题中规定这是在Windows移动设备上,因此重叠的异步内容不起作用。 – 2010-11-16 18:05:41

+0

@OTisler:在这种情况下,我认为最好的选择可能是创建一个单独的线程并执行同步的“ReadFile”,但我对Windows Mobile不熟悉,不知道是否有更好的选项。 – 2010-11-16 18:09:37

+0

谢谢,我们现在就是这样做的。我只希望有另一种方式除了做一个实际的阅读... – 2010-11-16 18:14:42