USB HID 小記

最近幫同事搞一個項目,他的USBHID設備不斷向主機發送實時數據,讓我幫忙寫一個上位機程序實時讀取他的數據並進行處理。結果拿到設備後,發現可以通過Bus Hound讀取出數據,例如0d,db,80,ff,01 ,這些都是該設備傳回的實時數據。由於對USBHID設備不熟悉,

開始研究USBHID設備,查找了幾篇文獻和網上的一些文章,終於有些眉目。這裏先記下來。

首先,我去書店看了一眼《圈圈教你玩轉USB》,貌似是第二版?主要看了前面USB1.1協議中的幾個描述符,和HID特有的報告描述符。

單從硬件上來說,各個USB從設備對主機都是一樣的,因爲只有4根線而已。所以這麼多USB設備的分類就只能靠軟件來區分。具體的就是通過各種描述符來進行配置、區分。說簡單點就是從設備在剛與主機連接時(USB枚舉過程),進行了設備描述符、配置描述符、接口描述符、端點描述符、字符串描述符和報告描述符的提交,從設備通過這些描述符把自己的配置、特點、功能等等告訴主機。

明白了這點後,在百度上查了下“如何讀取USBHID設備”,搜到了大把的文章,大多數都是利用hid.dll、kernel32.dll、setup.dll這三個庫的API來完成讀寫。過程的話大同小異,都是先獲得path,再createfile得到handler,最後通過handler讀寫。這裏國外有幾個網站有開源的C#程序,網址的話。。自己搜吧。。。

緊接着,我的問題出現了,readfile時永遠返回0,getlasterror不是1784就是87,網上或者MSDN都可以查到錯誤代表什麼,調了半天最後卡在一個問題上,我利用hid_getcaps讀到了buffer長度,也就是readfile(...,buffer,bufferlength,...)其中的應該讀取的長爲61,當我設定bufferlength的值小於這個61時,出現1784號error,當我這個值大於等於61時,卡死在readfile這個函數(因爲我是同步讀取(readfile最後一個參數))。。。百思不得其解。

於是又重新看了一下USB1.1的協議和描述符說明,尤其是報告描述符說明。其中報告描述符描述了返回數據的報告種類,以及每種報告的數據格式。看到這裏時,我懷疑有可能是因爲設備的報告描述符配置錯了,導致其返回給我的5字節數據例如0d,db,80,ff,01,被windowsHID驅動自動過濾掉了,因此一直無法獲取數據。

因此將下位機程序要來,以及其開發環境。打開下位機程序,發現其報告描述符與上傳的數據完全不符,其中報告ID即報告種類沒有0d,因此上傳的0d,db,80,ff,01會被主機驅動過濾掉。當然,修改報告ID,並將數據補齊,就可以通過readfile的方式讀取端點2上的數據了(當然是中斷傳輸)。

另外,readfile和writefile的讀寫方法都是中斷傳輸,只能讀寫中斷端點,設備的0端點不是中斷端點,其他端點需要配置。另外,每個端點可以同時被配置爲中斷輸出和中斷輸入端點。

先寫到這,後面的程序和鏈接有空補上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章