VC HIDAPI實現USB資料讀寫

2021-08-28 03:14:04 字數 2457 閱讀 9889

目錄

引入hidapi

主要函式

初始化和退出

hid_enumerate

hid_open

讀資料寫資料

hidapi是乙個開源的c語言實現的usb通訊庫,支援linux,mac,windows系統,但是也有一段時間沒有更新了。

在windows系統上的實現是依賴winusb實現的

github 位址

主要引入三個檔案

`usb_hid.h`:標頭檔案,include引入

`hidapi.dll`:dll檔案,放在執行程式同級目錄下

`hidapi.lib`:lib庫檔案,在附件依賴項中新增或使用`#pragma comment(lib,"hidapi.lib")`加進來

`hid_init()`和`hid_exit()`成對出現,分別是初始化和退出,所有的hid操作都要包括在兩者之間

struct hid_device_info hid_api_export * hid_api_call hid_enumerate(unsigned short vendor_id, unsigned short product_id)
讀取裝置資訊,需要裝置的vid和pid,返回裝置資訊的結構體`hid_device_info`,是鍊錶結構。實際是查詢所有連線裝置然後根據vid和pid進行匹配,如果vid或pid是0的話則預設匹配成功,即如果vid和pid都是0的話返回所有裝置資訊。

struct hid_device_info ;
hid_device_info結構體的資料需要使用下面這個方法釋放

void  hid_api_export hid_api_call hid_free_enumeration(struct hid_device_info *devs);

開啟裝置返回裝置操作的控制代碼,裝置資料的讀取和寫入都要使用到這個控制代碼

開啟裝置是獨佔方式的,使用過後需要使用`hid_close`關閉

在windows其底層的實現方式是用的winusb的api `createfile`

//通過裝置vid和pid開啟

hid_api_export hid_device * hid_api_call hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number);

//通過裝置路徑開啟

hid_api_export hid_device * hid_api_call hid_open_path(const char *path);

`hid_read`

讀取資料,一次讀取乙個報文

/**

* @param device 裝置控制代碼

* @param data 讀取資料存放的buffer

* @param length 讀取資料的最大長的

* * @return 實際讀取到的資料長度,-1表示讀取失敗

*/int hid_api_export hid_api_call hid_read(hid_device *device, unsigned char *data, size_t length);

unsigned int _stdcall usb_hid::usb_read_proc(lpvoid lp_param)

res = hid_read(params->dev_handle_, buf, sizeof(buf));

if (res > 0)

if (res < 0)

sleep(500);

}return 0;

}

`hid_write`

寫資料的方法,一次寫乙個報文。寫資料時注意資料buffer的頭部是報文id,如果裝置只支援單報文的形式,則設定為0x0。這就導致寫資料的長度要比實際需要寫入的資料長1個位元組;

/** 

@param device 裝置控制代碼

@param data 傳送的資料,首位為報文id

@param length 傳送資料的長度(位元組|byte)

@returns 實際寫入的資料長度,-1表示出錯

*/int hid_api_export hid_api_call hid_write(hid_device *device, const unsigned char *data, size_t length);

實現**如下,是否非同步根據情況選擇。推薦非同步進行操作,實際使用過程中發現寫資料時有可能發生堵塞。

int usb_hid::usb_write_data_test()
專案中包含usb熱拔插響應的**

USB資料格式

usb傳輸型別 1.控制傳輸 非週期性,突發 用於命令和狀態的傳輸 2.大容量資料傳輸 bulk 非週期性,突發 大容量資料的通訊,資料可以占用任意頻寬,並容忍延遲 3.同步傳輸 週期性.持續性的傳輸,用於傳輸與時效相關的資訊,並且在資料中儲存時間戳的資訊 4.中斷傳輸 週期性,低頻率 允許有限延遲...

用VC 實現USB介面讀寫資料的程式

用vc 實現usb介面讀寫資料的程式 收藏 用vc 實現usb介面讀寫資料的程式 使用乙個guidguidhid 1查詢並開啟乙個usb裝置 extern c int pascal searchusbdevice 取得乙個該guid相關的裝置資訊集控制代碼 hdevinfoset setupdige...

用VC 實現USB介面讀寫資料的程式

使用乙個guidguidhid 1查詢並開啟乙個usb裝置 extern c int pascal searchusbdevice 取得乙個該guid相關的裝置資訊集控制代碼 hdevinfoset setupdigetclassdevs lpguid guidhid 1,guid class us...