跳转到内容

确定设备写入类型

一旦您了解了设备的协议类型,您可能仍然需要确定使用哪个具体的写入函数。HID 设备特别有两种不同的写入方法,针对不同的 USB 传输机制。


device.write() 在设备当前选定的 HID 端点上使用批量或中断传输发送数据。这是标准写入路径,适用于大多数设备。

在以下情况下使用 device.write()

  • 设备通过中断传输发送和接收固定长度的报告
  • Wireshark 捕获显示 URB_INTERRUPT 传输
  • 设备在选定端点上没有使用 HID Report ID(需要零填充——见下文)
var packet = [];
packet[0] = 0xEC;
packet[1] = 0x40;
packet[2] = channel;
packet = packet.concat(RGBData);
device.write(packet, 65);

device.send_report() 使用 HID SET_REPORT 控制传输发送数据。这针对 HID 功能报告机制,而不是中断端点。

在以下情况下使用 device.send_report()

  • Wireshark 捕获显示带有 SET_REPORT 请求(请求代码 0x09)的 URB_CONTROL 传输
  • device.write() 在所有端点上返回”incorrect function”错误
  • 设备明确使用 HID 功能报告作为其命令接口
device.send_report([0x07, 0x03, 0x06, 0x01, 0x00], 65);

功能报告的对应读取函数是 device.get_report(),它发出 GET_REPORT 控制传输。当您需要通过相同的功能报告机制读回配置时使用它。


如果您不确定,先从 device.write() 开始。它适用于大多数 HID 设备。如果出现”incorrect function”错误,切换到 device.send_report()。如果两者都失败,请验证您是否选择了正确的端点

症状尝试
按预期工作已完成
”Incorrect function” 错误切换到 device.send_report()
”Access is denied” 错误端点错误 — 参见选择端点
无错误,但设备无响应端点错误,或设备类型错误

某些 HID 设备要求每个数据包的第一个字节为 0x00。当设备没有为所选端点分配 Report ID 时会发生这种情况——HID 驱动程序在将数据传递给设备之前去掉字节 0,因此您需要将所有内容向后移动一个位置来补偿。

需要零填充的迹象:

  • Wireshark 捕获显示第一个有意义的命令字节在偏移 1 处,而不是偏移 0
  • 没有零字节,设备忽略数据包或产生乱码输出

如何应用:

// 不带零填充(数据包大小 64)
packet[0] = 0xEC; // command
packet[1] = 0x40;
device.write(packet, 64);
// 带零填充(数据包大小 65)
packet[0] = 0x00; // padding byte — consumed by HID driver
packet[1] = 0xEC; // command now at offset 1
packet[2] = 0x40;
device.write(packet, 65);

经验法则:如果您的 Wireshark 捕获显示 64 字节数据包,但 device.write(packet, 64) 不起作用,请尝试 device.write(packet, 65),并将 packet[0] = 0x00,所有其他字节向上移动一个位置。


读取端的对应函数遵循相同的分割:

写入方法对应读取方法传输类型
device.write()device.read()批量 / 中断
device.send_report()device.get_report()控制(GET_REPORT)

对于专门读取输入报告(而非功能报告),请使用 device.input_report()。有关详细信息,请参阅高级通信