pywinusb无法读写数据:自定义HID设备通信异常排查求助
解决pywinusb与自定义HID设备的返回数据接收问题
嘿,我来帮你搞定这个HID通信的问题!从你描述的情况来看,USB终端能正常收到返回,说明硬件和设备本身没问题,问题大概率出在pywinusb的代码实现上——毕竟HID设备的返回数据不是主动“响应”,而是通过输入报告传递的,得用正确的方式监听才行。
我给你梳理几个关键排查点和修复方案:
1. 必须注册输入报告的回调函数
pywinusb不会自动帮你捕获返回数据,你得手动绑定一个回调函数来处理设备发送的输入报告。这是最容易漏掉的一步!
2. 确保发送的输出报告和终端完全匹配
你在终端发送的是[0x55, 0x00,...., 0x00],要确认代码里的输出报告:
- 字节长度和终端一致(比如终端发了64字节,代码里也得构造64字节的数组)
- 报告ID是否正确(如果设备用了报告ID,通常第一个字节就是报告ID,终端里的0x55可能就是报告ID)
3. 发送数据后不要立刻退出程序
如果代码发送完数据就马上关闭设备或退出,回调函数还没来得及触发接收返回数据,自然啥也拿不到,得留足够的等待时间。
示例修复代码
import pywinusb.hid as hid import time # 定义接收数据的回调函数 def handle_input_report(data): # data[0]是报告ID(如果设备有设置的话),后面是实际返回的数据 print(f"收到返回数据: {[hex(byte) for byte in data]}") # 匹配你的设备VID和PID TARGET_VID = 0x0001 TARGET_PID = 0x0001 # 查找目标设备 device_list = hid.HidDeviceFilter(vendor_id=TARGET_VID, product_id=TARGET_PID).get_devices() if not device_list: print("没找到目标HID设备!") else: target_device = device_list[0] try: # 打开设备 target_device.open() # 绑定输入报告回调(关键!) target_device.set_raw_data_handler(handle_input_report) # 准备和终端一致的发送数据,这里假设是64字节长度 send_buffer = [0x55] + [0x00] * 63 # 调整长度到你终端发送的实际字节数 # 获取设备的输出报告 output_report = target_device.find_output_reports()[0] # 设置并发送数据 output_report.set_raw_data(send_buffer) output_report.send() print("数据已发送,等待设备返回...") # 等待2秒给设备返回数据的时间(可根据实际情况调整) time.sleep(2) finally: # 确保设备关闭 target_device.close()
额外排查点
- 检查设备的HID描述符,确认输入报告和输出报告的长度、报告ID是否和你代码里的设置一致
- 如果设备没有使用报告ID,那发送数据的第一个字节就是实际数据,不用留报告ID的位置
- 可以用
target_device.get_input_reports()查看设备支持的输入报告格式,确保回调监听的是正确的报告
内容的提问来源于stack exchange,提问作者user169808




