C++MFC界面读写USBHID设备数据程

上传人:汽*** 文档编号:569392380 上传时间:2024-07-29 格式:PDF 页数:12 大小:66.45KB
返回 下载 相关 举报
C++MFC界面读写USBHID设备数据程_第1页
第1页 / 共12页
C++MFC界面读写USBHID设备数据程_第2页
第2页 / 共12页
C++MFC界面读写USBHID设备数据程_第3页
第3页 / 共12页
C++MFC界面读写USBHID设备数据程_第4页
第4页 / 共12页
C++MFC界面读写USBHID设备数据程_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《C++MFC界面读写USBHID设备数据程》由会员分享,可在线阅读,更多相关《C++MFC界面读写USBHID设备数据程(12页珍藏版)》请在金锄头文库上搜索。

1、第一步:列举所有的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_D

2、A 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

3、, 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_

4、DEVINFO_DATA DeviceInfoData, OPTIONAL &deviceId, Count, &DeviceInterfaceData ); / 获得设备详细数据(初步)SetupDiGetDeviceInterfaceDetail(handle, &DeviceInterfaceData, NULL, 0, &strSize, NULL); requiredSize=strSize; DeviceInterfaceDetailData=(PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(requiredSize); DeviceInterfac

5、eDetailData-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;

6、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(&d

7、eviceId); /第二步:获取设备信息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_DEVIC

8、E_INTERFACE_DATA); result1 = SetupDiEnumDeviceInterfaces( handle, NULL, / IN PSP_DEVINFO_DATA DeviceInfoData, OPTIONAL &deviceId, Count, &DeviceInterfaceData ); /获得设备详细数据(初步)SetupDiGetDeviceInterfaceDetail(handle, &DeviceInterfaceData, NULL, 0, &strSize, NULL); requiredSize=strSize; DeviceInterfaceD

9、etailData=(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

10、, &requiredSize, &DeviceInfoData); /获得设备路径(最重要的部分)temp=DeviceInterfaceDetailData-DevicePath; UpdateData(FALSE); m_ctllHIDdevices.AddString(temp); Count+; while (result1); UpdateData(false);izeof(SP_DEVINFO_DATA); / 再次获得详细数据result2=SetupDiGetDeviceInterfaceDetail(handle, &DeviceInterfaceData, DeviceI

11、nterfaceDetailData, strSize, &requiredSize, &DeviceInfoData); / 获得设备路径(最重要的部分)temp=DeviceInterfaceDetailData-DevicePath; UpdateData(FALSE); m_ctllHIDdevices.AddString(temp); Count+; while (result1); UpdateData(false); 第二步:循环读取HID 设备数据(根据用户提供的HID 的 vendorID 和 productID) ,并且把字节解码成二进制,在MFC 界面上用LED 展示:为

12、了不影响主线程的运行,我把读取数据的操作,放在一个子线程里!每隔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-

13、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_DEV

14、ICE_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 inbuffer2; / 用来存放读取的数据,请在这里定义你自己需要的长度,我每次读一个字

15、节进来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;

16、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)

17、; if (hCom = INV ALID_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 ID: %d, Product ID:%d,devAttr.Vendo

18、rID,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 Data.); return 0; if(!HidP_GetCaps(PreparsedData,&Capabilities) CloseHandle(hCom); AfxM

19、essageBox(Cannot get the Cap Data.); return 0; if (devAttr.VendorID = venderID & devAttr.ProductID = productID) while(1) result1 = ReadFile(hCom, &inbuffer0, Capabilities.InputReportByteLength, &numBytesReturned, 0); temp=inbuffer; /p-m_eDataRead=CString(inbuffer); /p-UpdateData(false); if(!result1)

20、 AfxMessageBox(Cannot Read Data.); return 0; readValue=inbuffer1; p-m_eDataRead.Format(%d,readValue); / 下面是我把数据从10 进制转换成二进制, 并且点亮LED (一个字节有8 个 bits, 可以点亮8个 LED for (int k=0;km_sDynLED0.SwitchOff(); else p-m_sDynLED0.SwitchOn(); else if (k=1) if (flag=0) p-m_sDynLED1.SwitchOff(); else p-m_sDynLED1.Sw

21、itchOn(); 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.Switc

22、hOff(); else p-m_sDynLED5.SwitchOn(); else if (k=6) if (flag=0) p-m_sDynLED6.SwitchOff(); else p-m_sDynLED6.SwitchOn(); else if (k=7) if (flag=0) p-m_sDynLED7.SwitchOff(); else p-m_sDynLED7.SwitchOn(); p-UpdateData(false); :Sleep(50); / 判断用户是否点击停止按钮,若是,则退出if(p-bStopHID) AfxMessageBox(stopped.); retu

23、rn 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 found DWORD strSize=0,requiredSi

24、ze=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 vender

25、ID=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_eByte2*4+m_e

26、Byte3*8+m_eByte4*16+m_eByte5*32+m_eByte6*64+m_eByte7*128; v_eDataToWrite=inbuffer1; UpdateData(false); /2 HDEVINFO handle; handle = SetupDiGetClassDevs(&deviceId, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT); /Get only HID devices int 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;

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号