USB设备读取的相关问题

读取USB设备失败可能的原因:

1.GUID不对,使用HidD_GetHidGuid获取HID的GUID。

2.参数索引没有赋值。

3.SP_INTERFACE_DEVICE_DATA变量没有初始化

4.PSP_INTERFACE_DEVICE_DETAIL_DATA 变量没有初始化。

下面是完整的打开设备代码:

 

代码
 1  BOOL OpenDevice(HANDLE &  handle, WORD wVID, WORD wPID)
 2  {
 3      BOOL bRet  =   false ;
 4      ::GUID hidGuid;
 5      ::HDEVINFO hardwareDeviceInfo;
 6      ::SP_INTERFACE_DEVICE_DATA deviceInfoData;
 7      ::PSP_INTERFACE_DEVICE_DETAIL_DATA functionClassDeviceData  =  NULL;
 8      ::ULONG predictedLength  =   0 ;
 9      ::ULONG requiredLength  =   0 ;
10 
11      handle  =  INVALID_HANDLE_VALUE;
12 
13      deviceInfoData.cbSize  =   sizeof (SP_INTERFACE_DEVICE_DATA);
14      ::HidD_GetHidGuid( & hidGuid);
15      hardwareDeviceInfo  =  ::SetupDiGetClassDevs( & hidGuid,NULL,NULL,(DIGCF_PRESENT  |  DIGCF_DEVICEINTERFACE));
16 
17       if (hardwareDeviceInfo  ==  INVALID_HANDLE_VALUE) 
18      { 
19           // Insert error handling here. 
20           return     0
21      }
22 
23       // 枚举当前USB设备,与VID,PID对比找到当前设备
24       for ( int  i = 0 ;i < 128 ;i ++ )
25      {
26           if  ( ! SetupDiEnumDeviceInterfaces(hardwareDeviceInfo,  0 & hidGuid, i,  & deviceInfoData)) 
27               continue ;
28 
29          SetupDiGetDeviceInterfaceDetail(hardwareDeviceInfo,  & deviceInfoData, NULL,  0 & requiredLength, NULL);
30          predictedLength  =  requiredLength;
31          functionClassDeviceData  =  (PSP_INTERFACE_DEVICE_DETAIL_DATA)malloc(predictedLength);
32 
33           if  ( ! functionClassDeviceData) 
34               continue ;
35          functionClassDeviceData -> cbSize  =   sizeof (SP_INTERFACE_DEVICE_DETAIL_DATA);
36           if  ( ! SetupDiGetDeviceInterfaceDetail (hardwareDeviceInfo,  & deviceInfoData, functionClassDeviceData, predictedLength,  & requiredLength, NULL)) 
37               break ;
38 
39          handle  =  CreateFile(functionClassDeviceData -> DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,  0 , NULL);
40 
41           if  (handle  !=  INVALID_HANDLE_VALUE)
42          {
43              HIDD_ATTRIBUTES attri;
44              HidD_GetAttributes(handle,  & attri);
45              
46               if  ((attri.VendorID  ==  wVID)  &&  (attri.ProductID  ==  wPID))
47              {
48                  AfxMessageBox(_T( " Find " ));
49                  bRet  =  TRUE;
50                   break ;
51              }
52          }
53      }
54      SetupDiDestroyDeviceInfoList(hardwareDeviceInfo);
55       return  bRet;
56  }

转载于:https://www.cnblogs.com/lzjsky/archive/2010/11/19/1881487.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值