首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

MFC USB协议HID设备通讯

2014-02-22 
MFCUSB协议HID设备通信最近搞个USB通信,搞了一段时间,也看不USB协议,可是发现网上很多列子都是调用API函数

MFC USB协议HID设备通信
  最近搞个USB通信,搞了一段时间,也看不USB协议,可是发现网上很多列子都是调用API函数实现的,目前我也通过调用API函数来获取了USB设备的路径了,整个流程都没感觉到哪里体现了 USB协议,这是怎么回事啊? 
下面是我按照网上改的代码// 查找设备
void CUSBDlg::OnBnClickedButtonsearch()
{
 SetDlgItemText(IDC_Static_Text,_T("正在查找设备..."));
 //1.:查找本系统中HID类的GUID标识
 GUID guidHID;
 HidD_GetHidGuid(&guidHID);

 CString  str=_T("");
 str=str+_T("HID类的GUID标识\r\n");
 CString  strHid;
 strHid.Format(_T("%08x-%04x-%04x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x\r\n"),
 guidHID.Data1,guidHID.Data2,guidHID.Data3,guidHID.Data4[0],
 guidHID.Data4[1],guidHID.Data4[2],guidHID.Data4[3],guidHID.Data4[4],
 guidHID.Data4[5],guidHID.Data4[6],guidHID.Data4[7]);

str=str+strHid;
SetDlgItemText(IDC_EDIT_Hid,str);

   //2.:获取设备信息

HDEVINFO hDevInfo;
hDevInfo = SetupDiGetClassDevs(&guidHID,NULL,0,
DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);//返回设备信息集的句柄

str=str+_T("正在查找可用的USB设备...\r\n");

if(hDevInfo==INVALID_HANDLE_VALUE)
str=str+_T("无法找到设备信息集的句柄...\r\n");
SetDlgItemText(IDC_EDIT_Hid,str);


// 查找USB设备接口
SP_DEVICE_INTERFACE_DATA strtInterfaceData;
BOOL bResult=TRUE; // 取得一个该GUID相关的设备信息集句柄
int nCount=0; //设备路径个数
int bError=0;
CString  strDevPath=_T(""); //设备路径
//获得设备句柄 
HANDLE  hHandle;
// 若找到了设备,则读取设备路径名
PSP_DEVICE_INTERFACE_DETAIL_DATA pDetail;
// 申请设备接口数据空间
pDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(INTERFACE_DETAIL_SIZE);
pDetail->cbSize =  sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
while(bResult)
{
strtInterfaceData.cbSize=sizeof(SP_INTERFACE_DEVICE_DATA);
  // 枚举符合该GUID的设备接口
bResult = SetupDiEnumDeviceInterfaces(
hDevInfo,
NULL,
&guidHID,
(ULONG)nCount, //接口索引值 以0为起始位置
&strtInterfaceData
);

if(bResult==FALSE) 
break;

// 取得该设备接口的细节(设备路径)
bResult = SetupDiGetInterfaceDeviceDetail(
hDevInfo, // 设备信息集句柄
&strtInterfaceData, // 设备接口信息
pDetail, // 设备接口细节(设备路径)
INTERFACE_DETAIL_SIZE, // 输出缓冲区大小
NULL, // 不需计算输出缓冲区大小(直接用设定值)
NULL ); // 不需额外的设备描述

//如果调用失败,则查找下一个设备。
if(bResult==FALSE) 
continue;


 strDevPath=strDevPath+pDetail->DevicePath+_T("\r\n");
 strDevPath=pDetail->DevicePath;
 nCount++;

 

}

str=str+_T("查找到设备路径 \r\n")+strDevPath+_T("\r\n");

SetDlgItemText(IDC_EDIT_Hid,str);



bError=GetLastError();

SetDlgItemInt(IDC_Debug,bError,TRUE);

if (hHandle == INVALID_HANDLE_VALUE)
{
str=str+_T("无法打开通信端口");
SetupDiDestroyDeviceInfoList(hDevInfo);
return;
}
    
str=str+_T("已经打开通信端口 等待通信...\r\n");

SetDlgItemText(IDC_EDIT_Hid,str);
 
}


获取内容如下:
HID类的GUID标识
4d1e55b2-f16f-11cf-88-cb-00-11-11-00-00-30
正在查找可用的USB设备...
查找到设备路径 
\\?\hid#hidclass#1&4784345&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}
\\?\hid#vid_093a&pid_2521#7&e4362fa&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}
\\?\hid#vid_413c&pid_2105#7&22efeba9&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}

已经打开通信端口 等待通信...

请问各位高手,解析下,哪里体现了USB协议了,哪里发送过命令了? 谢谢了
[解决办法]
枚举过程就是利用USB协议啊 
HidD_GetHidGuid(&guidHID);
 
这个函数在你包含的USB库中,就是按USB协议来的

热点排行