24   DI 01 01                     43ms     人体力学驱动
这个数据就是单片机送上来的!说明驱动应该是收到了。我就是用异步的方式,概率的问题,我有重发机制!可以解决!我就是想知道为什么会出现这种情况!问题会出在哪里!

解决方案 »

  1.   

    lfchen版主:驱动是windows自身的HID驱动,所以不知驱动是否有问题!另:ReadFile参数中的缓冲区我定义了256,实际上只读19个字节所以不满,应该可用。但windows自身的HID驱动的缓存区是否已满?或者不可用?这个如何判断!
      

  2.   

    我碰到的情况是这样的!用VC Readfile 异步方式去读取一个自定义HID设备(HID设备使用的是Windows自带的驱动 即 HID compliant device设备驱动)上传上来的数据。因为“HID compliant device设备驱动”是挂在"USB人体输入学设备驱动程序"之上,USB人体输入学设备驱动会向定时向 HID设备请求数据 收到的数据存到一个缓存区里。使用BUS HOUND抓包情况可以看到USB人体输入学设备驱动的数据:24   DI 01 01                     43ms      USB人体输入学设备驱动然后当上位机应用程序使用Readfile读取这个数据的时候,Readfile会发出一个Windows IO请求,Windows IO请求 调用 “HID compliant device设备驱动”跟“USB人体输入学设备驱动”请求数据。因为我的设备不同报告ID及数据有多个,最长的是一个对应的数据是 6位 所以使用BUS HOUND抓包情况可以看到HID compliant device设备驱动的数据:23.1 DI 01 01 00 00 00 00 00      10ms     HID compliant device驱动看似“HID compliant device设备驱动”已请求到了“USB人体输入学设备驱动”的取得的数据。但这时问题出现了!Readfile 异步读取,等时设置为6000ms ,经N次这样的读取时,偶尔会出现一次读超时(大部分时间是读是正确的)。从数据跟踪上看!BUS HOUND 已经可以看到HID compliant device设备驱动的数据。数据无论是长度还是内容也都是正确的!为什么Readfile 会在指定的时间内读不到呢!会是什么原因引起的。特别指出的是!经过测试!在Readfile前加Sleep(*)延时时间越长,这种读超时的情况出现的就越少。不加Sleep(*)延时,读超时的情况就会出现的越多。几百次正确读取后,可能就会出现一次读超时。感觉上象“USB人体输入学设备驱动”的取得HID设备的上传数据后,越慢使用Readfile调用 “HID compliant device设备驱动”跟“USB人体输入学设备驱动”请求数据(即延时时间越长),出现Readfile读超时的情况就越小。我就想高人帮我分析一下,出现这咱情况的原因及原理。特别是这种情况下设备驱动可能的是什么工作状态才引发了这种情况。
    如:
    可能是 Readfile会发出的Windows IO请求 被别的请求长时间挂起了吗?
    可能是“HID compliant device设备驱动”跟“USB人体输入学设备驱动”请求数据时,在总线传输出错了吗?
    可能是“HID compliant device设备驱动”读数据放到它自身的数据缓存中出错了吗?
    可能是“HID compliant device设备驱动”自身的数据缓存不可用吗?
    等等可能的原因。注:握手重发的机制我的程序都有!程序可以正常通讯工作!我主要是想请理解类似驱动原理的高手指点一下出现这种情况的原因及有没有办法可以提前检测这种情况。有没有明白这块驱动机制的达人细一点的讲述一下,HID compliant device设备驱动向”USB人体输入学设备“请求数据 及和Readfile交互的细节!http://bbs.csdn.net/topics/390691197