最近,我开始学习如何在Windows 10上与HID设备进行通信
但我得到的问题很少
根据窗口的文档, 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)
但我总是发送这样的数据(在丛林中)
64 OUT 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 ........... ..... 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输入(数据,Var,Abs,NWrp,Lin,Pref,NNul,位)81 02使用页面(按钮)05 09使用最小值(按钮11)19 0B使用最大值(按钮14)29 0E逻辑最小值(0)15 00逻辑最大值(1)25 01报告大小(1)75 01报告计数(4)95 04输入(数据,Var,Abs,NWrp,Lin,Pref,NNul,位)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用法(通用桌面:X)0B 30 00 01 00
用法(通用桌面:是)0B 31 00 01 00
用法(通用桌面:Z)0B 32 00 01 00
用法(通用桌面:Rz)0B 35 00 01 00
逻辑最小值(0)15 00
逻辑最大值(65535)27 FF FF 00 00
报告大小(16)75 10
报告数(4)95 04
输入(数据,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单位(Eng Rot:度)65 14报告大小(4)75 04报告计数(1)95 01输入(数据,Var,Abs,NWrp,Lin,Pref,NNul,位)81 02使用页面(按钮)05 09使用最小值(按钮15 )19 0F最大使用率(按钮18)29 12逻辑最小值(0)15 00逻辑最大值(1)25 01报告大小(1)75 01报告计数(4)95 04输入(数据,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,位)81 03报告ID(129)85 81用法(供应商定义2)09 02报告大小(8)75 08报告计数(63)95 3F输入(Cnst,Var,Abs,NWrp,Lin,Pref,NNul,位)81 03报告ID(1)85 01用法(V endor-Defined 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
谢谢你的任何提示!
1 回答
我只是从评论中复制我的答案,所以它不会在历史中丢失:) ...
...而且我还有时间检查你的报告描述符,我可以建议一些可能减少未来悲伤机会的调整 .
从输入报告中删除52字节的填充 . 它只会被主机忽略,所以不需要从你的设备发送它 .
使用较短的使用代码来减小报告描述符的大小 . 如果您的设备内存不足,这可能很重要 .
不需要时重置物理单位 . 如果你没有通过使用PUSH保存全局变量和POP来在以后的方便点恢复它们 .
在OUTPUT报告上指定DATA(不是CONSTANT) . 我真的不确定这是否有任何区别,但你永远不知道,未来的某些USB驱动程序可能会选择在发送数据包之前将任何CONSTANT字段设置为空值,这会导致痛苦 .
执行上述操作后,报表描述符大小从203个字节减少到133个字节: