logo资料库

基于MFC编写的读写USB_HID设备数据程序(供参考学习).doc

第1页 / 共12页
第2页 / 共12页
第3页 / 共12页
第4页 / 共12页
第5页 / 共12页
第6页 / 共12页
第7页 / 共12页
第8页 / 共12页
资料共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_DATA 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_DATA 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_DATA 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;im_ctllHIDdevices.GetCount();i++) { p->m_ctllHIDdevices.GetText(i,temp); DevicePath=temp; //CreateFile 是非常重要的一步,用来建立于 HID 通信的句柄 HANDLE hCom = CreateFile ( DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if (hCom == INVALID_HANDLE_VALUE) {
//AfxMessageBox("Invalide Device Path..."); continue; } devAttr.Size=sizeof(HIDD_ATTRIBUTES); if (!HidD_GetAttributes(hCom,&devAttr)) { CloseHandle(hCom); AfxMessageBox("Cannot get the parameters of the HID..."); return 0; } //temp.Format("Vendor //Compare with the Vendor ID and Product ID from Nakamura-san //AfxMessageBox(temp); ID: %d, Product ID:%d",devAttr.VendorID,devAttr.ProductID); if (!HidD_GetPreparsedData(hCom,&PreparsedData)) { CloseHandle(hCom); AfxMessageBox("Cannot get the Preparsed Data..."); return 0; } if(!HidP_GetCaps(PreparsedData,&Capabilities)) { CloseHandle(hCom); AfxMessageBox("Cannot get the Cap Data..."); return 0; } if (devAttr.VendorID == venderID && devAttr.ProductID == productID) { while(1) {
ReadFile(hCom, = result1 &numBytesReturned, 0); temp=inbuffer; &inbuffer[0], Capabilities.InputReportByteLength, //p->m_eDataRead=CString(inbuffer); //p->UpdateData(false); if(!result1) { AfxMessageBox("Cannot Read Data..."); return 0; } readValue=inbuffer[1]; p->m_eDataRead.Format("%d",readValue); //下面是我把数据从 10 进制转换成二进制,并且点亮 LED (一个字节有 8 个 bits,可以点亮 8 个 LED for (int k=0;k<8;k++) { flag=readValue%2; readValue=readValue/2; if (k==0) { if (flag==0) p->m_sDynLED0.SwitchOff(); else p->m_sDynLED0.SwitchOn(); } else if (k==1) { if (flag==0) p->m_sDynLED1.SwitchOff(); else p->m_sDynLED1.SwitchOn(); }
else if (k==2) { if (flag==0) p->m_sDynLED2.SwitchOff(); else p->m_sDynLED2.SwitchOn(); } else if (k==3) { if (flag==0) p->m_sDynLED3.SwitchOff(); else p->m_sDynLED3.SwitchOn(); } else if (k==4) { if (flag==0) p->m_sDynLED4.SwitchOff(); else p->m_sDynLED4.SwitchOn(); } else if (k==5) { if (flag==0) p->m_sDynLED5.SwitchOff(); else p->m_sDynLED5.SwitchOn(); } else if (k==6) { if (flag==0) p->m_sDynLED6.SwitchOff(); else
分享到:
收藏