C++ MFC界面读写USB HID设备数据程序_第1页
C++ MFC界面读写USB HID设备数据程序_第2页
C++ MFC界面读写USB HID设备数据程序_第3页
C++ MFC界面读写USB HID设备数据程序_第4页
C++ MFC界面读写USB HID设备数据程序_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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, | ,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

17、 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);AfxMessageBox(Cannot get the Preparsed Da

18、ta.);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 = Read, &inbuffer0, Capabilities.InputReportByteLength, &numBytesReturned, 0);temp=inbuffer;/p

19、-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_sDynLED0.SwitchOn();else if (k=1)if (flag=0)

20、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();elsep-m_sDynLED4.SwitchOn();else if (k=5)if

21、(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);/判断用户是否点击停止按钮,若是,则退出if(p-bStopHID)AfxMessageBox(stoppe

22、d.);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 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(&deviceId);int venderI

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论