現在USB設備卻很多,因此對USB設備的查找與讀寫就必不可少了。但是能找到關於USB讀寫的資料很少。這裡使用VC++示范了一些獲得USB的信息的方法。
一、枚舉USB設備
通過枚舉USB控制器->枚舉此控制器上的USB HUB->枚舉HUB的各個端口->獲得設備信息。
枚舉控制器:
wsprintf(HCName, "\\\\.\\HCD%d", HCNum);
hHCDev = CreateFile(HCName,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);
計算機上的USB主控制器以HCD1,HCD2等命名。通過控制器名稱,使用CCreateFile 打開它。使用DeviceIoControl即可得到其驅動程序名,以及與它連接的HUB的名稱。用CCreateFile打開HUB,獲得連接信息。再枚舉HUB的各個端口即可獲得連接的設備信息。
二、枚舉HID設備
HID設備是微軟定義的標准人機接口規范。比如USB鼠標,USB游戲手柄等。不用查找具體設備的GUID,使用API HidD_GetHidGuid(&guidHID)即可得到GUID。有了GUID通過API SetupDiEnumDeviceInterfaces可獲得是否有設備連接。如果此類設備連接通過SetupDiGetDeviceInterfaceDetail獲得它的設備路徑信息。使用CCreateFile 打開它,通過HidD_GetAttributes獲得其基本屬性信息。使用DeviceIoControl可以獲得更詳細的屬性。在本代碼中如果計算機上插有USB游戲手柄,可獲得其信息。但不知道為什麼xp下卻不能獲得USB鼠標的信息。
三 枚舉U盤
先用GetDriveType API獲得設備的類型,若類型為REMOVABLE(當然有些大容量U盤可能報告為FIXED,那就需要其他方法來確定了),即可能是U盤。用CCreateFile 打開之後,再用IOCTL_STORAGE_QUERY_PROPERTY為參數的DeviceIoControl來獲得其屬性。
四、結束語
示例工程在winxp+xpDDK+VC6下編譯通過。USB設備種類比較多,也比較特殊,不同廠商的硬件不同,控制軟件也不盡相同(我想主要是ICTL碼不同,也不容易查到)。使得訪問USB口的設備不象串口並口那麼方便。這個例程只是展示了訪問的基本方法。其中還有些問題還沒有解決,發出來希望大家解決之後能通知我或者發表出來。
參考了USBPort,USBview等代碼,一並致謝。
本文配套源碼