2

我正在为一个团队中的通用 USB HID 设备编写一个控制软件,在 Windows 7 上工作。由于我作为实习生的身份,我的可能性是有限的:

  • 该软件必须在 Windows 上运行
  • 该软件必须使用 Windows 提供的默认 HID 驱动程序

我的问题是,但是我尝试在使用 HidUSB 驱动程序时访问设备(根据 Zadig),当设备实际发送数据时,我的中断传输读取尝试总是导致超时。写入设备一直有效,无论我使用 HIDAPI,是否使用 libusb,只有读取失败。(这是一个原始设备 atm,甚至最终的数据包数据规范都没有完成,目前它只是向主机发送一个 ON 或 OFF 字符串,写入设备会在 7 种颜色和关闭状态之间更改 LED 的状态,所以一个人肯定在工作)

我想不出设备有问题,因为如果我用 Zadig 将 Windows 上的驱动程序替换为 WinUSB 驱动程序,它可以与 libusb 一起工作(此后 hidapi 无法打开设备)和 Linux 上,只需读取 /dev /hidraw 也可以很好地返回数据。我还阅读了 HID 和 USB 规范,并且我知道设备描述符声明 USB 数据包大小为 8,而 HID 输入报告的大小上限为 20,但我不知道设备使用什么报告 ID。

检查 Windows 与 USBPcap 和 Wireshark 的通信,我注意到设备处理的唯一区别是,与 WinUSB 驱动程序一起使用时的 CC 相比,HidUSB 驱动程序请求数据的主机数据包用 00 填充。

作为记录,我已经尝试过 libusb、hidapi、HidLibrary 并且团队中没有人知道现在该做什么。

我还读到 Windows 禁用了对 HID 键盘和鼠标的访问,但我没有发现设备配置最终成为 USB 鼠标的实际示例。设备管理器在 HID 下列出了我的设备两次,一次作为 HID 兼容设备或其调用方式(此处为本地化 Win7),一次作为 USB 输入设备,但未在鼠标或键盘选项中列出。

4

1 回答 1

2

前段时间整理了一下,但是如果将来有人遇到类似问题,我想我会在这里写下来。

如果报告的数据大小与报告描述符中的已发送数据的长度不匹配,Windows HID 驱动程序将使任何传入数据包无效。Linux 和设备本身并不关心,这就是为什么我在提出问题时也排除了它作为来源的原因。在上面的示例中,4-5 字节的开/关消息与报告的 20 字节长度是问题所在,现在设备发送 20B 消息,所有可以通过 HidUSB 写入的解决方案也可以读取。

于 2014-07-15T14:10:09.687 回答