小弟在写一个HID设备识别读取的小程序,目前基本功能都已经实现,能够枚举扫描,通过VID和PID匹配识别设备.然后进行到读取数据这里的时候出了问题,请教下各位,帮我分析下看问题可能出在哪。
- int CMyUsb2::Read(unsigned char *pBuf,int nLen)
- {
- if (hHandle == NULL || hHandle == (HANDLE)-1)return 0;
- DWORD sult = 0;
- OVERLAPPED olSult;
- memset(&olSult,0,sizeof(OVERLAPPED));
- olSult.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
- if (FALSE == ::ReadFile(hHandle,pBuf,nLen,&sult,&olSult))
- {
- CHAR szBuf[80];
- DWORD dw = GetLastError();
- if(ERROR_IO_PENDING == dw)
- {
- OutputDebugString("\r\n等待操作完成...");
- }
- sprintf(szBuf, "ReadFile failed: GetLastError returned %u\n", dw);
- OutputDebugString(szBuf);
- }
- if (::WaitForSingleObject(olSult.hEvent,3000)==WAIT_TIMEOUT)
- {
- OutputDebugString("\r\n读取数据超时...");
- ::CancelIo(hHandle);
- }
- else
- {
- ::GetOverlappedResult(hHandle,&olSult,&sult,TRUE);
- }
- CloseHandle(olSult.hEvent);
- return sult;
- }
现在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) 应该没有错才对啊.不解.望高手指点.
忘记传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)
};
设备那边有给你传需要的数据吗?
通过BUS HOUND追踪一下。
有的,是我用来测试的数据,每10ms发送一次 00 07 00 就这3个.然后我在应用层里面ReadFile()读取.GetLastError()返回ERROR_IO_PENDING ,WaitForSingleObject()返回超时.
对HID的readfile机制不了解,只用过直接向endpoint读写数据的
Veabol:对HID的readfile机制不了解,只用过直接向endpoint读写数据的
有相关的文档可供参考阅读下吗?给个连接或者之类的话就更好了,非常感谢.