容错 USB HID 通信

Fault tolerant USB HID communication

提问人:wronex 提问时间:11/17/2023 更新时间:11/17/2023 访问量:44

问:

有没有办法通过 HID 发送容错 USB 通信,其中标准 Windows 驱动程序在检测到错误时不会引发BROKEN_PIPE?

根据我的经验,Windows 中的通用 HID 驱动程序很容易在出现 HID 批量传输问题的第一个迹象时投降。它设置了BROKEN_PIPE标志。然后,除非使用管理权限重新加载驱动程序,否则所有将来的通信都是不可能的。我认为中断传输也是如此。

问题不在于向协议添加校验和和数据包计数器。问题在于弄清楚如何说服 Windows 驱动程序永不投降,在遇到不利条件时尽最大努力传递数据包(或丢弃它们)。

避免管理权限和避免编写特殊驱动程序至关重要。

我们可以将数据打包到控制传输中吗?这些是否也容易导致管道破裂?USB 的 UDP 等效项是什么?

我尝试通过 HID 发送批量传输,但这些传输会导致BROKEN_PIPE。我也尝试过发送中断传输,但这些似乎也会导致BROKEN_PIPE。我希望存在类似 UDP 的模式,其中 HID 驱动程序会丢弃明显不好但连接保持打开状态的数据包。在这里,沟通是尽最大努力的,任何通过的数据都被允许通过,而不会放弃。

C HID 容错 WinAPI USB HID

评论

1赞 Ben Voigt 11/17/2023
如果使用内置驱动程序,则会获取其行为。编写新的驱动程序是完全控制行为的方式。
0赞 Jesper Juhl 11/17/2023
这可能是由于发送了超过 PIPE_BUF 字节的消息?并且只需发送永远不会超过限制的单个数据包即可缓解?
0赞 wronex 11/17/2023
@JesperJuhl很遗憾没有。数据包小于 60 字节。大多数要小得多,例如 10-20 字节。
0赞 wronex 11/17/2023
@BenVoigt我真的很想避免编写驱动程序。是否有经过实战考验的签名驱动程序可供我改用?
1赞 David Grayson 11/17/2023
是的,它被称为 WinUSB。它带有 Windows,您只需向设备添加一些 MS OS 2.0 描述符即可使其自动加载。有几个用户空间库支持它,包括 libusb 和 libusbp。

答: 暂无答案