HID设备异步读取失败的问题

mydrink   2010-1-21 14:45 楼主
    小弟在写一个HID设备识别读取的小程序,目前基本功能都已经实现,能够枚举扫描,通过VID和PID匹配识别设备.然后进行到读取数据这里的时候出了问题,请教下各位,帮我分析下看问题可能出在哪。
  1. int CMyUsb2::Read(unsigned char *pBuf,int nLen)
  2. {
  3.         if (hHandle == NULL || hHandle == (HANDLE)-1)return 0;
  4.         DWORD sult = 0;
  5.         OVERLAPPED olSult;
  6.         memset(&olSult,0,sizeof(OVERLAPPED));
  7.         olSult.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
  8.         if (FALSE == ::ReadFile(hHandle,pBuf,nLen,&sult,&olSult))
  9.         {
  10.                 CHAR szBuf[80];
  11.                 DWORD dw = GetLastError();
  12.                 if(ERROR_IO_PENDING == dw)
  13.                 {
  14.           OutputDebugString("\r\n等待操作完成...");
  15.                 }               
  16.                 sprintf(szBuf, "ReadFile failed: GetLastError returned %u\n", dw);
  17.                 OutputDebugString(szBuf);
  18.         }
  19.         if (::WaitForSingleObject(olSult.hEvent,3000)==WAIT_TIMEOUT)
  20.         {
  21.           OutputDebugString("\r\n读取数据超时...");
  22.                 ::CancelIo(hHandle);
  23.         }
  24.         else
  25.         {
  26.                 ::GetOverlappedResult(hHandle,&olSult,&sult,TRUE);
  27.         }
  28.         CloseHandle(olSult.hEvent);
  29.         return sult;
  30. }


    现在HID设备是定时10ms给我传递三个数字00 07 00,但是我执行readfile函数之后得到的返回值总是0,hHandle我跟踪过来是正确的,与我前面CreateFile之后通过VID和PID匹配的HID设备句柄一致,所以不知道是我程序写的不对还是硬件设备没设置好..
    GetLasrError()得到结果为ERROR_IO_PENDING,值为997,我查了下是I/O操作重叠问题,,这样的情况要怎么处理呢.并且我在CreateFile()时使用了FILE_FLAG_OVERLAPPED,设置成异步读取,这样再WaitForSingleObject(olSult.hEvent,100) 应该没有错才对啊.不解.望高手指点.
   

回复评论 (9)

好东西,帮顶下。

MARK.学习学习!
点赞  2010-1-21 15:14
忘记传HID设备的报告描述符了.
const hid_report_descriptor code HIDREPORTDESC =
{
0x06, 0xA0,0xFF,//用法页(FFA0h, vendor defined)
0x09, 0x01,  //用法(vendor defined)
0xa1, 0x01,//集合(Application)
0x09, 0x02,//用法(vendor defined)
0xA1, 0x00,//集合(Physical)
0x06, 0xA1,0xFF,//用法页(vendor defined)
      //输入报告
0x09, 0x03 ,//用法(vendor defined)
0x09, 0x04,//用法(vendor defined)
0x15, 0x0,//逻辑最小值(0x80 or -128)
0x25, 0xfF,//逻辑最大值(0x7F or 127)
0x35, 0x00,//物理最小值(0)
0x45,0xFF,//物理最大值(255)
0x75, 0x08,//报告长度Report size (8位)
0x95, 0x20,//报告数值(32 fields)
0x81, 0x02,//输入(data, variable, absolute)
      //输出报告
0x09, 0x05,//用法(vendor defined)
0x09, 0x06,//用法(vendor defined)
0x15, 0x00,//逻辑最小值(0x80 or -128)
0x25, 0xfF,//逻辑最大值(0x7F or 127)
0x35, 0x00,//物理最小值(0)
0x45,0xFF,//物理最大值(255)
0x75,0x08,//报告长度(8位)
0x95, 0x08,//报告数值(32 fields)
0x91, 0x02,//输出(data, variable, absolute)
0xC0,//集合结束(Physical)
0xC0//集合结束(Application)
};
点赞  2010-1-21 15:39
设备那边有给你传需要的数据吗?
通过BUS HOUND追踪一下。
点赞  2010-1-21 15:44
有的,是我用来测试的数据,每10ms发送一次 00 07 00 就这3个.然后我在应用层里面ReadFile()读取.GetLastError()返回ERROR_IO_PENDING ,WaitForSingleObject()返回超时.
点赞  2010-1-21 16:01
BUS HOUND可以监控到.
点赞  2010-1-21 16:03
对HID的readfile机制不了解,只用过直接向endpoint读写数据的
点赞  2010-1-21 16:37
Veabol:对HID的readfile机制不了解,只用过直接向endpoint读写数据的

有相关的文档可供参考阅读下吗?给个连接或者之类的话就更好了,非常感谢.
点赞  2010-1-21 17:13
沉了?没有哪位高手指点下吗
点赞  2010-1-22 14:00
引用: 引用 7 楼 piaopiaohu123 的回复:
Veabol:对HID的readfile机制不了解,只用过直接向endpoint读写数据的

有相关的文档可供参考阅读下吗?给个连接或者之类的话就更好了,非常感谢.

老早以前接触的了,你搜索一下吧,应该会有的
点赞  2010-1-22 14:16
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复