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

相关文章

C++读写word文档(.docx)DuckX库的使用详解

《C++读写word文档(.docx)DuckX库的使用详解》DuckX是C++库,用于创建/编辑.docx文件,支持读取文档、添加段落/片段、编辑表格,解决中文乱码需更改编码方案,进阶功能含文本替换... 目录一、基本用法1. 读取文档3. 添加段落4. 添加片段3. 编辑表格二、进阶用法1. 文本替换2

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe

使用Go调用第三方API的方法详解

《使用Go调用第三方API的方法详解》在现代应用开发中,调用第三方API是非常常见的场景,比如获取天气预报、翻译文本、发送短信等,Go作为一门高效并发的编程语言,拥有强大的标准库和丰富的第三方库,可以... 目录引言一、准备工作二、案例1:调用天气查询 API1. 注册并获取 API Key2. 代码实现3

录音功能在哪里? 电脑手机等设备打开录音功能的技巧

《录音功能在哪里?电脑手机等设备打开录音功能的技巧》很多时候我们需要使用录音功能,电脑和手机这些常用设备怎么使用录音功能呢?下面我们就来看看详细的教程... 我们在会议讨论、采访记录、课堂学习、灵感创作、法律取证、重要对话时,都可能有录音需求,便于留存关键信息。下面分享一下如何在电脑端和手机端上找到录音功能

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

QT Creator配置Kit的实现示例

《QTCreator配置Kit的实现示例》本文主要介绍了使用Qt5.12.12与VS2022时,因MSVC编译器版本不匹配及WindowsSDK缺失导致配置错误的问题解决,感兴趣的可以了解一下... 目录0、背景:qt5.12.12+vs2022一、症状:二、原因:(可以跳过,直奔后面的解决方法)三、解决方

Java调用Python脚本实现HelloWorld的示例详解

《Java调用Python脚本实现HelloWorld的示例详解》作为程序员,我们经常会遇到需要在Java项目中调用Python脚本的场景,下面我们来看看如何从基础到进阶,一步步实现Java与Pyth... 目录一、环境准备二、基础调用:使用 Runtime.exec()2.1 实现步骤2.2 代码解析三、

Python如何调用另一个类的方法和属性

《Python如何调用另一个类的方法和属性》在Python面向对象编程中,类与类之间的交互是非常常见的场景,本文将详细介绍在Python中一个类如何调用另一个类的方法和属性,大家可以根据需要进行选择... 目录一、前言二、基本调用方式通过实例化调用通过类继承调用三、高级调用方式通过组合方式调用通过类方法/静

C#控制台程序同步调用WebApi实现方式

《C#控制台程序同步调用WebApi实现方式》控制台程序作为Job时,需同步调用WebApi以确保获取返回结果后执行后续操作,否则会引发TaskCanceledException异常,同步处理可避免异... 目录同步调用WebApi方法Cls001类里面的写法总结控制台程序一般当作Job使用,有时候需要控制

Python用Flask封装API及调用详解

《Python用Flask封装API及调用详解》本文介绍Flask的优势(轻量、灵活、易扩展),对比GET/POST表单/JSON请求方式,涵盖错误处理、开发建议及生产环境部署注意事项... 目录一、Flask的优势一、基础设置二、GET请求方式服务端代码客户端调用三、POST表单方式服务端代码客户端调用四