Qt 调用USB HID设备读写

2024-08-21 12:48
文章标签 qt 调用 读写 设备 usb hid

本文主要是介绍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 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设备读写的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1093203

相关文章

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Python中Tensorflow无法调用GPU问题的解决方法

《Python中Tensorflow无法调用GPU问题的解决方法》文章详解如何解决TensorFlow在Windows无法识别GPU的问题,需降级至2.10版本,安装匹配CUDA11.2和cuDNN... 当用以下代码查看GPU数量时,gpuspython返回的是一个空列表,说明tensorflow没有找到

python如何调用java的jar包

《python如何调用java的jar包》这篇文章主要为大家详细介绍了python如何调用java的jar包,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录一、安装包二、使用步骤三、代码演示四、自己写一个jar包五、打包步骤六、方法补充一、安装包pip3 install

MySQL主从复制与读写分离的用法解读

《MySQL主从复制与读写分离的用法解读》:本文主要介绍MySQL主从复制与读写分离的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、主从复制mysql主从复制原理实验案例二、读写分离实验案例安装并配置mycat 软件设置mycat读写分离验证mycat读

Redis分片集群、数据读写规则问题小结

《Redis分片集群、数据读写规则问题小结》本文介绍了Redis分片集群的原理,通过数据分片和哈希槽机制解决单机内存限制与写瓶颈问题,实现分布式存储和高并发处理,但存在通信开销大、维护复杂及对事务支持... 目录一、分片集群解android决的问题二、分片集群图解 分片集群特征如何解决的上述问题?(与哨兵模

Qt如何实现文本编辑器光标高亮技术

《Qt如何实现文本编辑器光标高亮技术》这篇文章主要为大家详细介绍了Qt如何实现文本编辑器光标高亮技术,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录实现代码函数作用概述代码详解 + 注释使用 QTextEdit 的高亮技术(重点)总结用到的关键技术点应用场景举例示例优化建议

Qt 设置软件版本信息的实现

《Qt设置软件版本信息的实现》本文介绍了Qt项目中设置版本信息的三种常用方法,包括.pro文件和version.rc配置、CMakeLists.txt与version.h.in结合,具有一定的参考... 目录在运行程序期间设置版本信息可以参考VS在 QT 中设置软件版本信息的几种方法方法一:通过 .pro

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET

VS配置好Qt环境之后但无法打开ui界面的问题解决

《VS配置好Qt环境之后但无法打开ui界面的问题解决》本文主要介绍了VS配置好Qt环境之后但无法打开ui界面的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目UKeLvb录找到Qt安装目录中designer.UKeLvBexe的路径找到vs中的解决方案资源

C/C++和OpenCV实现调用摄像头

《C/C++和OpenCV实现调用摄像头》本文主要介绍了C/C++和OpenCV实现调用摄像头,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录准备工作1. 打开摄像头2. 读取视频帧3. 显示视频帧4. 释放资源5. 获取和设置摄像头属性