电子商务网站建设方案设计报告,可以制作app的软件,网站开发课程,优化设计答案五年级下册发一个简单易用的界面#xff0c;用来对USB HID设备#xff08;比如说游戏手柄#xff0c;控制面板等#xff09;读写数据#xff0c;一般情况下面板上有一些LED#xff0c;可以帮助我们测试读写是否正确。另外#xff0c;需要可以修改vendorID和prodcutID,这样一个界面… 发一个简单易用的界面用来对USB HID设备比如说游戏手柄控制面板等读写数据一般情况下面板上有一些LED可以帮助我们测试读写是否正确。另外需要可以修改vendorID和prodcutID,这样一个界面可以用于测试多个HID设备。过程分成3步1: 列举出所有的HID设备2: 循环读取HID设备数据3: 向HID设备写数据下面我把三部分的程序单独分开方便大家学习在讲具体程序之前先说一下visual studio的环境配置我用的是2008版本下面程序需要包含DDK一部分头文件和库文件 第一步列举所有的HID设备m_ctllHIDdevices.ResetContent(); //这是MFC里面一个list控件用来显示所有的HID设备的如果你没有界面可以不需要此行UpdateData(FALSE); //更新界面CString temp;int Count 0; //Total number of devices foundDWORD strSize0,requiredSize0;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;//第一步获取deviceIDGUID deviceId;HidD_GetHidGuid(deviceId);//第二步获取设备信息HDEVINFO handle;handle SetupDiGetClassDevs(deviceId, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT); //Get only HID devices//第三步对所有的设备进行枚举//SetupDiEnumDeviceInterfaces();result1false; //定义一些变量result2false;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); requiredSizestrSize; DeviceInterfaceDetailData(PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(requiredSize); DeviceInterfaceDetailData-cbSizesizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); DeviceInfoData.cbSizesizeof(SP_DEVINFO_DATA); //再次获得详细数据 result2SetupDiGetDeviceInterfaceDetail(handle, DeviceInterfaceData, DeviceInterfaceDetailData, strSize, requiredSize, DeviceInfoData); //获得设备路径最重要的部分 tempDeviceInterfaceDetailData-DevicePath; UpdateData(FALSE); m_ctllHIDdevices.AddString(temp); Count; } while (result1); UpdateData(false);到这个时候为止所有的设备路径都会显示在窗口的listbox里面 第二步循环读取HID设备数据根据用户提供的HID的vendorID和productID)并且把字节解码成二进制在MFC界面上用LED展示为了不影响主线程的运行我把读取数据的操作放在一个子线程里每隔50ms去读取一次数据首先创建一个线程 HANDLE hThread1; bStopHIDfalse; //这个变量以后用来停止线程 UpdateData(true); //更新界面获取变量 UpdateData(false); hThread1 CreateThread(NULL,0,Thread_Enable_Read,(LPVOID)this, NULL, NULL);在线程的程序里 CusbhidDlg *p ( CusbhidDlg *)pvParam; //获取主窗口的指针用来调用主窗口的变量和函数 p-UpdateData(true); p-bStopHIDfalse; CString temp; CString DevicePath; temp; int Count 0; //Total number of devices found DWORD strSize0,requiredSize0; 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 venderIDp-v_eVendorID; //从窗口里获取用户输入的VendorID int productIDp-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 flag0; //2 HDEVINFO handle; handle SetupDiGetClassDevs(deviceId, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT); //Get only HID devices int i0; int jp-m_ctllHIDdevices.GetCount(); for (i0;ip-m_ctllHIDdevices.GetCount();i) { p-m_ctllHIDdevices.GetText(i,temp); DevicePathtemp; //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.Sizesizeof(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.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 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, inbuffer[0], Capabilities.InputReportByteLength, numBytesReturned, 0); tempinbuffer; //p-m_eDataReadCString(inbuffer); //p-UpdateData(false); if(!result1) { AfxMessageBox(Cannot Read Data...); return 0; } readValueinbuffer[1]; p-m_eDataRead.Format(%d,readValue); //下面是我把数据从10进制转换成二进制并且点亮LED (一个字节有8个bits,可以点亮8个LED for (int k0;k8;k) { flagreadValue%2; readValuereadValue/2; if (k0) { if (flag0) p-m_sDynLED0.SwitchOff(); else p-m_sDynLED0.SwitchOn(); } else if (k1) { if (flag0) p-m_sDynLED1.SwitchOff(); else p-m_sDynLED1.SwitchOn(); } else if (k2) { if (flag0) p-m_sDynLED2.SwitchOff(); else p-m_sDynLED2.SwitchOn(); } else if (k3) { if (flag0) p-m_sDynLED3.SwitchOff(); else p-m_sDynLED3.SwitchOn(); } else if (k4) { if (flag0) p-m_sDynLED4.SwitchOff(); else p-m_sDynLED4.SwitchOn(); } else if (k5) { if (flag0) p-m_sDynLED5.SwitchOff(); else p-m_sDynLED5.SwitchOn(); } else if (k6) { if (flag0) p-m_sDynLED6.SwitchOff(); else p-m_sDynLED6.SwitchOn(); } else if (k7) { if (flag0) p-m_sDynLED7.SwitchOff(); else p-m_sDynLED7.SwitchOn(); } } p-UpdateData(false); ::Sleep(50); //判断用户是否点击停止按钮若是则退出 if(p-bStopHID) { AfxMessageBox(stopped...); return 0; } } } } if (ij) { AfxMessageBox(There is no such HID device...); } return 0; 第三步向HID设备写数据根据用户提供的HID的vendorID和productID)用户输入的是二进制数据与读的程序一样唯一区别就是红色那部分UpdateData(true);bStopHIDfalse;CString temp;CString DevicePath;temp;int Count 0; //Total number of devices foundDWORD strSize0,requiredSize0;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 venderIDv_eVendorID;int productIDv_eProductID;unsigned char inbuffer[2];unsigned long numBytesReturned;HIDD_ATTRIBUTES devAttr;PHIDP_PREPARSED_DATA PreparsedData;HIDP_CAPS Capabilities;int readValue;bool LED;int flag0;inbuffer[0]0;//把界面里的二进制转换成10进制inbuffer[1]m_eByte0*1m_eByte1*2m_eByte2*4m_eByte3*8m_eByte4*16m_eByte5*32m_eByte6*64m_eByte7*128;v_eDataToWriteinbuffer[1];UpdateData(false);//2HDEVINFO handle;handle SetupDiGetClassDevs(deviceId, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT); //Get only HID devicesint i0;int jm_ctllHIDdevices.GetCount();for (i0;im_ctllHIDdevices.GetCount();i){ m_ctllHIDdevices.GetText(i,temp); DevicePathtemp; 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.Sizesizeof(HIDD_ATTRIBUTES); if (!HidD_GetAttributes(hCom,devAttr)) { CloseHandle(hCom); AfxMessageBox(Cannot get the parameters of the HID...); return; } //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 Data...); return; } if(!HidP_GetCaps(PreparsedData,Capabilities)) { CloseHandle(hCom); AfxMessageBox(Cannot get the Cap Data...); return; }// Write File if (devAttr.VendorID venderID devAttr.ProductID productID) { result1 WriteFile(hCom, inbuffer, 2, numBytesReturned, NULL); //tempinbuffer; //p-m_eDataReadCString(inbuffer); //p-UpdateData(false); if(!result1) { AfxMessageBox(Cannot Write Data...); return; } AfxMessageBox(Suncess...); break; }}if (ij){ AfxMessageBox(There is no such HID device...);}return; 转载于:https://www.cnblogs.com/MMLoveMeMM/articles/3216088.html