呼叫hid_write和hid_read時,通過bus hound實際件事發現,單獨監視usb輸入裝置和單獨監視hid-compliant 時得到的結果有細微的不同:
當讀取資料,即呼叫hid_read時,單獨監視usb輸入裝置發現並無資料返回,儘管下位機的inreport中已經有資料;而當勾選上hid-compliant 裝置時,匯流排上才有inreport的資料。
當寫資料時嗎,即呼叫hid_write,單獨監視usb輸入裝置和單獨監視hid-compliant裝置時匯流排都有outreport的資料,但是usb輸入裝置上的outreport資料比hid上的資料少乙個位元組,hid的outreport陣列的第乙個位元組是hid報告描述符中的輸出report id。在我的hid報告描述符中沒有設定report id,因此預設是0。
下位機程式設計使用usb庫和hid庫時,其中就有usbuser.c和hiduser.c兩個用於給使用者填充自己的**的檔案,而在usbuser.c的端點響應事件中和hiduser.c中的 hid_setreport和hid_getreport中都有呼叫使用者自行編寫的getinreport和setoutreport函式,都是對於傳送資料和接收資料的處理。
如下圖所示,在使用bus hound監視匯流排上的資料時,也能發現對於usb輸入裝置(即下圖的device編號為18的裝置)是有顯示其使用的端點號(在這裡我設定使用的端點號為4),而對於hid-compliant裝置是沒有顯示端點號的。
關於report id和hidapi的聯絡
之前在qt程式中直接呼叫hid_read和hid_write函式總是不成功,返回值總是為-1,,後來查閱hidapi.h中對兩個函式的說明得知這兩個函式需要配合hid的report id來使用,具體說明如下:
int hid_read(hid_device *device, unsigned char *data, size_t length)通過中斷in端點返回乙個hid裝置的輸入報告,其返回的報告的第乙個位元組就包含了hid裝置的輸入reportid(如果在配置描述符時有設定的話),第3個引數length在實際的函式呼叫中也應該是sizeof(inreport)+1,用於容納report id,函式的返回值是實際讀取的資料的位元組數。
int hid_write(hid_device *device, const unsigned char *data, size_t length)向hid裝置寫入資料,要寫入的資料存放在data陣列中,需要注意的是,data 的第乙個位元組必須包含報告id。對於僅支援單個報告的裝置,必須將其設定為0x0,其餘位元組包含報告資料。 由於報告id是必需的,因此對hid_write的呼叫將始終包含比報告包含的位元組多乙個位元組。 例如,如果hid的outreport長度為64位元組,則必須將65個位元組傳遞給hid_write(),即第乙個位元組是report id,其餘64個位元組是實際要傳輸的資料。
USBHID類與C 上位機連線
usb與c 的連線可以呼叫windows的動態鏈結庫也可以呼叫ch375的動態鏈結庫,這邊用的是windows的動態鏈結庫。然後連線要注意的問題1.要重寫下面這個函式,才可以連線上 protected override void onhandlecreated eventargs e 2.連線上了之...
LabVIEW上位機與串列埠通訊
大一的時候,學校開了門公共選修課,叫labview程式設計,當時的我當然還不知道labview是啥東東,但還是選了。上課的老師是機械學院的乙個副教授,他給我們展示了好幾個用labview做的專案,譬如油箱監控上位機等,已經不太記得了。後來隨著學習微控制器 arm等的串列埠操作,有時候乙個漂亮的上位機...
上位機與下位機
上位機一般是集中管理監控機,下位機是指現場直接控制器或控制機。上位機面向管理級使用者,下位機面向底層裝置控制。上位機 上位監視系統,一般為計算機系統 監控軟體 下位機 控制系統的現場執行系統,一般為plc等裝置。上位機是指人可以直接發出操控命令的計算機,一般是pc,螢幕上顯示各種訊號變化 液壓,水位...