我目前正在将使用 USB 设备的代码从 Windows 移植到 Linux。
我已经彻底测试了原始应用程序,我很确定该设备运行良好。我使用 hidapi-libusb 在 Linux 上实现了 USB 接口,有时从设备返回的数据至少缺少一个字节。
一旦发生,所有返回的值都会丢失那么多数据。为了使 USB 设备正确读取数据,我或多或少必须断开并重新连接 USB 设备。我开始认为也许第一个字节有时会返回为 00 而 Linux 会忽略它。它通常发生在连续读取上。
例如:我发送获取寄存器状态,我希望有 10 个数据可用于 USB 读取。字节 5 是数据的编号。
预期的:
00 00 01 02 00 08 42(数据 8)
00 00 01 02 00 09 42(数据 9)
实际的:
00 00 01 02 00 08 42(数据 8)
00 00 02 00 09 42 ab(数据 9)
数据 9 的数据包编号出错,因为它缺少一个字节。我已经尝试更改为 hidapi-hidraw,并且发生的次数要少得多。我检查了设备的 hidraw (/dev/hidraw0) 的 hexdump,它与我在应用程序中获取的数据一致。我试过使用内存泄漏检测工具,没有检测到泄漏/损坏。
这是 Linux 问题(3.2.0-4-amd64)还是可能是设备?
我的应用程序的伪代码只是:
初始化 HIDAPI 和设备相关
使用 HIDAPI 连接到设备
写 USB 命令
读取 USB 命令(如果写入需要多个数据,则执行多次)
解析数据
重复 3 和 4 直到所有命令都执行完毕
释放内存并关闭 HIDAPI。
我尝试过的事情:
确保读取和写入之间没有延迟
在写入之前添加读取数据的刷新(有时会捕获杂散数据)
在刷新读取数据时添加一个非常长的超时(五秒) - 以巨大的成本显着减少问题。