hid read c Linux,linux/windows hid
一、背景:
最近在做的一個項目需要使用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
總結
以上是生活随笔為你收集整理的hid read c Linux,linux/windows hid的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 俄罗斯钓鱼四服务器未响应,俄罗斯钓鱼4《
- 下一篇: linux 其他常用命令