目錄
引入hidapi
主要函式
初始化和退出
hid_enumerate
hid_open
讀資料寫資料
hidapi是乙個開源的c語言實現的usb通訊庫,支援linux,mac,windows系統,但是也有一段時間沒有更新了。
在windows系統上的實現是依賴winusb實現的
github 位址
主要引入三個檔案
`usb_hid.h`:標頭檔案,include引入`hid_init()`和`hid_exit()`成對出現,分別是初始化和退出,所有的hid操作都要包括在兩者之間`hidapi.dll`:dll檔案,放在執行程式同級目錄下
`hidapi.lib`:lib庫檔案,在附件依賴項中新增或使用`#pragma comment(lib,"hidapi.lib")`加進來
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...