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协议来的