前面提到过Qt USB通信四种方案,这里详细介绍我使用的hidapi第三方库。
从官网上下载到最新的压缩包hidapi-0.7.0.zip,解压后查看README.txt,里面介绍了三种Windows、Linux、MacOS三种平台下的编译方式:
------ It can be downloaded from github git clone git://github.com/signal11/hidapi.git Build Instructions ------------------- To build the console test program: Windows: Build the .sln file in the windows/ directory. Linux: cd to the linux/ directory and run make. Mac OS X: cd to the mac/ directory and run make.
1、使用Visual Studio打开hidapi.vcproj,然后编译之。注:因为我使用的是VS2005,由于版本不对应,无法转换hidapi.vcproj到我当前的版本,此时用编辑器打开文件hidapi.vcproj将原本的:
Version="9.00"
2、编译完成之后,在该目录下会生成一个Debug目录,里面有很多文件,其中我们主要用到hidapi.dll和hidapi.lib两个文件。将hidapi.dll拷贝到C:\Windows\system下(至于拷贝到哪个目录,要根据系统是32位还是64位选择不同的路径。)
之后将hidapi.lib文件拷贝到你的工程目录下,这里我当然是拷贝到我的Qt 工程目录下。当然,也要把hidapi.h文件拷贝到Qt工程目录下,因为hidapi.h包含hidapi这个库中所有函数接口的声明,这样在Qt项目中对设备进行操作才不会调试说找不到hid_xxx()某某个函数。
3、在Qt工程中要指定lib文件和header文件。修改Qt的工程文件.pro如下:
HEADERS += hidapi.h
LIBS += -L$$_PRO_FILE_PWD_/LIB/ \ -lhidapi-L指定当前的路径;_PRO_FILE_PWD_指当前.pro文件所在的目录;-l指定.dll文件,这里是指定名字为hidapi的dll文件。
上述配置完成之后就可以对USB设备进行操作。具体如何操作可以参见README里面的用例以及hidapi.h的函数说明。
README里的用例: #include <windows.h> #include <stdio.h> #include <stdlib.h> #include "hidapi.h" #define MAX_STR 255 int main(int argc, char* argv[]) { int res; unsigned char buf[65]; wchar_t wstr[MAX_STR]; hid_device *handle; int i; // Open the device using the VID, PID, // and optionally the Serial number. handle = hid_open(0x4d8, 0x3f, NULL); // Read the Manufacturer String res = hid_get_manufacturer_string(handle, wstr, MAX_STR); wprintf(L"Manufacturer String: %s\n", wstr); // Read the Product String res = hid_get_product_string(handle, wstr, MAX_STR); wprintf(L"Product String: %s\n", wstr); // Read the Serial Number String res = hid_get_serial_number_string(handle, wstr, MAX_STR); wprintf(L"Serial Number String: (%d) %s\n", wstr[0], wstr); // Read Indexed String 1 res = hid_get_indexed_string(handle, 1, wstr, MAX_STR); wprintf(L"Indexed String 1: %s\n", wstr); // Toggle LED (cmd 0x80). The first byte is the report number (0x0). buf[0] = 0x0; buf[1] = 0x80; res = hid_write(handle, buf, 65); // Request state (cmd 0x81). The first byte is the report number (0x0). buf[0] = 0x0; buf[1] = 0x81; res = hid_write(handle, buf, 65); // Read requested state hid_read(handle, buf, 65); // Print out the returned buffer. for (i = 0; i < 4; i++) printf("buf[%d]: %d\n", i, buf[i]); return 0; }