C++MFC界面讀寫USBHID設備數(shù)據(jù)程序_第1頁
C++MFC界面讀寫USBHID設備數(shù)據(jù)程序_第2頁
C++MFC界面讀寫USBHID設備數(shù)據(jù)程序_第3頁
C++MFC界面讀寫USBHID設備數(shù)據(jù)程序_第4頁
C++MFC界面讀寫USBHID設備數(shù)據(jù)程序_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、第一步:列舉所有的HID裝備:m_ctllHIDdevices.ResetContent();/這是MFC里面一個list控件,用來顯示所有的HID裝備的,假如你沒有界面,可以不須要此行UpdateData(FALSE);/更新界面CStringtemp;intCount=0;/TotalnumberofdevicesfoundDWORDstrSize=0,requiredSize=0;BOOLresult1,result2;ULONGDeviceInterfaceDetailDataSize;/界說一些變量,今后會用到SP_DEVINFO_DATADeviceInfoData;SP_DEVI

2、CE_INTERFACE_DATADeviceInterfaceData;PSP_DEVICE_INTERFACE_DETAIL_DATADeviceInterfaceDetailData;/PSP_DEVICE_INTERFACE_DETAIL_DATAest;第一步:獲取deviceIDGUIDdeviceId;HidD_GetHidGuid(&deviceId);/第二步:獲取裝備信息HDEVINFOhandle;handle=SetupDiGetClassDevs(&deviceId,NULL,NULL,DIGCF_DEVICEINTERFACE|DIGCF_PRESE

3、NT);/GetonlyHIDdevices/第三步:對所有的裝備進行列舉SetupDiEnumDeviceInterfaces();result1=false;/界說一些變量result2=false;CStringtemp11=""doDeviceInterfaceData.cbSize=sizeof(SP_DEVICE_INTERFACE_DATA);result1=SetupDiEnumDeviceInterfaces(handle,NULL,/INPSP_DEVINFO_DATADeviceInfoData,OPTIONAL&deviceId,Count,

4、&DeviceInterfaceData);/獲得裝備具體數(shù)據(jù)(初步)SetupDiGetDeviceInterfaceDetail(handle,&DeviceInterfaceData,NULL,0,&strSize,NULL);requiredSize=strSize;DeviceInterfaceDetailData=(PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(requiredSize);DeviceInterfaceDetailData->cbSize=sizeof(SP_DEVICE_INTERFACE_DETAI

5、L_DATA);DeviceInfoData.cbSize=s第一步:列舉所有的HID裝備:m_ctllHIDdevices.ResetContent();/這是MFC里面一個list控件,用來顯示所有的HID裝備的,假如你沒有界面,可以不須要此行UpdateData(FALSE);/更新界面CStringtemp;intCount=0;/TotalnumberofdevicesfoundDWORDstrSize=0,requiredSize=0;BOOLresult1,result2;ULONGDeviceInterfaceDetailDataSize;/界說一些變量,今后會用到SP_DEV

6、INFO_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,

7、DIGCF_DEVICEINTERFACE|DIGCF_PRESENT);/GetonlyHIDdevices/第三步:對所有的裝備進行列舉/SetupDiEnumDeviceInterfaces();result1=false;/界說一些變量result2=false;CStringtemp11=""doDeviceInterfaceData.cbSize=sizeof(SP_DEVICE_INTERFACE_DATA);result1=SetupDiEnumDeviceInterfaces(handle,NULL,/INPSP_DEVINFO_DATADeviceInf

8、oData,OPTIONAL&deviceId,Count,&DeviceInterfaceData);/獲得裝備具體數(shù)據(jù)(初步)SetupDiGetDeviceInterfaceDetail(handle,&DeviceInterfaceData,NULL,0,&strSize,NULL);requiredSize=strSize;DeviceInterfaceDetailData=(PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(requiredSize);DeviceInterfaceDetailData->cbSiz

9、e=sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);DeviceInfoData.cbSize=sizeof(SP_DEVINFO_DATA)/再次獲得具體數(shù)據(jù)result2=SetupDiGetDeviceInterfaceDetail(handle,&DeviceInterfaceData,DeviceInterfaceDetailData,strSize,&requiredSize,&DeviceInfoData);/獲得裝備路徑(最主要的部分)temp=DeviceInterfaceDetailData->DevicePat

10、h;UpdateData(FALSE);m_ctllHIDdevices.AddString(temp);Count+;while(result1);UpdateData(false);izeof(SP_DEVINFO_DATA/再次獲得具體數(shù)據(jù)result2=SetupDiGetDeviceInterfaceDetail(handle,&DeviceInterfaceData,DeviceInterfaceDetailData,strSize,&requiredSize,&DeviceInfoData);/獲得裝備路徑(最主要的部分)temp=DeviceInterf

11、aceDetailData->DevicePath;UpdateData(FALSE);m_ctllHIDdevices.AddString(temp);Count+;while(result1);UpdateData(false);第二步:輪回讀取HID裝備數(shù)據(jù)(依據(jù)用戶供給的HID的vendorlD和productID),并且把字節(jié)解碼成二進制,在MFCF面上用LED展現(xiàn):為了不影響主線程的運行,我把讀取數(shù)據(jù)的操縱,放在一個子線程里!每隔50ms去讀取一次數(shù)據(jù)!起首創(chuàng)建一個線程:HANDLEhThread1;bStopHID=false;/這個變量,今后用來停滯線程UpdateDat

12、a(true);/更新界面,獲取變量UpdateData(false);hThread1=CreateThread(NULL,0,Thread_Enable_Read,(LPVOID)this,NULL,NULL);在線程的程序里:CusbhidDlg*p=(CusbhidDlg*)pvParam;獲取主窗口的指針,用來挪用主窗口的變量和函數(shù)p->UpdateData(true);p->bStopHID=false;CStringtemp;CStringDevicePath;temp=""intCount=0;/Totalnumberofdevicesfound

13、DWORDstrSize=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);

14、intvenderID=p->v_eVendorID;/從窗口里獲取用戶輸入的VendorlDintproductID=p->v_eProductID;/從窗口里獲取用戶輸入的ProductIDunsignedcharinbuffer2;/用來存放讀取的數(shù)據(jù),請在這里界說你本身須要的長度,我每次讀一個字節(jié)進來unsignedlongnumBytesReturned;HIDD_ATTRIBUTESdevAttr;PHIDP_PREPARSED_DATAPreparsedData;HIDP_CAPSCapabilities;intreadValue;boolLED;intflag=0;

15、2HDEVINFOhandle;handle=SetupDiGetClassDevs(&deviceId,NULL,NULL,DIGCF_DEVICEINTERFACEDIGCF_PRESENT);/GetonlyHIDdevicesinti=0;intj=p->m_ctllHIDdevices.GetCount();for(i=0;i<p->m_ctllHIDdevices.GetCount();i+)p->m_ctllHIDdevices.GetText(i,temp);DevicePath=temp;/CreateFile是異常主要的一步,用來樹立于HID

16、通訊的句柄HANDLEhCom=CreateFile(DevicePath,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING0,NULL);if(hCom=INVALID_HANDLE_VALUE)AfxMessageBox("InvalideDeviceHID)return0;temp.Format("VendorID: %d, ProductPath)continue;devAttr.Size=sizeof(HIDD_ATTRIBUTES);if(!HidD_Ge

17、tAttributes(hCom,&devAttr)CloseHandle(hCom);AfxMessageBox("CannotgettheparametersoftheID:%d”,devAttr.VendorID,devAttr.ProductID);/ComparewiththeVendorIDandProductIDfromNakamura-sanAfxMessageBox(temp);if(!HidD_GetPreparsedData(hCom,&PreparsedData)CloseHandle(hCom);AfxMessageBox("Can

18、notgetthePreparsedData)return0;if(!HidP_GetCaps(PreparsedData,&Capabilities)CloseHandle(hCom);AfxMessageBox("CannotgettheCapData)return0;if(devAttr.VendorID=venderID&&devAttr.ProductID=productID)while(1)result1=ReadFile(hCom,&inbuffer0,Capabilities.InputReportByteLength,&num

19、BytesReturned,0);temp=inbuffer;p->m_eDataRead=CString(inbuffer);p->UpdateData(false);if(!result1)AfxMessageBox("CannotReadData)return0;readValue=inbuffer1;p->m_eDataRead.Format("%d",readValue);/下面是我把數(shù)據(jù)從10進制轉(zhuǎn)換成二進制,并且點亮LED(一個字節(jié)有8個bits,可以點亮8個LEDor(intk=0;k<8;k+)flag=readValue

20、%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_sDyn

21、LED3.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();elsei

22、f(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裝備寫數(shù)據(jù)(依據(jù)用戶供給的HID的vendorID和productID),用戶輸入的

23、是二進制數(shù)據(jù):與讀的程序一樣,獨一差別就是紅色那部分!UpdateData(true);bStopHID=false;CStringtemp;CStringDevicePath;temp=""intCount=0;/TotalnumberofdevicesfoundDWORDstrSize=0,requiredSize=0;BOOLresult1,result2;ULONGDeviceInterfaceDetailDataSize;SP_DEVINFO_DATADeviceInfoData;SP_DEVICE_INTERFACE_DATADeviceInterfaceDat

24、a;PSP_DEVICE_INTERFACE_DETAIL_DATADeviceInterfaceDetailData;PSP_DEVICE_INTERFACE_DETAIL_DATAtest;/1GUIDdeviceId;HidD_GetHidGuid(&deviceId);intvenderID=v_eVendorID;intproductID=v_eProductID;unsignedcharinbuffer2;unsignedlongnumBytesReturned;HIDD_ATTRIBUTESdevAttr;PHIDP_PREPARSED_DATAPreparsedData

25、;HIDP_CAPSCapabilities;intreadValue;boolLED;intflag=0;inbuffer0=0;/把界面里的二進制轉(zhuǎn)換成10進制inbuffer1=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=inbuffer1;UpdateData(false);2HDEVINFOhandle;handle=SetupDiGetClassDevs(&deviceId,NULL,NULL,DIGCF

26、_DEVICEINTERFACEDIGCF_PRESENT);/GetonlyHIDdevicesinti=0;intj=m_ctllHIDdevices.GetCount();for(i=0;i<m_ctllHIDdevices.GetCount();i+)m_ctllHIDdevices.GetText(i,temp);DevicePath=temp;HANDLEhCom=CreateFile(DevicePath,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READFILE_SHARE_WRITE,NULL,OPEN_EXISTING0,NULL);if(hCom=INVALID_HANDLE_VALUE)AfxMessageBox("InvalideDevicePath)continue;devAttr.Size=sizeof(HIDD_ATTR

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論