Ubuntu/Windows下利用“HIDAPI”庫函數實現與Hid類USB設備通信


一、背景:
      最近在做的一個項目需要使用USB傳遞數據,對USB理解不是很深,USB的系統驅動編寫則更是天方
    夜譚,因此將設備配置成HID類設備成為了首選。其最大的好處在於,LINUX/Windows系統中均自帶HID
    設備驅動,免除了USB系統驅動的困擾,同時HID配置為高速設備與全速設備時,其每筆事務傳輸的最大
    字節大小分別為64bytes、1024bytes,亦符合當前開發需求。

二、正文:  
        安裝及使用方法在"HIDAPI"文件夾中的"Readme"有了詳細說明,在此僅做個大致說明以及記錄在使
    用該庫函數時所碰到的一些問題。
  Windows:
      在Windows中,其使用"VS"工具來編譯,HIDAPI以兩種情況存在在項目中:一種是,將“"hid.c""hid.h"和自己的源碼一起編譯到項目中;另一種則是將其編譯成".dll",".lib",以動態鏈接庫的形式
    存在於項目中。推薦第一種,第一種方法你就可以很方便跟"hidapi"源代碼。
      在Windows中使用
        "int hid_write(hid_device *device, const unsigned char *data, size_t length);"
    這個函數時,一定要注意!寫入的數據大小一定要再加1bytes,首字節用來存放REPORT ID,並且寫入
    的數據大小"length"只能固定為設備對應ReportID定義的OUT報告的大小!
      舉個例子,若是USB設備只有一個Report ID,該Reprot ID對應的OUT Report大小配置為OUT_cnt
    bytes。那么buf[0]應該保存Report ID,buf的大小應該設置為(OUT_cnt bytes + 1bytes(report id)),
    寫入的字節參數"length"無論多少,用"Bus hound"工具會發現,下傳的數據大小一律為Out_cnt bytes,
    在下位機讀取到的USB數據大小通過串口返回,也可證實,下位機讀取到的數據大小也為Out_cnt bytes.
    至於原因,該庫函數作者Alan也做出了一些回答,意思在Windows系統中系統會根據首字節的Report ID
    來尋找正確的發送端口,若有興趣可以搜索作者在該github中Issues的問答。
      同樣,在Windows中使用
        "int hid_read(hid_device *device, unsigned char *data, size_t length);"
    這個函數時,"length"的值一定要為下位機定義的IN Report大小。並且這個函數要和函數
   "hid_set_nonblocking(...)"使用,設置為堵塞或者非堵塞。跟進"hid_read(..)"函數內,會發現其
   最終調用的函數還是
"int hid_read_timeout(... int milliseconds)" 若是設置為堵塞模式,則參數"milliseconds"設置為"-1",設置為非堵塞模式,則參數"milliseconds"設置 為"0"   其它的勿用多說,Readme和頭文件中已經寫的非常詳細。    補充一點,已證實"HIDAPI"非線程安全操作,即讀和寫一定要在一個線程內操作,而不能在兩個線程 內操作。2016-12-6   Linux:    在Linux中,其同Windows一致,亦是以兩種形式存在,且Linux系統對傳輸的字節數更加寬容,沒有 Windows那么嚴格,因此"HIDAPI"在Linux系統使用中沒有hid_wrte/hid_read在Windows出現的麻煩,寫入 低於設備設定字節限定大小的任意字節皆可,讀亦如此,不會遭遇讀寫失敗的境遇。   具體的編譯方法及使用方法亦在Readme和頭文件中已經寫的非常詳細,在此不再贅述。 三、下載及參考鏈接:   hidraw設備介紹:     https://www.kernel.org/doc/Documentation/hid/hidraw.txt   HIDAPI介紹:     https://valelab.ucsf.edu/svn/3rdpartypublic/hidapi/hidapi-3a66d4e513/README.txt   HIDAPI下載頁面:     https://github.com/signal11/hidapi 記錄完畢。 記錄地點:深圳WZ 記錄時間:2016年4月12日

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM