《CMFC界面读写USBHID设备数据程序.doc》由会员分享,可在线阅读,更多相关《CMFC界面读写USBHID设备数据程序.doc(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、,第一步:列举所有的HID设备:m_ctllHIDdevices.ResetContent(); /这是MFC里面一个list控件,用来显示所有的HID设备的,如果你没有界面,可以不需要此行UpdateData(FALSE); /更新界面CString temp;int Count = 0; /Total number of devices foundDWORD strSize=0,requiredSize=0;BOOL result1,result2;ULONG DeviceInterfaceDetailDataSize;/定义一些变量,以后会用到SP_DEVINFO_DATA Device
2、InfoData;SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;PSP_DEVICE_INTERFACE_DETAIL_DATA DeviceInterfaceDetailData;/PSP_DEVICE_INTERFACE_DETAIL_DATA test;/第一步:获取deviceIDGUID deviceId;HidD_GetHidGuid(&deviceId);/第二步:获取设备信息HDEVINFO handle;handle = SetupDiGetClassDevs(&deviceId, NULL, NULL, DIGCF_DEVICEI
3、NTERFACE | DIGCF_PRESENT); /Get only HID devices/第三步:对所有的设备进行枚举/SetupDiEnumDeviceInterfaces();result1=false; /定义一些变量result2=false;CString temp11=;doDeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);result1 = SetupDiEnumDeviceInterfaces(handle,NULL, / IN PSP_DEVINFO_DATA DeviceInfoData, O
4、PTIONAL&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_INTERFAC
5、E_DETAIL_DATA);DeviceInfoData.cbSize=s第一步:列举所有的HID设备:m_ctllHIDdevices.ResetContent(); /这是MFC里面一个list控件,用来显示所有的HID设备的,如果你没有界面,可以不需要此行UpdateData(FALSE); /更新界面CString temp;int Count = 0; /Total number of devices foundDWORD strSize=0,requiredSize=0;BOOL result1,result2;ULONG DeviceInterfaceDetailDataSiz
6、e;/定义一些变量,以后会用到SP_DEVINFO_DATA DeviceInfoData;SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;PSP_DEVICE_INTERFACE_DETAIL_DATA DeviceInterfaceDetailData;/PSP_DEVICE_INTERFACE_DETAIL_DATA test;/第一步:获取deviceIDGUID deviceId;HidD_GetHidGuid(&deviceId);/第二步:获取设备信息HDEVINFO handle;handle = SetupDiGetClassDevs
7、(&deviceId, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT); /Get only HID devices/第三步:对所有的设备进行枚举/SetupDiEnumDeviceInterfaces();result1=false; /定义一些变量result2=false;CString temp11=;doDeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);result1 = SetupDiEnumDeviceInterfaces(handle,NULL, /
8、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);DeviceInterfaceDetail
9、Data-cbSize=sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);DeviceInfoData.cbSize=sizeof(SP_DEVINFO_DATA);/再次获得详细数据result2=SetupDiGetDeviceInterfaceDetail(handle,&DeviceInterfaceData,DeviceInterfaceDetailData,strSize,&requiredSize,&DeviceInfoData);/获得设备路径(最重要的部分)temp=DeviceInterfaceDetailData-DevicePath;Upd
10、ateData(FALSE);m_ctllHIDdevices.AddString(temp);Count+; while (result1);UpdateData(false);izeof(SP_DEVINFO_DATA);/再次获得详细数据result2=SetupDiGetDeviceInterfaceDetail(handle,&DeviceInterfaceData,DeviceInterfaceDetailData,strSize,&requiredSize,&DeviceInfoData);/获得设备路径(最重要的部分)temp=DeviceInterfaceDetailData
11、-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); /更新界
12、面,获取变量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 foundDWORD strS
13、ize=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;/1GUID deviceId;HidD_GetHidGuid(&deviceId);int v
14、enderID=p-v_eVendorID; /从窗口里获取用户输入的VendorID int productID=p-v_eProductID;/从窗口里获取用户输入的ProductIDunsigned char inbuffer2; /用来存放读取的数据,请在这里定义你自己需要的长度,我每次读一个字节进来unsigned long numBytesReturned;HIDD_ATTRIBUTES devAttr;PHIDP_PREPARSED_DATA PreparsedData;HIDP_CAPS Capabilities;int readValue;bool LED;int flag=
15、0;/2HDEVINFO handle;handle = SetupDiGetClassDevs(&deviceId, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT); /Get only HID devicesint 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通信的
16、句柄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(hCo
17、m);AfxMessageBox(Cannot get the parameters of the HID.);return 0;/temp.Format(Vendor ID: %d, Product ID:%d,devAttr.VendorID,devAttr.ProductID); /Compare with the Vendor ID and Product ID from Nakamura-san/AfxMessageBox(temp);if (!HidD_GetPreparsedData(hCom,&PreparsedData)CloseHandle(hCom);AfxMessage
18、Box(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)result1 = ReadFile(hCom, &inbuffer0, Capabilities.InputReportByteLength
19、, &numBytesReturned, 0);temp=inbuffer;/p-m_eDataRead=CString(inbuffer);/p-UpdateData(false);if(!result1)AfxMessageBox(Cannot Read Data.);return 0;readValue=inbuffer1;p-m_eDataRead.Format(%d,readValue);/下面是我把数据从10进制转换成二进制,并且点亮LED (一个字节有8个bits,可以点亮8个LEDfor (int k=0;km_sDynLED0.SwitchOff();elsep-m_sDyn
20、LED0.SwitchOn();else if (k=1)if (flag=0)p-m_sDynLED1.SwitchOff();elsep-m_sDynLED1.SwitchOn();else if (k=2)if (flag=0)p-m_sDynLED2.SwitchOff();elsep-m_sDynLED2.SwitchOn();else if (k=3)if (flag=0)p-m_sDynLED3.SwitchOff();elsep-m_sDynLED3.SwitchOn();else if (k=4)if (flag=0)p-m_sDynLED4.SwitchOff();else
21、p-m_sDynLED4.SwitchOn();else if (k=5)if (flag=0)p-m_sDynLED5.SwitchOff();elsep-m_sDynLED5.SwitchOn();else if (k=6)if (flag=0)p-m_sDynLED6.SwitchOff();elsep-m_sDynLED6.SwitchOn();else if (k=7)if (flag=0)p-m_sDynLED7.SwitchOff();elsep-m_sDynLED7.SwitchOn();p-UpdateData(false);:Sleep(50);/判断用户是否点击停止按钮,
22、若是,则退出if(p-bStopHID)AfxMessageBox(stopped.);return 0;if (i=j)AfxMessageBox(There is no such HID device.);return 0;第三步:向HID设备写数据(根据用户提供的HID的vendorID和productID),用户输入的是二进制数据:与读的程序一样,唯一区别就是红色那部分!UpdateData(true);bStopHID=false;CString temp;CString DevicePath;temp=;int Count = 0; /Total number of devices
23、 foundDWORD 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;/1GUID deviceId;HidD_GetHidGuid(
24、&deviceId);int venderID=v_eVendorID;int productID=v_eProductID;unsigned char inbuffer2;unsigned long numBytesReturned;HIDD_ATTRIBUTES devAttr;PHIDP_PREPARSED_DATA PreparsedData;HIDP_CAPS Capabilities;int readValue;bool LED;int flag=0;inbuffer0=0; /把界面里的二进制转换成10进制inbuffer1=m_eByte0*1+m_eByte1*2+m_eBy
25、te2*4+m_eByte3*8+m_eByte4*16+m_eByte5*32+m_eByte6*64+m_eByte7*128;v_eDataToWrite=inbuffer1;UpdateData(false);/2HDEVINFO handle;handle = SetupDiGetClassDevs(&deviceId, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT); /Get only HID devicesint i=0;int j=m_ctllHIDdevices.GetCount();for (i=0;im_eDataRead=CString(inbuffer);/p-UpdateData(false);if(!result1)AfxMessageBox(Cannot Write Data.);return;AfxMessageBox(Suncess.);break;if (i=j)AfxMessageBox(There is no such HID device.);return;