[Ref.] http://www.vckbase.com/document/viewdoc/?id=1282

USB有關的編程

作者:代冬軍

源代碼下載

  現在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等代碼,一併致謝。
聯繫方式:daisun1998@163.net

文章標籤
全站熱搜
創作者介紹
創作者 figer 的頭像
figer

日劇看不完

figer 發表在 痞客邦 留言(0) 人氣(1,677)