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

相关文章

10. 文件的读写

10.1 文本文件 操作文件三大类: ofstream:写操作ifstream:读操作fstream:读写操作 打开方式解释ios::in为了读文件而打开文件ios::out为了写文件而打开文件,如果当前文件存在则清空当前文件在写入ios::app追加方式写文件ios::trunc如果文件存在先删除,在创建ios::ate打开文件之后令读写位置移至文件尾端ios::binary二进制方式

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

如何编写Linux PCIe设备驱动器 之二

如何编写Linux PCIe设备驱动器 之二 功能(capability)集功能(capability)APIs通过pci_bus_read_config完成功能存取功能APIs参数pos常量值PCI功能结构 PCI功能IDMSI功能电源功率管理功能 功能(capability)集 功能(capability)APIs int pcie_capability_read_wo

【LabVIEW学习篇 - 21】:DLL与API的调用

文章目录 DLL与API调用DLLAPIDLL的调用 DLL与API调用 LabVIEW虽然已经足够强大,但不同的语言在不同领域都有着自己的优势,为了强强联合,LabVIEW提供了强大的外部程序接口能力,包括DLL、CIN(C语言接口)、ActiveX、.NET、MATLAB等等。通过DLL可以使用户很方便地调用C、C++、C#、VB等编程语言写的程序以及windows自带的大

【QT】基础入门学习

文章目录 浅析Qt应用程序的主函数使用qDebug()函数常用快捷键Qt 编码风格信号槽连接模型实现方案 信号和槽的工作机制Qt对象树机制 浅析Qt应用程序的主函数 #include "mywindow.h"#include <QApplication>// 程序的入口int main(int argc, char *argv[]){// argc是命令行参数个数,argv是

Python QT实现A-star寻路算法

目录 1、界面使用方法 2、注意事项 3、补充说明 用Qt5搭建一个图形化测试寻路算法的测试环境。 1、界面使用方法 设定起点: 鼠标左键双击,设定红色的起点。左键双击设定起点,用红色标记。 设定终点: 鼠标右键双击,设定蓝色的终点。右键双击设定终点,用蓝色标记。 设置障碍点: 鼠标左键或者右键按着不放,拖动可以设置黑色的障碍点。按住左键或右键并拖动,设置一系列黑色障碍点

使用Qt编程QtNetwork无法使用

使用 VS 构建 Qt 项目时 QtNetwork 无法使用的问题 - 摘叶飞镖 - 博客园 (cnblogs.com) 另外,强烈建议在使用QNetworkAccessManager之前看看这篇文章: Qt 之 QNetworkAccessManager踏坑记录-CSDN博客 C++ Qt开发:QNetworkAccessManager网络接口组件 阅读目录 1.1 通用API函数

string字符会调用new分配堆内存吗

gcc的string默认大小是32个字节,字符串小于等于15直接保存在栈上,超过之后才会使用new分配。