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()前两个参数。