【问题标题】:WinApi get number of available bytes from a USB port?WinApi 从 USB 端口获取可用字节数?
【发布时间】:2010-11-16 16:03:02
【问题描述】:

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

我们正在使用 CreateFileReadFileWriteFile 与我们的 USB 设备进行 IO 通信,这很有效。但是如果不进行实际读取,我们无法计算出有多少数据可用。我们不能使用GetFileSize,因为即使是文档也说你不能将它用于:

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

所以这行不通。有什么建议么?我们的 USB I/O 操作是否错误?有没有更好的方法来读取/写入 USB?

【问题讨论】:

    标签: c++ winapi usb


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 对不起,我应该在问题中规定这是在 Windows 移动设备上,所以 Overlapped async 的东西不起作用。
    • @OTisler:在这种情况下,我认为您最好的选择可能是创建一个单独的线程并执行同步ReadFile,但我对 Windows Mobile 不够熟悉,不知道是否有更好的选择。
    • 谢谢,我们现在就是这样做的。我只是希望除了实际阅读之外还有另一种方法......
    【解决方案2】:

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

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

    编辑:我能找到的最好的本地人是ReadPrinter - 我不知道如何检查数据是否存在,如果没有,这将阻塞。

    【讨论】:

    • 我可以使用 C#(实际上会更喜欢它!)但是如何从 SerialPort 类访问 USB 端口?你给它什么端口名称?我很快尝试了它,但它不会连接到 USB 端口名称,当我执行 SerialPort.GetPortNames() 时,它只返回 COM1、3、4,5,没有 USB...
    • @OTisler - 是的,我想知道绑定是如何工作的。还在挖。
    • @OTisler - 你运气不好,在 .Net 4 SerialPort 名称必须以“COM”开头 - connect.microsoft.com/VisualStudio/feedback/details/365891/…
    猜你喜欢
    • 1970-01-01
    • 2013-10-07
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多