VC libusb 實現usbhid資料讀取

2021-08-28 12:30:05 字數 3547 閱讀 2304

libusb定義了5中傳輸型別,分別是:

控制傳輸(libusb_transfer_type_control=0)

同步傳輸(libusb_transfer_type_isochronous = 1)

批量傳輸(libusb_transfer_type_bulk = 2)

中斷傳輸(libusb_transfer_type_interrupt = 3)

批量流傳輸(libusb_transfer_type_bulk_stream = 4)

說明參考:

每個端點(endpoint)支援的io型別和傳輸型別不一樣,根據實際情況選取傳輸型別。

重點說明使用到的幾個方法,詳細的可以參考官方文件(英文)

官方文件:

//初始化,所有的libusb操作都要在此方法之後,返回0表示成功,-1異常

int libusb_call libusb_init

(libusb_context *

*ctx)

;//解除安裝libusb,之後的libusb操作都會異常

void libusb_call libusb_exit

(libusb_context *ctx)

;

所有的libusb操作都要包括在這兩個方法之間,一般情況下ctx引數為null。

說明一下libusb_context結構體,是由libusb_init建立並由libusb_exit銷毀,用於隔離使用者操作,類似於會話。當乙個被銷毀時不至於影響到另外乙個的操作。只有單個使用者時可以為null,使用預設的context。

/**

* 根據裝置的vid和pid開啟裝置,pid和vid可以通過裝置管理器檢視

* * @param ctx libusb_context

* @param vendor_id 裝置vid

* @param product_id 裝置pid

* * @retrun 返回裝置控制代碼,失敗返回null。後續的裝置讀寫,獲取資訊都依賴這個控制代碼

*/libusb_device_handle * libusb_call libusb_open_device_with_vid_pid

( libusb_context *ctx, uint16_t vendor_id, uint16_t product_id)

;//關閉裝置,釋放裝置控制代碼

void libusb_call libusb_close

(libusb_device_handle *dev_handle)

;

/**

* 獲取裝置資訊

* **/int libusb_call libusb_get_device_descriptor

(libusb_device *dev,

struct libusb_device_descriptor *desc)

;/**

* 獲取裝置配置資訊

* @param dev 裝置控制代碼

* @param config_index 乙個裝置可能有多個配置資訊,一般設定為0

* @param config 【輸出引數】 裝置配置資訊指標的引用

* * @return 成功返回0

*/int libusb_call libusb_get_config_descriptor

(libusb_device *dev,

uint8_t config_index,

struct libusb_config_descriptor *

*config)

;//釋放裝置配置資訊

void libusb_call libusb_free_config_descriptor

(struct libusb_config_descriptor *config)

;

結構體說明,詳細看官網咖

annotated.html

libusb_endpoint_descriptor端點資訊:描述傳輸型別,讀/寫埠,傳輸包大小等

libusb_inte***ce_descriptor介面資訊:存放端點列表,

libusb_config_descriptor配置資訊:存放介面列表

libusb_device_descriptor裝置資訊:描述配置數,vid,pid,序列號之類

/**

* 宣告介面,宣告介面之後才能在基於該介面的端點(endpoint)讀寫資料

* @param dev_handle 裝置控制代碼

* @param inte***ce_number 介面號

* @return 成功返回0

*/int libusb_call libusb_claim_inte***ce

(libusb_device_handle *dev_handle,

int inte***ce_number)

;/**

* 釋放介面

* @param dev_handle 裝置控制代碼

* @param inte***ce_number 介面號

* @return 成功返回0

*/int libusb_call libusb_release_inte***ce

(libusb_device_handle *dev_handle,

int inte***ce_number)

;

這裡以同步傳輸的中斷傳輸為例

/**

* 同步傳輸,中斷傳輸。讀/寫依賴埠型別

* 在超時時間內一旦完成讀/寫乙個資料報就返回,超出超時時間返回超時

* * @param dev_handle 裝置控制代碼

* @param endpoint 讀寫的埠,埠所在的介面需要宣告,

* 埠的讀寫型別需要是interrupt

* @param data 寫資料時的資料輸入陣列,讀資料時的輸出陣列

* @param length 寫資料時的資料長度,讀資料時最大報文長度

* @param transferred 【輸出值】實際傳輸的資料大小

* @param timeout 超時時間(毫秒ms)

* @return 成功返回0,其他異常**

*/int libusb_interrupt_transfer (

struct libusb_device_handle * dev_handle,

unsigned

char endpoint,

unsigned

char

* data,

int length,

int* transferred,

unsigned

int timeout

)

快速排序演算法實現(遞迴實現 棧實現)

基本思想 選擇乙個基準元素,比如選擇最後乙個元素,通過一趟掃瞄,將待排序列分成兩部分,一部分比基準元素小,一部分大於等於基準元素,此時基準元素在其排好序後的正確位置,又稱為軸位置,此位置的元素確定後不再參與排序,然後再用同樣的方法遞迴地排序劃分的兩部分。分析 快速排序是不穩定的排序。快速排序的時間複...

介面實現與配置實現

在實現系統功能的時候,通常會首先定義好功能的介面,在系統功能不斷被實現的過程中,慢慢的發現有些介面的實現很類似,這個時候通常會開始做一次抽象,形 成乙個共同的部分,慢慢的系統形成了乙個抽象的層次,而為了通用,通常是通過定義介面,形成乙個抽象類,抽象類中暴露出一些抽象方法供外部擴充套件實 現,逐步的積...

js分頁實現,前端實現。

主要是借鑑了網上乙個例子,自己重新加了樣式,新增了跳轉,修改了一些小地方,用於和大家一起分享,前端分頁的技巧,的資料是我已經寫好了,其實大家也可以前端渲染 然後再分頁,都是可以的。其實分頁最關鍵是這兩句 var startrow currentpage 1 pagesize 1 currentpag...