HID读下位数据丢失问题

PCR项目中,上位机采用异步ReadFile()的方法读取下位HID数据。在读取页显示数据时,会出现丢失某些行的现象。

 

分析原因如下:

       ReadFile()函数不能直接读取下位机的数据,和下位机HID通信的是Windows HID driver。driver根据下位机自定义HID描述符设定的时间,轮询发出IN包读取下位机的数据,将读到的数据暂存在dirver自身的buffer中。ReadFile()读取数据是从driver的buffer中读取。

       参考:ReadFile 的调用不会引起设备的任何反应,即 HID 设备与主机之间的中断 IN 传输不与 ReadFile 打交道。实际上主机会在最大间隔时间(由设备的端点描述符来指定)内轮询设备,发出中断 IN 传输的请求。“读取”即意味着从某个 buffer 里面取回数据,实际上这个 buffer 就是 HID 设备驱动中的 buffer 。这个 buffer 的大小可以通过 HidD_SetNumInputBuffers 来改变。在 XP 上缺省值是 32 (个报告)。

      http://blog.csdn.net/phenixyf/article/details/39929033

        下位机发送数据也是一样:下位机程序将要发送的数据发送到自身USB_SIE的buffer中(buffer大小等特性由选用的USB芯片决定)。

        如果下位机的buffer个数小于12(PCR项目一页的行数),当下位机程序连续发12行的数据时,如果上位机轮询时间比下位机程序发送每行的时间慢,那就会出现某些行的数据在下位机USB_SIE buffer中被冲掉,造成丢失。

 

解决办法:

       1. 延长下位机程序向其USB_SIE buffer发送数据的时间,本例中在发送完一行数据后加一个时间delay。只要delay时间可以保证,下位机程序向其USB_SIE buffer写每行的时间大于上位机轮询的时间,即可保证数据不会丢失。

       2. 更改下位机USB_SIE buffer的个数,如本例中将其更改为12,但这要根据USB芯片硬件实际情况决定,芯片支持才可。

 

总结:注意上位机HID driver buffer的个数是可以通过HidD_SetNumInputBuffers 设置的,本例中要设的大于12,如小于12也会出现丢数据现象。


在PCR Project中的buffer size部分,将上述的HID dirver buffer个数定义成常量HIDBUFSIZE 65,将ReadFile()和WriteFile()函数调用的buffer size定义成常量HIDREPORTNUM 130

你可能感兴趣的:(VC++,使用心得,VC++,项目经验总结,USB,VC++,常用类,方法,函数,关键字)