C++ MFC界面读写USB HID设备数据程序.docx

上传人:b****3 文档编号:4148353 上传时间:2022-11-28 格式:DOCX 页数:4 大小:16.28KB
下载 相关 举报
C++ MFC界面读写USB HID设备数据程序.docx_第1页
第1页 / 共4页
C++ MFC界面读写USB HID设备数据程序.docx_第2页
第2页 / 共4页
C++ MFC界面读写USB HID设备数据程序.docx_第3页
第3页 / 共4页
C++ MFC界面读写USB HID设备数据程序.docx_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

C++ MFC界面读写USB HID设备数据程序.docx

《C++ MFC界面读写USB HID设备数据程序.docx》由会员分享,可在线阅读,更多相关《C++ MFC界面读写USB HID设备数据程序.docx(4页珍藏版)》请在冰豆网上搜索。

C++ MFC界面读写USB HID设备数据程序.docx

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

第一步:

列举所有的HID装备:

m_ctllHIDdevices.ResetContent();//这是MFC里面一个list控件,用来显示所有的HID装备的,假如你没有界面,可以不须要此行UpdateData(FALSE);//更新界面CStringtemp;intCount=0;//TotalnumberofdevicesfoundDWORDstrSize=0,requiredSize=0;BOOLresult1,result2;ULONGDeviceInterfaceDetailDataSize;//界说一些变量,今后会用到SP_DEVINFO_DATADeviceInfoData;SP_DEVICE_INTERFACE_DATADeviceInterfaceData;PSP_DEVICE_INTERFACE_DETAIL_DATADeviceInterfaceDetailData;//PSP_DEVICE_INTERFACE_DETAIL_DATAtest;//第一步:

获取deviceIDGUIDdeviceId;HidD_GetHidGuid(&deviceId);//第二步:

获取装备信息HDEVINFOhandle;handle=SetupDiGetClassDevs(&deviceId,NULL,NULL,DIGCF_DEVICEINTERFACE|DIGCF_PRESENT);//GetonlyHIDdevices//第三步:

对所有的装备进行列举//SetupDiEnumDeviceInterfaces();result1=false;//界说一些变量result2=false;CStringtemp11="";do{DeviceInterfaceData.cbSize=sizeof(SP_DEVICE_INTERFACE_DATA);result1=SetupDiEnumDeviceInterfaces(handle,NULL,//INPSP_DEVINFO_DATADeviceInfoData,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);//更新界面CStringtemp;intCount=0;//TotalnumberofdevicesfoundDWORDstrSize=0,requiredSize=0;BOOLresult1,result2;ULONGDeviceInterfaceDetailDataSize;//界说一些变量,今后会用到SP_DEVINFO_DATADeviceInfoData;SP_DEVICE_INTERFACE_DATADeviceInterfaceData;PSP_DEVICE_INTERFACE_DETAIL_DATADeviceInterfaceDetailData;//PSP_DEVICE_INTERFACE_DETAIL_DATAtest;//第一步:

获取deviceIDGUIDdeviceId;HidD_GetHidGuid(&deviceId);//第二步:

获取装备信息HDEVINFOhandle;handle=SetupDiGetClassDevs(&deviceId,NULL,NULL,DIGCF_DEVICEINTERFACE|DIGCF_PRESENT);//GetonlyHIDdevices//第三步:

对所有的装备进行列举//SetupDiEnumDeviceInterfaces();result1=false;//界说一些变量result2=false;CStringtemp11="";do{DeviceInterfaceData.cbSize=sizeof(SP_DEVICE_INTERFACE_DATA);result1=SetupDiEnumDeviceInterfaces(handle,NULL,//INPSP_DEVINFO_DATADeviceInfoData,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去读取一次数据!

起首创建一个线程:

HANDLEhThread1;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;CStringtemp;CStringDevicePath;temp="";intCount=0;//TotalnumberofdevicesfoundDWORDstrSize=0,requiredSize=0;BOOLresult1,result2;ULONGDeviceInterfaceDetailDataSize;SP_DEVINFO_DATADeviceInfoData;SP_DEVICE_INTERFACE_DATADeviceInterfaceData;PSP_DEVICE_INTERFACE_DETAIL_DATADeviceInterfaceDetailData;//PSP_DEVICE_INTERFACE_DETAIL_DATAtest;//1GUIDdeviceId;HidD_GetHidGuid(&deviceId);intvenderID=p->v_eVendorID;//从窗口里获取用户输入的VendorIDintproductID=p->v_eProductID;//从窗口里获取用户输入的ProductIDunsignedcharinbuffer[2];//用来存放读取的数据,请在这里界说你本身须要的长度,我每次读一个字节进来unsignedlongnumBytesReturned;HIDD_ATTRIBUTESdevAttr;PHIDP_PREPARSED_DATAPreparsedData;HIDP_CAPSCapabilities;intreadValue;boolLED;intflag=0;//2HDEVINFOhandle;handle=SetupDiGetClassDevs(&deviceId,NULL,NULL,DIGCF_DEVICEINTERFACE|DIGCF_PRESENT);//GetonlyHIDdevicesinti=0;intj=p->m_ctllHIDdevices.GetCount();for(i=0;im_ctllHIDdevices.GetCount();i++){p->m_ctllHIDdevices.GetText(i,temp);DevicePath=temp;//CreateFile是异常主要的一步,用来树立于HID通讯的句柄HANDLEhCom=CreateFile(DevicePath,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);if(hCom==INVALID_HANDLE_VALUE){//AfxMessageBox("InvalideDevicePath...");continue;}devAttr.Size=sizeof(HIDD_ATTRIBUTES);if(!

HidD_GetAttributes(hCom,&devAttr)){CloseHandle(hCom);AfxMessageBox("CannotgettheparametersoftheHID...");return0;}//temp.Format("VendorID:

%d,ProductID:

%d",devAttr.VendorID,devAttr.ProductID);//ComparewiththeVendorIDandProductIDfromNakamura-san//AfxMessageBox(temp);if(!

HidD_GetPreparsedData(hCom,&PreparsedData)){CloseHandle(hCom);AfxMessageBox("CannotgetthePreparsedData...");return0;}if(!

HidP_GetCaps(PreparsedData,&Capabilities)){CloseHandle(hCom);AfxMessageBox("CannotgettheCapData...");return0;}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("CannotReadData...");return0;}readValue=inbuffer[1];p->m_eDataRead.Format("%d",readValue);//下面是我把数据从10进制转换成二进制,并且点亮LED(一个字节有8个bits,可以点亮8个LEDfor(intk=0;k<8;k++){flag=readValue%2;readValue=readValue/2;if(k==0){if(flag==0)p->m_sDynLED0.SwitchOff();elsep->m_sDynLED0.SwitchOn();}elseif(k==1){if(flag==0)p->m_sDynLED1.SwitchOff();elsep->m_sDynLED1.SwitchOn();}elseif(k==2){if(flag==0)p->m_sDynLED2.SwitchOff();elsep->m_sDynLED2.SwitchOn();}elseif(k==3){if(flag==0)p->m_sDynLED3.SwitchOff();elsep->m_sDynLED3.SwitchOn();}elseif(k==4){if(flag==0)p->m_sDynLED4.SwitchOff();elsep->m_sDynLED4.SwitchOn();}elseif(k==5){if(flag==0)p->m_sDynLED5.SwitchOff();elsep->m_sDynLED5.SwitchOn();}elseif(k==6){if(flag==0)p->m_sDynLED6.SwitchOff();elsep->m_sDynLED6.SwitchOn();}elseif(k==7){if(flag==0)p->m_sDynLED7.SwitchOff();elsep->m_sDynLED7.SwitchOn();}}p->UpdateData(false);:

:

Sleep(50);//断定用户是否点击停滞按钮,若是,则退出if(p->bStopHID){AfxMessageBox("stopped...");return0;}}}}if(i==j){AfxMessageBox("ThereisnosuchHIDdevice...");}return0;

第三步:

向HID装备写数据(依据用户供给的HID的vendorID和productID),用户输入的是二进制数据:

与读的程序一样,独一差别就是红色那部分!

UpdateData(true);bStopHID=false;CStringtemp;CStringDevicePath;temp="";intCount=0;//TotalnumberofdevicesfoundDWORDstrSize=0,requiredSize=0;BOOLresult1,result2;ULONGDeviceInterfaceDetailDataSize;SP_DEVINFO_DATADeviceInfoData;SP_DEVICE_INTERFACE_DATADeviceInterfaceData;PSP_DEVICE_INTERFACE_DETAIL_DATADeviceInterfaceDetailData;//PSP_DEVICE_INTERFACE_DETAIL_DATAtest;//1GUIDdeviceId;HidD_GetHidGuid(&deviceId);intvenderID=v_eVendorID;intproductID=v_eProductID;unsignedcharinbuffer[2];unsignedlongnumBytesReturned;HIDD_ATTRIBUTESdevAttr;PHIDP_PREPARSED_DATAPreparsedData;HIDP_CAPSCapabilities;intreadValue;boolLED;intflag=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);//2HDEVINFOhandle;handle=SetupDiGetClassDevs(&deviceId,NULL,NULL,DIGCF_DEVICEINTERFACE|DIGCF_PRESENT);//GetonlyHIDdevicesinti=0;intj=m_ctllHIDdevices.GetCount();for(i=0;i

HidD_GetAttributes(hCom,&devAttr)){CloseHandle(hCom);AfxMessageBox("CannotgettheparametersoftheHID...");return;}//temp.Format("VendorID:

%d,ProductID:

%d",devAttr.VendorID,devAttr.ProductID);//ComparewiththeVendorIDandProductIDfromNakamura-san//AfxMessageBox(temp);if(!

HidD_GetPreparsedData(hCom,&PreparsedData)){CloseHandle(hCom);AfxMessageBox("CannotgetthePreparsedData...");return;}if(!

HidP_GetCaps(PreparsedData,&Capabilities)){CloseHandle(hCom);AfxMessageBox("CannotgettheCapData...");return;}//WriteFileif(devAttr.VendorID==venderID&&devAttr.ProductID==productID){result1=WriteFile(hCom,inbuffer,2,&numBytesReturned,NULL);//temp=inbuffer;//p->m_eDataRead=CString(inbuffer);//p->UpdateData(false);if(!

result1){AfxMessageBox("CannotWriteData...");return;}AfxMessageBox("Suncess...");break;}}if(i==j){AfxMessageBox("ThereisnosuchHIDdevice...");}return;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1