版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 介绍一种传统艺术形式
- 高中物理人教版历年真题
- 八年级上数学期中
- 高效苏教版单词记忆技巧
- 物质微观结构揭秘
- 初中英语课本内容精要
- 一年级下册语文教材解析
- 初中苏教版语文核心知识点详述与精炼
- 苏教版三年下册数学期中考试练习
- 四年级苏教版数学上册期末考卷及答案下载
- 2023年大庆市民政局系统事业单位招聘笔试题库及答案
- 代理授权书模板
- 【期末复习】概括与评析标题及角度-部编版道德与法治九年级上册
- 《社会主义核心价值观》优秀课件
- 鼻饲法和胃肠减压的护理课件
- 《诊断学》期末考试复习题库(带答案)
- 幼儿园绘本故事:《十二生肖》 课件
- 气管异物病例幻灯片课件
- 2022年浙江浙能兰溪发电有限责任公司招聘笔试题库及答案解析
- “美就在身边”作文指导课件
- 腰椎穿刺术评分标准
评论
0/150
提交评论