您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 数据通信与网络 > C++ MFC界面读写USB HID设备数据程序
第一步:列举所有的HID设备:m_ctllHIDdevices.ResetContent();//这是MFC里面一个list控件,用来显示所有的HID设备的,如果你没有界面,可以不需要此行UpdateData(FALSE);//更新界面CStringtemp;intCount=0;//TotalnumberofdevicesfoundDWORDstrSize=0,requiredSize=0;BOOLresult1,result2;ULONGDeviceInterfaceDetailDataSize;//定义一些变量,以后会用到SP_DEVINFO_DATADeviceInfoData;SP_DEVICE_INTERFACE_DATADeviceInterfaceData;PSP_DEVICE_INTERFACE_DETAIL_DATADeviceInterfaceDetailData;//PSP_DEVICE_INTERFACE_DETAIL_DATAtest;//第一步:获取deviceIDGUIDdeviceId;HidD_GetHidGuid(&deviceId);//第二步:获取设备信息HDEVINFOhandle;handle=SetupDiGetClassDevs(&deviceId,NULL,NULL,DIGCF_DEVICEINTERFACE|DIGCF_PRESENT);//GetonlyHIDdevices//第三步:对所有的设备进行枚举//SetupDiEnumDeviceInterfaces();result1=false;//定义一些变量result2=false;CStringtemp11=;do{DeviceInterfaceData.cbSize=sizeof(SP_DEVICE_INTERFACE_DATA);result1=SetupDiEnumDeviceInterfaces(handle,NULL,//INPSP_DEVINFO_DATADeviceInfoData,OPTIONAL&deviceId,Count,&DeviceInterfaceData);//获得设备详细数据(初步)SetupDiGetDeviceInterfaceDetail(handle,&DeviceInterfaceData,NULL,0,&strSize,NULL);requiredSize=strSize;DeviceInterfaceDetailData=(PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(requiredSize);DeviceInterfaceDetailData-cbSize=sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);DeviceInfoData.cbSize=s第一步:列举所有的HID设备:m_ctllHIDdevices.ResetContent();//这是MFC里面一个list控件,用来显示所有的HID设备的,如果你没有界面,可以不需要此行UpdateData(FALSE);//更新界面CStringtemp;intCount=0;//TotalnumberofdevicesfoundDWORDstrSize=0,requiredSize=0;BOOLresult1,result2;ULONGDeviceInterfaceDetailDataSize;//定义一些变量,以后会用到SP_DEVINFO_DATADeviceInfoData;SP_DEVICE_INTERFACE_DATADeviceInterfaceData;PSP_DEVICE_INTERFACE_DETAIL_DATADeviceInterfaceDetailData;//PSP_DEVICE_INTERFACE_DETAIL_DATAtest;//第一步:获取deviceIDGUIDdeviceId;HidD_GetHidGuid(&deviceId);//第二步:获取设备信息HDEVINFOhandle;handle=SetupDiGetClassDevs(&deviceId,NULL,NULL,DIGCF_DEVICEINTERFACE|DIGCF_PRESENT);//GetonlyHIDdevices//第三步:对所有的设备进行枚举//SetupDiEnumDeviceInterfaces();result1=false;//定义一些变量result2=false;CStringtemp11=;do{DeviceInterfaceData.cbSize=sizeof(SP_DEVICE_INTERFACE_DATA);result1=SetupDiEnumDeviceInterfaces(handle,NULL,//INPSP_DEVINFO_DATADeviceInfoData,OPTIONAL&deviceId,Count,&DeviceInterfaceData);//获得设备详细数据(初步)SetupDiGetDeviceInterfaceDetail(handle,&DeviceInterfaceData,NULL,0,&strSize,NULL);requiredSize=strSize;DeviceInterfaceDetailData=(PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(requiredSize);DeviceInterfaceDetailData-cbSize=sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);DeviceInfoData.cbSize=sizeof(SP_DEVINFO_DATA);//再次获得详细数据result2=SetupDiGetDeviceInterfaceDetail(handle,&DeviceInterfaceData,DeviceInterfaceDetailData,strSize,&requiredSize,&DeviceInfoData);//获得设备路径(最重要的部分)temp=DeviceInterfaceDetailData-DevicePath;UpdateData(FALSE);m_ctllHIDdevices.AddString(temp);Count++;}while(result1);UpdateData(false);izeof(SP_DEVINFO_DATA);//再次获得详细数据result2=SetupDiGetDeviceInterfaceDetail(handle,&DeviceInterfaceData,DeviceInterfaceDetailData,strSize,&requiredSize,&DeviceInfoData);//获得设备路径(最重要的部分)temp=DeviceInterfaceDetailData-DevicePath;UpdateData(FALSE);m_ctllHIDdevices.AddString(temp);Count++;}while(result1);UpdateData(false);第二步:循环读取HID设备数据(根据用户提供的HID的vendorID和productID),并且把字节解码成二进制,在MFC界面上用LED展示:为了不影响主线程的运行,我把读取数据的操作,放在一个子线程里!每隔50ms去读取一次数据!首先创建一个线程:HANDLEhThread1;bStopHID=false;//这个变量,以后用来停止线程UpdateData(true);//更新界面,获取变量UpdateData(false);hThread1=CreateThread(NULL,0,Thread_Enable_Read,(LPVOID)this,NULL,NULL);在线程的程序里:CusbhidDlg*p=(CusbhidDlg*)pvParam;//获取主窗口的指针,用来调用主窗口的变量和函数p-UpdateData(true);p-bStopHID=false;CStringtemp;CStringDevicePath;temp=;intCount=0;//TotalnumberofdevicesfoundDWORDstrSize=0,requiredSize=0;BOOLresult1,result2;ULONGDeviceInterfaceDetailDataSize;SP_DEVINFO_DATADeviceInfoData;SP_DEVICE_INTERFACE_DATADeviceInterfaceData;PSP_DEVICE_INTERFACE_DETAIL_DATADeviceInterfaceDetailData;//PSP_DEVICE_INTERFACE_DETAIL_DATAtest;//1GUIDdeviceId;HidD_GetHidGuid(&deviceId);intvenderID=p-v_eVendorID;//从窗口里获取用户输入的VendorIDintproductID=p-v_eProductID;//从窗口里获取用户输入的ProductIDunsignedcharinbuffer[2];//用来存放读取的数据,请在这里定义你自己需要的长度,我每次读一个字节进来unsignedlongnumBytesReturned;HIDD_ATTRIBUTESdevAttr;PHIDP_PREPARSED_DATAPreparsedData;HIDP_CAPSCapabilities;intreadValue;boolLED;intflag=0;//2HDEVINFOhandle;handle=SetupDiGetClassDevs(&deviceId,NULL,NULL,DIGCF_DEVICEINTERFACE|DIGCF_PRESENT);//GetonlyHIDdevicesinti=0;intj=p-m_ctllHIDdevices.GetCount();for(i=0;ip-m_ctllHIDdevices.GetCount();i++){p-m_ctllHIDdevices.GetText(i,temp);DevicePath=temp;//CreateFile是非常重要的一步,用来建立于HID通信的句柄HANDLEhCom=CreateFile(DevicePath,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);if(hCom==INVALID_HANDLE_VALUE){//AfxMessageBox(InvalideDevicePath...);continue;}devAttr.Size=sizeof(HIDD_ATTRIBUTES);if(!HidD_GetAttributes(hCom,&devAttr)){CloseHandle(hCom);AfxMessageBox(CannotgettheparametersoftheHID...);return0;}//temp.Format(VendorID:%d,ProductID:%d,devAttr.VendorID,devAttr.ProductID);//ComparewiththeVendorIDandProductIDfromNakamura-san//AfxMessageBox(temp);if(!HidD_GetPreparsedData(hCom,&PreparsedData)){CloseHandle(hCom);AfxMessageBox(C
本文标题:C++ MFC界面读写USB HID设备数据程序
链接地址:https://www.777doc.com/doc-7023286 .html