如果不同的话,那Report ID是怎么确定的?
Report ID由HID设备的报告描述符来决定,具体多少要看你里面的设定(一般设定输入和输入2种ID),在WriteFile和ReadFile时与设定保持一致即可
还有一种是报告描述符里没有设定,系统默认输入输出ID都为0x00
2.要向HID设备发送一串数据,那么使用HIDD_SetFeature(..)和HIDD_SetOutputReport(..)及使用WriteFile(..)函数实现有没有什么区别?
应用程序只需要使用WriteFile(..)即可,
HIDD_SetFeature(..)和HIDD_SetOutputReport(..)为PC机自己调用,不属于应用程序里面的东西(这个地方不太确定,应该是)
3.使用HIDD_SetFeature,HIDD_SetOutputReport及WriteFile函数向设备(Driver)发送一串数据,Driver接收到的就是整个Report数据?
接受函数是ReadFile(),同理
注意:WriteFile()及ReadFile()都比实际的数据要多一位ReportID,这个ReportID使用BUSHOUND是看不到的,但是实际存在,也就是说你的读写数组的位数都要在你实际数据位数的基础上加1,否则会返回错误,使用GetlastError可以查看到具体的错误内容.
1 、 ReadFile 的调用不会引起设备的任何反应,即 HID 设备与主机之间的中断 IN 传输不与 ReadFile 打交道。实际上主机会在最大间隔时间(由设备的端点描述符来指定)内轮询设备,发出中断 IN 传输的请求。“读取”即意味着从某个 buffer 里面取回数据,实际上这个 buffer 就是 HID 设备驱动中的 buffer 。这个 buffer 的大小可以通过 HidD_SetNumInputBuffers 来改变。在 XP 上缺省值是 32 (个报告)。实贱表明:
是”USB人体输入学设备驱动“会在最大间隔时间(由设备的端点描述符来指定)内轮询设备,发出中断 IN 传输的请求。然后将数据收到自已驱动中的 buffer!但ReadFile也不直接与”USB人体输入学设备驱动“打交道!有兴趣大家可以用BUS HOUND看一下!你只监视”USB人体输入学设备“,你不调用ReadFile,下位机也会有数据发上来。BUS HOUND可以看到数据。下位机没数据时!你调用ReadFile,”USB人体输入学设备“,也不会有动作!
而当您监视了!HID compliant device设备,你不ReadFile,就是”USB人体输入学设备“有接收到数据,HID compliant device设备也不会有数据请求的!只有当你ReadFile了!HID compliant device设备就会出现一次数据请求!你就能看到HID compliant device的数据。
更细一点的测试是!HID下位机连发了向个报告时(ReadFile不去读),”USB人体输入学设备驱动“会都接收这些报告数据,然后放在自己的buffer中!接收你调用一次ReadFile,”HID compliant device驱动“就会向”USB人体输入学设备驱动“请求一次数据,然后它如果和ReadFile相交成功的话,ReadFile就会正确读到一个报告数据。你再调用ReadFile会再读到一个!直到”USB人体输入学设备驱动“收到的数据全部被读完!
现在的我的情况就出现在HID compliant device驱动和ReadFile相交这块!ReadFile绝大多数时可以成功读到数据,但总会不定期的有一次不成功!
还有一个怪的现象!ReadFile好象只是发出了一个Windows IO请求,而这个Windows IO请求好象没成功和”HID compliant device驱动“交互。因为从现象上看HID compliant device设备驱动好象没有超时机制!如ReadFile后 wait用永久等待的方式在等,当出现这种情况程序会卡死在这里永远等待,但当下一次下位机设备发上新的数据时!wait也会结束等待,读出最新的数据。而不成功的那次数据就好象从来没出现过一样,人间蒸发了!这中间到底那块出了问题!是我想知道的!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)