现有一个普通usb 设备(一个控制端口,两个bulk(批量)端口,分别为in,out),想将其模拟成标准的HID设备,并用标准的HID 接口来读、写数据。
HID读数据机制:ReadFile的调用不会引起设备的任何反应,即内核层收不到IOCTL_HID_READ_REPORT命令。应用层发的ReadFile命令不和HID设备与主机之间的中断IN端点直接联系。而主机会在设定的轮询时间内轮询设备,由HIDCLASS模块发出IOCTL_HID_READ_REPORT命令来读取中断IN端点的数据,将读到的数据放到buffer中。ReadFile即意味着从这个buffer中取回数据。轮询时间可以再接口描述符中设定,buffer大小可以通过HidD_SetNumInputBuffers来改变,XP默认大小为32个报告。
因此就会出现如下问题:
如果轮询时间太短,在ReadFile两次读取buffer之间,其buffer满了还在不停地存数据到其中,就会丢失数据。但是我做的项目不能让其丢数据......

本文探讨了在将非HID USB设备模拟为HID设备时遇到的数据读取问题。由于HID读取机制,ReadFile操作与设备中断端点的轮询时间有关,可能导致数据丢失。为解决这个问题,提出了延长轮询时间和增加缓冲区大小两种解决方案。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



