2

我目前正在将使用 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)还是可能是设备?

我的应用程序的伪代码只是:

  1. 初始化 HIDAPI 和设备相关

  2. 使用 HIDAPI 连接到设备

  3. 写 USB 命令

  4. 读取 USB 命令(如果写入需要多个数据,则执行多次)

  5. 解析数据

  6. 重复 3 和 4 直到所有命令都执行完毕

  7. 释放内存并关闭 HIDAPI。

我尝试过的事情:

  1. 确保读取和写入之间没有延迟

  2. 在写入之前添加读取数据的刷新(有时会捕获杂散数据)

  3. 在刷新读取数据时添加一个非常长的超时(五秒) - 以巨大的成本显着减少问题。

4

0 回答 0