You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动