
C++MFC界面读写USBHID设备数据程.pdf
12页第一步:列举所有的HID 设备:m_ctllHIDdevices.ResetContent(); //这是 MFC 里面一个list 控件,用来显示所有的HID 设备的,如果你没有界面,可以不需要此行UpdateData(FALSE); // 更新界面CString temp; int Count = 0; //Total number of devices found DWORD strSize=0,requiredSize=0; BOOL result1,result2; ULONG DeviceInterfaceDetailDataSize; //定义一些变量,以后会用到SP_DEVINFO_DA TA DeviceInfoData; SP_DEVICE_INTERFACE_DATA DeviceInterfaceData; PSP_DEVICE_INTERFACE_DETAIL_DATA DeviceInterfaceDetailData; //PSP_DEVICE_INTERFACE_DETAIL_DATA test; // 第一步:获取deviceID GUID deviceId; HidD_GetHidGuid(&deviceId); // 第二步:获取设备信息HDEVINFO handle; handle = SetupDiGetClassDevs(&deviceId, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT); //Get only HID devices // 第三步:对所有的设备进行枚举//SetupDiEnumDeviceInterfaces(); result1=false; //定义一些变量result2=false; CString temp11=""; do { DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); result1 = SetupDiEnumDeviceInterfaces( handle, NULL, // IN PSP_DEVINFO_DATA DeviceInfoData, 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); // 更新界面CString temp; int Count = 0; //Total number of devices found DWORD strSize=0,requiredSize=0; BOOL result1,result2; ULONG DeviceInterfaceDetailDataSize; //定义一些变量,以后会用到SP_DEVINFO_DA TA DeviceInfoData; SP_DEVICE_INTERFACE_DATA DeviceInterfaceData; PSP_DEVICE_INTERFACE_DETAIL_DATA DeviceInterfaceDetailData; //PSP_DEVICE_INTERFACE_DETAIL_DATA test; //第一步:获取deviceID GUID deviceId; HidD_GetHidGuid(&deviceId); //第二步:获取设备信息HDEVINFO handle; handle = SetupDiGetClassDevs(&deviceId, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT); //Get only HID devices //第三步:对所有的设备进行枚举//SetupDiEnumDeviceInterfaces(); result1=false; //定义一些变量result2=false; CString temp11=""; do { DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); result1 = SetupDiEnumDeviceInterfaces( handle, NULL, // IN PSP_DEVINFO_DATA DeviceInfoData, 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 去读取一次数据!首先创建一个线程:HANDLE hThread1; 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; CString temp; CString DevicePath; temp=""; int Count = 0; //Total number of devices found DWORD strSize=0,requiredSize=0; BOOL result1,result2; ULONG DeviceInterfaceDetailDataSize; SP_DEVINFO_DA TA DeviceInfoData; SP_DEVICE_INTERFACE_DATA DeviceInterfaceData; PSP_DEVICE_INTERFACE_DETAIL_DATA DeviceInterfaceDetailData; //PSP_DEVICE_INTERFACE_DETAIL_DATA test; //1 GUID deviceId; HidD_GetHidGuid(&deviceId); int venderID=p->v_eVendorID; // 从窗口里获取用户输入的VendorID int productID=p->v_eProductID;// 从窗口里获取用户输入的ProductID unsigned char inbuffer[2]; // 用来存放读取的数据,请在这里定义你自己需要的长度,我每次读一个字节进来unsigned long numBytesReturned; HIDD_ATTRIBUTES devAttr; PHIDP_PREPARSED_DATA PreparsedData; HIDP_CAPS Capabilities; int readValue; bool LED; int flag=0; //2 HDEVINFO handle; handle = SetupDiGetClassDevs(&deviceId, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT); //Get only HID devices int i=0; int j=p->m_ctllHIDdevices.GetCount(); for (i=0;i












