【发布时间】:2017-12-20 08:57:47
【问题描述】:
最近,我开始学习如何在 Windows 10 上与 HID 设备进行通信。
但我有几个问题。
根据Window的文档,HidD_SetOutputReport必须将ReportBuffer参数的第一个字节设置为报告ID或0x00。
由于我设备的 HID 报告描述符已经声明了一些报告 id,所以当我使用 HidD_setoutputreport 而不是 0x00 时,我必须设置报告 id?
当我使用报告 ID 0x80 作为 buf[0] 时,例如:0x80 0x02 0x00 ....... 0x00(我的 Capabilities.OutputReportByteLength 是 64)
我的代码是ret = HidD_SetOutputReport(handle->device_handle, buf2, 65)
但我总是这样发送数据(Bus Hound):
64 输出 80 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ............. 4.1.0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ...... 4.1.16
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ...... 4.1.32
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ...... 4.1.48
我认为它应该发送buf[1] to buf[64]而不是buf[0] to buf[63],所以我尝试了ret = HidD_SetOutputReport(handle->device_handle, buf2, 64),但结果是一样的。
这是我的 INPUT 和 OUTPUT 的 HID 报告描述符:
使用页面(通用桌面)05 01
逻辑最小值 (0) 15 00
使用(操纵杆)09 04
收集(应用)A1 01
报告 ID (48) 85 30
使用页面(通用桌面)05 01
使用页面(按钮)05 09
最低使用量(按钮 1)19 01
使用最大值(按钮 10)29 0A
逻辑最小值 (0) 15 00
逻辑最大值 (1) 25 01
报告大小 (1) 75 01
报告计数 (10) 95 0A
单位指数 (0) 55 00
单位(无)65 00
输入 (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit) 81 02
使用页面(按钮)05 09
最低使用量(按钮 11)19 0B
使用最大值(按钮 14)29 0E
逻辑最小值 (0) 15 00
逻辑最大值 (1) 25 01
报告大小 (1) 75 01
报告数 (4) 95 04
输入 (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit) 81 02
报告大小 (1) 75 01
报告数 (2) 95 02
输入(Cnst,Var,Abs,NWrp,Lin,Pref,NNul,Bit)81 03
用法(通用桌面:指针)0B 01 00 01 00
集合(物理)A1 00
Usage (Generic Desktop:X) 0B 30 00 01 00 Usage (Generic Desktop:Y) 0B 31 00 01 00 Usage (Generic Desktop:Z) 0B 32 00 01 00 Usage (Generic Desktop:Rz) 0B 35 00 01 00 Logical Minimum (0) 15 00 Logical Maximum (65535) 27 FF FF 00 00 Report Size (16) 75 10 Report Count (4) 95 04 Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit) 81 02结束集合C0
用法(通用桌面:帽子开关)0B 39 00 01 00
逻辑最小值 (0) 15 00
逻辑最大值 (7) 25 07
物理最小值 (0) 35 00
物理最大值 (315) 46 3B 01
单位(英转:度)65 14
报告大小 (4) 75 04
报告数 (1) 95 01
输入 (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit) 81 02
使用页面(按钮)05 09
最低使用量(按钮 15)19 0F
使用最大值(按钮 18)29 12
逻辑最小值 (0) 15 00
逻辑最大值 (1) 25 01
报告大小 (1) 75 01
报告数 (4) 95 04
输入 (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit) 81 02
报告大小 (8) 75 08
报告数 (52) 95 34
输入(Cnst,Var,Abs,NWrp,Lin,Pref,NNul,Bit)81 03
使用页面(供应商定义 1)06 00 FF
报告 ID (33) 85 21
使用情况(供应商定义 1)09 01
报告大小 (8) 75 08
报告数 (63) 95 3F
输入(Cnst,Var,Abs,NWrp,Lin,Pref,NNul,Bit)81 03
报告 ID (129) 85 81
使用情况(供应商定义 2)09 02
报告大小 (8) 75 08
报告数 (63) 95 3F
输入(Cnst,Var,Abs,NWrp,Lin,Pref,NNul,Bit)81 03
报告 ID (1) 85 01
使用情况(供应商定义 3)09 03
报告大小 (8) 75 08
报告数 (63) 95 3F
输出 (Cnst,Var,Abs,NWrp,Lin,Pref,NNul,Vol,Bit) 91 83
报告 ID (16) 85 10
使用情况(供应商定义 4)09 04
报告大小 (8) 75 08
报告数 (63) 95 3F
输出 (Cnst,Var,Abs,NWrp,Lin,Pref,NNul,Vol,Bit) 91 83
报告 ID (128) 85 80
使用(供应商定义 5)09 05
报告大小 (8) 75 08
报告数 (63) 95 3F
输出 (Cnst,Var,Abs,NWrp,Lin,Pref,NNul,Vol,Bit) 91 83
报告 ID (130) 85 82
使用(供应商定义 6)09 06
报告大小 (8) 75 08
报告数 (63) 95 3F
输出 (Cnst,Var,Abs,NWrp,Lin,Pref,NNul,Vol,Bit) 91 83
结束集合C0
【问题讨论】:
-
如果您有两个问题,请提出两个问题。如果有人回答了第一部分,StackOverflow 的首页会显示该问题已经回答,您可能无法在第二部分得到回复。
-
Ted,你能发布完整的报告描述符吗?
-
@MSalters 我很抱歉
-
@aja 我已经更新了!
-
我无法真正评论 Windows API(我从未使用过它),但我知道如果您在 HID 报告描述符中指定报告 ID,则报告 ID 占据第一个字节您的数据包的其余部分是您的有效负载,否则您的数据包是所有有效负载并且不会发送 REPORT_ID。在您的情况下,您的 RD 指定了 REPORT_ID 和 63 字节的有效负载,因此我将指定长度为 64,并将 REPORT_ID 放在第一个字节中。您是否检查了 HidD_SetOutputReport 调用的返回值? (只是好奇)。
标签: c++ windows usb hid hidapi