date:2017/04/24 14:42
開發環境:Qt 5.8.0 msvc2015 32bit + VS Community 2015
由於Qt不帶有完整的USB API,因此在做通信時需要使用第三方API來實現。
1、編譯生成API庫文件
首先介紹一下要用到的API。
我做的是hid通信,網上常見API有三種:
①HID API(下載地址:http://github.com/signal11/hidapi/downloads)
②libusb(下載地址:https://github.com/libusb/libusb/archive/master.zip)
③libhid(下載地址:http://alioth.debian.org/frs/?group_id=30451)
其中hidapi和libhid均是基於libusb針對hid設備接口進行二次開發而成。我在項目中剛開始使用的是hidapi,目前正在嘗試libhid。
這里簡單說明一下hidapi和libhid的區別:
hidapi可以說是libapi的簡化版,使用更為簡便,但功能也相對單一,僅提供基本的設備初始化、枚舉、關閉、讀寫操作。作者@飛奔在原野在這篇博客中寫道:
HIDAPI只能提供對單一接口、單一端點的控制,也就是說,它只能控制默認接口、默認端點的數據傳輸。
而libhid則可以實現對HID設備的多接口、多端點的控制,通過查看源碼可以證實這一點:
hidapi:
int HID_API_EXPORT HID_API_CALL hid_read(hid_device *device, unsigned char *data, size_t length )
hid_return hid_interrupt_read(HIDInterface *const hidif, unsigned int const ep,//指定傳輸端口 char *const bytes, unsigned int const size, unsigned int const timeout )
傳輸方式均為中斷傳輸。
(關於USB中的傳輸方式,可以參考:usb中的endpoint(端點)和傳輸模式)
然后開始生成庫文件。
上述的api都提供了Windows、Linux、Mac OS等多平台支持。以我使用的Windows為例,找到msvc文件夾(或者Windows相關文件夾)打開vs的解決方案文件.sln,運行vs2015進行編譯。注意,在生成——配置管理器中,如果開發平台選的是Win32,相應的Qt編譯器也必須是32位(例如我的就是msvc2015_x86)。如果平台不對應會導致Qt工程加載api庫后找不到相關文件。
2、添加庫文件
庫文件生成成功后,在win32——debug——dll文件夾中找到.dll和.lib文件,拷貝到Qt工程所在目錄下,同時還需要拷貝api的頭文件.h並將頭文件包含到其他頭文件中。在Qt工程配置文件.pro中,右鍵——添加庫——外部庫,添加文件路徑,即可將庫文件添加到Qt工程。
這時,如果馬上調用庫中的函數進行編譯,Qt可能會報錯LNK2019或者LNK1120:
因此在添加庫文件后,最好將構建目錄的Debug(或者Release)文件夾刪除,重啟Qt然后重新編譯工程。