好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

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

12页
  • 卖家[上传人]:汽***
  • 文档编号:569392380
  • 上传时间:2024-07-29
  • 文档格式:PDF
  • 文档大小:66.45KB
  • / 12 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 第一步:列举所有的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_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(&deviceId); // 第二步:获取设备信息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_DEVICE_INTERFACE_DATA); result1 = SetupDiEnumDeviceInterfaces( handle, NULL, // 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); DeviceInterfaceDetailData->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; 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(&deviceId); //第二步:获取设备信息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_DEVICE_INTERFACE_DATA); result1 = SetupDiEnumDeviceInterfaces( handle, NULL, // 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); DeviceInterfaceDetailData->cbSize=sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); DeviceInfoData.cbSize=sizeof(SP_DEVINFO_DATA); //再次获得详细数据result2=SetupDiGetDeviceInterfaceDetail(handle, &DeviceInterfaceData, DeviceInterfaceDetailData, strSize, &requiredSize, &DeviceInfoData); //获得设备路径(最重要的部分)temp=DeviceInterfaceDetailData->DevicePath; UpdateData(FALSE); m_ctllHIDdevices.AddString(temp); Count++; } while (result1); UpdateData(false);izeof(SP_DEVINFO_DATA); // 再次获得详细数据result2=SetupDiGetDeviceInterfaceDetail(handle, &DeviceInterfaceData, DeviceInterfaceDetailData, strSize, &requiredSize, &DeviceInfoData); // 获得设备路径(最重要的部分)temp=DeviceInterfaceDetailData->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); // 更新界面,获取变量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 found DWORD strSize=0,requiredSize=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 venderID=p->v_eVendorID; // 从窗口里获取用户输入的VendorID int productID=p->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 flag=0; //2 HDEVINFO handle; handle = SetupDiGetClassDevs(&deviceId, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT); //Get only HID devices int 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 通信的句柄HANDLE hCom = CreateFile ( DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); 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.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); temp=inbuffer; //p->m_eDataRead=CString(inbuffer); //p->UpdateData(false); if(!result1) { AfxMessageBox("Cannot Read Data..."); return 0; } readValue=inbuffer[1]; p->m_eDataRead.Format("%d",readValue); // 下面是我把数据从10 进制转换成二进制, 并且点亮LED (一个字节有8 个 bits, 可以点亮8个 LED for (int k=0;k<8;k++) { flag=readValue%2; readValue=readValue/2; if (k==0) { if (flag==0) p->m_sDynLED0.SwitchOff(); else p->m_sDynLED0.SwitchOn(); } else if (k==1) { if (flag==0) p->m_sDynLED1.SwitchOff(); else p->m_sDynLED1.SwitchOn(); } 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.SwitchOff(); 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..."); 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 found DWORD strSize=0,requiredSize=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 venderID=v_eVendorID; int productID=v_eProductID; unsigned char inbuffer[2]; unsigned long numBytesReturned; HIDD_ATTRIBUTES devAttr; PHIDP_PREPARSED_DATA PreparsedData; HIDP_CAPS Capabilities; int readValue; bool LED; int flag=0; inbuffer[0]=0; // 把界面里的二进制转换成10 进制inbuffer[1]=m_eByte0*1+m_eByte1*2+m_eByte2*4+m_eByte3*8+m_eByte4*16+m_eByte5*32+m_eByte6*64+m_eByte7*128; v_eDataToWrite=inbuffer[1]; 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; 。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.