Qt 調用USB HID設備讀寫

Qt 調用USB HID設備讀寫

準備工作

由於Qt本身沒有可以直接調用的庫,爲了快速實現功能找到了第三方的資源:https://github.com/signal11/hidapi 下載下來的是源文件,如果是在Windows下需要藉助編譯工具編譯成庫文件才能在Qt中使用,具體在說明在下載下來的README.txt文件中,不想麻煩的話這裏提供了編譯好的資源,編譯器用的MinGW32。
需要用到的文件供3個:

  • hidapi.dll放到編譯生成的.exe的同級目錄,這個需要新建一個工程先編譯一次纔會有。
  • hidapi.hhidapi.lib就可以放在工程目錄下

順便說一下,讀者在放好上面幾個文件並操作完下面前三個步驟後再編譯一次,如果編譯正常通過並沒有報錯閃退,那就恭喜你,可以略過這一部分繼續測試後面的操作。由於我自己在做的時候始終會出現程序異常結束的提示,最後發現系統缺少一個庫msvcr100d.dll,到網上找了一個放到系統下就正常了,如果讀者在測試的時候也出現程序異常結束的提示,可以按照如下操作判斷自己是否也缺少庫(當然也有可能和我缺少的不一樣):

  • 打開打包命令行窗口,這裏選哪一個是和自己建工程時選的編譯器有關,不要選錯了。
    ![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20181121183600284.png

  • 移動路徑到編譯生成的.exe目錄下
    移動路徑

  • 執行指令windeployqt **.exe,兩個*替換成自己的exe名字,別直接複製過去運行。
    在這裏插入圖片描述

  • 命令執行完過後直接雙擊運行.exe文件,這個時候就會提示.dll找不到,自己去網上找到相應的庫下載下來放到系統盤對應的目錄(各位測試的時候可能和我少的不一樣,甚至不止缺少一個,全部找齊就好了),不同操作系統路徑可能不太一樣,自己根據情況操作。如果不知道自己該放到哪裏的話直接放到.exe的同級目錄下也可以。找齊過後再運行就OK了,然後到編譯器裏面編譯運行也沒有問題,至少我自己是這樣,如果還有其它問題也歡迎留言一起解決。

測試

  1. 頭文件添加。
    #include "hidapi.h"
    
  2. 在.pro文件最後添加庫,PRO_FILE_PWD表示.pro所在路徑hidapi就是庫名。
    LIBS += -L$$_PRO_FILE_PWD_/  -lhidapi
    
  3. 初始化調用,hidapi.h中說得比較清楚,這一步不是必要的,因爲在hid_enumerate() hid_open() 這些函數裏面也會調用。
    int res;
    res = hid_init();
    
  4. 打開指定HID設備,第一個參數是設備的VID,第二個參數是設備的PID,第三個是設備的序列號,一般就指定前兩個參數第三個參數填0就可以。返回的類似文件操作的句柄,通過它來讀寫。
    hid_device *handle;
    handle = hid_open(0x1345, 0x4004, NULL);
    
    設備的VID和PID可以從設備管理器裏面查找,注意的是這裏看到的是16進制
    在這裏插入圖片描述
    在這裏插入圖片描述
  5. 讀數據,hid_read()返回值爲實際讀取到的數據長度,handle是通過hid_open() 得到的。讀取到的數據就放在buf裏面,這幾行可以放到線程中,根據長度判斷是否有獲取到數據再來處理。
    int res=0;
    unsigned char buf[128];
    res = hid_read(handle, buf, 128);
    
  6. 寫數據,這裏需要注意的是數組的第一個字節必須是設備的Report ID,如果只支持一個那麼就填0,比如需要發送3個字節,0x01,0x02,0x03,那麼就需要按照如下操作:
    int res;	// 如果返回-1表示發送失敗
    unsigned char buf[4];
     buf[0] = 0x00;	// 這就是Report ID
     buf[1] = 0x01;	
     buf[2] = 0x02;	
     buf[3] = 0x03;	
     res = hid_write(handle, buf, 4);
    

最後把demo上傳,注意編譯運行的時候需要把hidapi.dll文件放到exe所有目錄,打包的時候忘了一起放在裏面,可以去下載hidapi.dll。如果發現編譯後不能正常運行可以根據上面提示查一下是不是少庫,demo裏面是我自己的HID設備,讀者要正常使用需要根據自己使用的HID設備修改hid_open() 前兩個參數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章