8497|9

64

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

HID设备异步读取失败的问题 [复制链接]

    小弟在写一个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) 应该没有错才对啊.不解.望高手指点.
   

最新回复

老早以前接触的了,你搜索一下吧,应该会有的  详情 回复 发表于 2010-1-22 14:16
点赞 关注

回复
举报

54

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
好东西,帮顶下。

MARK.学习学习!
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
忘记传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)
};
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

4
 
设备那边有给你传需要的数据吗?
通过BUS HOUND追踪一下。
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

5
 
有的,是我用来测试的数据,每10ms发送一次 00 07 00 就这3个.然后我在应用层里面ReadFile()读取.GetLastError()返回ERROR_IO_PENDING ,WaitForSingleObject()返回超时.
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

6
 
BUS HOUND可以监控到.
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

7
 
对HID的readfile机制不了解,只用过直接向endpoint读写数据的
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

8
 
Veabol:对HID的readfile机制不了解,只用过直接向endpoint读写数据的

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

回复

71

帖子

0

TA的资源

一粒金砂(初级)

9
 
沉了?没有哪位高手指点下吗
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

10
 
引用 7 楼 piaopiaohu123 的回复:
Veabol:对HID的readfile机制不了解,只用过直接向endpoint读写数据的

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

老早以前接触的了,你搜索一下吧,应该会有的
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
艾睿电子& Silicon Labs 有奖直播 | 全新蓝牙信道探测:从技术创新到实际应用
直播时间:3月12日(周三)上午10:00
直播奖励:多功能榨汁机、蓝牙音箱、手机支架

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表