在Linux上通过HIDAPI读取USB设备有时会导致数据丢失

在Linux上通过HIDAPI读取USB设备有时会导致数据丢失,linux,usb,libusb,hidapi,Linux,Usb,Libusb,Hidapi,我目前正在将使用USB设备的代码从Windows移植到Linux 我已经彻底测试了原始应用程序,我非常确定该设备运行良好。我在Linux上使用hidapi libusb实现了USB接口,有时设备返回的数据至少缺少一个字节 一旦发生这种情况,所有返回的值都会丢失那么多数据。为了使USB设备正确读取数据,我或多或少必须断开并重新连接USB设备。我开始认为,可能第一个字节有时返回为00,Linux会忽略它。它通常在连续读取时发生 例如: 我发送get寄存器状态,我希望有10个数据可用于USB读取。字节

我目前正在将使用USB设备的代码从Windows移植到Linux

我已经彻底测试了原始应用程序,我非常确定该设备运行良好。我在Linux上使用hidapi libusb实现了USB接口,有时设备返回的数据至少缺少一个字节

一旦发生这种情况,所有返回的值都会丢失那么多数据。为了使USB设备正确读取数据,我或多或少必须断开并重新连接USB设备。我开始认为,可能第一个字节有时返回为00,Linux会忽略它。它通常在连续读取时发生

例如: 我发送get寄存器状态,我希望有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 02 00 09 42 ab(数据9)

数据9的数据包编号错误,因为它缺少一个字节。我试着改用hidapi-hidraw,但它的发生率明显降低。我已经检查了设备的hidraw(/dev/hidraw0)的hextump,它与我在应用程序中获得的数据一致。我尝试过使用内存泄漏检测工具,但没有检测到泄漏/损坏

这是Linux的问题(3.2.0-4-amd64)还是可能是设备的问题

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

  • 初始化HIDAPI和与设备相关的

  • 使用HIDAPI连接到设备

  • 写USB命令

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

  • 解析数据

  • 重复3和4,直到执行所有命令

  • 释放内存并关闭HIDAPI

  • 我尝试过的事情:

  • 确保读写之间没有延迟

  • 在写入之前添加读取数据的刷新(有时捕获散乱数据)

  • 在刷新读取数据时增加一个很长的超时时间(5秒),这大大减少了问题的发生,但代价很大


  • 我看到了一个非常类似的问题,导致通过USB音频设备传输的音频信号损坏。一些尝试的建议:1。查找设备上的USB芯片类型-谷歌查找已知问题。2.在读写设备之间增加一个小的延迟(比如20ms)。3.尝试另一台主机(PC)-它可能是由芯片或驱动程序(ehci.xhci,…)引起的。我面临同样的问题。你找到修复程序了吗?哦,我找到了修复程序,它是由操作系统引起的。我使用的是一个虚拟操作系统,它导致数据包丢失。