本文主要是介绍Qt 调用USB HID设备读写,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Qt 调用USB HID设备读写
- 准备工作
- 测试
准备工作
由于Qt本身没有可以直接调用的库,为了快速实现功能找到了第三方的资源:https://github.com/signal11/hidapi 下载下来的是源文件,如果是在Windows下需要借助编译工具编译成库文件才能在Qt中使用,具体在说明在下载下来的README.txt文件中,不想麻烦的话这里提供了编译好的资源,编译器用的MinGW32。
需要用到的文件供3个:
- hidapi.dll放到编译生成的.exe的同级目录,这个需要新建一个工程先编译一次才会有。
- hidapi.h和hidapi.lib就可以放在工程目录下
顺便说一下,读者在放好上面几个文件并操作完下面前三个步骤后再编译一次,如果编译正常通过并没有报错闪退,那就恭喜你,可以略过这一部分继续测试后面的操作。由于我自己在做的时候始终会出现程序异常结束的提示,最后发现系统缺少一个库msvcr100d.dll,到网上找了一个放到系统下就正常了,如果读者在测试的时候也出现程序异常结束的提示,可以按照如下操作判断自己是否也缺少库(当然也有可能和我缺少的不一样):
-
打开打包命令行窗口,这里选哪一个是和自己建工程时选的编译器有关,不要选错了。
-
移动路径到编译生成的.exe目录下
-
执行指令windeployqt **.exe,两个*替换成自己的exe名字,别直接复制过去运行。
-
命令执行完过后直接双击运行.exe文件,这个时候就会提示.dll找不到,自己去网上找到相应的库下载下来放到系统盘对应的目录(各位测试的时候可能和我少的不一样,甚至不止缺少一个,全部找齐就好了),不同操作系统路径可能不太一样,自己根据情况操作。如果不知道自己该放到哪里的话直接放到.exe的同级目录下也可以。找齐过后再运行就OK了,然后到编译器里面编译运行也没有问题,至少我自己是这样,如果还有其它问题也欢迎留言一起解决。
测试
- 头文件添加。
#include "hidapi.h"
- 在.pro文件最后添加库,PRO_FILE_PWD表示.pro所在路径hidapi就是库名。
LIBS += -L$$_PRO_FILE_PWD_/ -lhidapi
- 初始化调用,hidapi.h中说得比较清楚,这一步不是必要的,因为在hid_enumerate() 和hid_open() 这些函数里面也会调用。
int res; res = hid_init();
- 打开指定HID设备,第一个参数是设备的VID,第二个参数是设备的PID,第三个是设备的序列号,一般就指定前两个参数第三个参数填0就可以。返回的类似文件操作的句柄,通过它来读写。
设备的VID和PID可以从设备管理器里面查找,注意的是这里看到的是16进制:hid_device *handle; handle = hid_open(0x1345, 0x4004, NULL);
- 读数据,hid_read()返回值为实际读取到的数据长度,handle是通过hid_open() 得到的。读取到的数据就放在buf里面,这几行可以放到线程中,根据长度判断是否有获取到数据再来处理。
int res=0; unsigned char buf[128]; res = hid_read(handle, buf, 128);
- 写数据,这里需要注意的是数组的第一个字节必须是设备的Report ID,如果只支持一个那么就填0,比如需要发送3个字节,0x01,0x02,0x03,那么就需要按照如下操作:
int res; // 如果返回-1表示发送失败 unsigned char buf[4];buf[0] = 0x00; // 这就是Report IDbuf[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() 前两个参数。
这篇关于Qt 调用USB HID设备读写的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!