Qt读写Usb设备的数据

news2024/11/27 19:11:25

Qt读写Usb设备的数据

  • 问题:要读取usb设备进行通讯,qt好像没有对应的库支持。
  • 解决:
    • libusb
      • window下载 :
      • Linux下载:
    • QtUsb 开源的第三方库
      • 库里面的函数说明:
      • window版本:
      • Linux中也提供的直接下载
      • 测试代码:
      • 库下载:

问题:要读取usb设备进行通讯,qt好像没有对应的库支持。

解决:

libusb

查看到,基本上使用的都是libusb这库,这个库是支持跨平台的,C语言的库。
官网 http://libusb.info/可以下载到,如下图:
在这里插入图片描述
可以下载源代码,和.7z后缀的window版本的库。

还有的是github的地址:https://github.com/libusb/libusb,如图:
在这里插入图片描述
可以下载对应的源码进行编译。里面有configure文件,编译用的。下载对应的依赖就行。

window下载 :

直接下载对应的relase版本的.7z文件就可以了。

Linux下载:

sudo apt-get install libusb-1.0-0-dev

可以使用对应的API与usb进行数据通讯。

QtUsb 开源的第三方库

dithub地址:https://github.com/fpoussin/QtUsb

这里面库,可以看到有依赖,libusb,hidapi这两个库。

库里面的函数说明:

地址:https://fpoussin.github.io/doxygen/qtusb/0.7.x/qusbendpoint.html

window版本:

提供了msvc编译器版本的直接的下载:
在这里插入图片描述

Linux中也提供的直接下载

不过我在使用Linux中的时候出现了问题,直接下载老是失败。只能是自己编译源代码了。

在这里插入图片描述
需要下载依赖:
libusb-1.0-0-dev, libhidapi-dev and pkg-config

不过我是编译成静态库,方便移动。

测试代码:

#include <QObject>
#include <QCoreApplication>
#include <QtSerialPort/QSerialPort>
#include <QUsbDevice>
#include <QUsbEndpoint>

#include <QByteArray>
#include <QDebug>

const quint8 USB_ENDPOINT_IN = 0x81; /* Bulk output endpoint for responses */
const quint8 USB_ENDPOINT_OUT = 0x01; /* Bulk input endpoint for commands */
const quint16 USB_TIMEOUT_MSEC = 300;

class UsbTest : public QObject
{
    Q_OBJECT
public:
    UsbTest():m_write_ep(nullptr),m_read_ep(nullptr)
    {
        usb = new QUsb;
        connect(usb,&QUsb::deviceInserted,[this](QUsb::Id id){
            qDebug()<<id;
            if(id.pid == 0x5721)
            {
                m_filter = id;

                if (this->openDevice()) {
                    qInfo("Device open!");
                    this->write();
                } else {
                    qWarning("Could not open device!");
                }
            }

        });

        m_usb_dev = new QUsbDevice(this);

        for(auto& elem : usb->devices())
        {
            if(elem.pid == 0x5721)
            {
                m_filter = elem;

                m_usb_dev->setId(m_filter);

                m_config.alternate = 0;
                m_config.config = 1;
                m_config.interface = 0;
                m_usb_dev->setConfig(m_config);

                if (this->openDevice()) {
                    qInfo("Device open!");
                    this->write();
                } else {
                    qWarning("Could not open device!");
                }
            }
        }

        for(int i=0;i<513;i++)
            m_send.append(static_cast<char>(i%10));

    }

    bool openDevice()
    {
        qDebug("Opening");

        if (m_usb_dev->open() == QUsbDevice::statusOK) {
            // Device is open
            return this->openHandle();
        }
        return false;
    }

    bool openHandle()
    {
        if(m_read_ep)
        {
            disconnect(m_read_ep, SIGNAL(readyRead()), this, SLOT(onReadyRead()));
            disconnect(m_write_ep, SIGNAL(bytesWritten(qint64)), this, SLOT(onWriteComplete(qint64)));

            delete m_read_ep;
            delete m_write_ep;
        }

        qDebug("Opening Handle");
        bool a = false, b = false;
        m_read_ep = new QUsbEndpoint(m_usb_dev, QUsbEndpoint::bulkEndpoint, USB_ENDPOINT_IN);
        m_write_ep = new QUsbEndpoint(m_usb_dev, QUsbEndpoint::bulkEndpoint, USB_ENDPOINT_OUT);

        connect(m_read_ep, SIGNAL(readyRead()), this, SLOT(onReadyRead()));
        connect(m_write_ep, SIGNAL(bytesWritten(qint64)), this, SLOT(onWriteComplete(qint64)));



        a = m_read_ep->open(QIODevice::ReadOnly);
        if (a) {
            m_read_ep->setPolling(true);
        }

        b = m_write_ep->open(QIODevice::WriteOnly);

        return a && b;
    }

    void write()
    {
        if(!m_write_ep) return;
        qDebug()<<"写的状态:"<<m_write_ep->status();
        //if(m_write_ep->status() != QUsbEndpoint::transferCompleted)
        //    return;
        qDebug() << "Writing" << m_send << m_send.size();
        if (m_write_ep->write(m_send.constData(), m_send.size()) < 0) {
            qWarning("write failed");
        }
    }
public slots:
    void onReadyRead()
    {
        qDebug()<<"读取数据:"<<m_read_ep->readAll();
    }

    void onWriteComplete(qint64 id)
    {
        qDebug()<<"onWriteComplete:"<<id;
    }

private:
    QUsb* usb;

    QUsbDevice *m_usb_dev;
    QUsb::Id m_filter;
    QUsb::Config m_config;

    QByteArray m_send, m_recv;
    QUsbEndpoint *m_read_ep, *m_write_ep;
};

库下载:

版本:ubantu22.04 ,libusb 1.0 ,静态库。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2248590.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

模板初阶,STL简介(C++)

1.模板 1.1泛型编程 在之前的文章中讲过C支持函数重载&#xff0c;比如实现一个交换函数&#xff0c;可以是不同的数据类型&#xff0c;但是这样&#xff0c;需要增加大量函数&#xff0c;且可维护度比较低。 如&#xff1a; void Swap(int& left, int& right) {int …

Cannot find a valid baseurl for repo: centos-sclo-rh/x86_64

yum install 报错: Cannot find a valid baseurl for repo: centos-sclo-rh/x86_64 CentOS7的SCL源在2024年6月30日停止维护了。 当scl源里面默认使用了centos官方的地址&#xff0c;无法连接&#xff0c;需要替换为阿里云。 cd /etc/yum.repos.d/ 找到 CentOS-SCLo-scl.repo 和…

蓝桥杯不知道叫什么题目

小蓝有一个整数&#xff0c;初始值为1&#xff0c;他可以花费一些代价对这个整数进行变换。 小蓝可以花贵1的代价将教数增加1。 小蓝可以花费3的代价将整数增加一个值,这个值是整数的数位中最大的那个(1到9) .小蓝可以花费10的代价将整数变为原来的2倍, 例如&#xff0c;如果整…

2024年11月HarmonyOS应用开发者高级认证全新题库

注意事项&#xff1a;切记在考试之外的设备上打开题库进行搜索&#xff0c;防止切屏三次考试自动结束&#xff0c;题目是乱序&#xff0c;每次考试&#xff0c;选项的顺序都不同&#xff0c;作者已于2024年11月22日又更新了一波题库&#xff0c;题库正确率99%&#xff01; 新版…

技术文档的高质量翻译对俄罗斯汽车推广的影响

进入新市场需要的不仅仅是一个伟大的产品&#xff1b;它要求深入了解当地消费者的期望、法规和文化差异。对于希望在俄罗斯取得成功的国际汽车制造商来说&#xff0c;技术文件的质量是一个关键因素。手册、规范和服务指南在产品和用户之间形成了直接的桥梁&#xff0c;影响着客…

【组件】前端ElementUi 下拉Tree树形组件 带模糊搜索自动展开高亮功能 树结构 封装为组件使用

【组件】前端ElementUi 下拉Tree树形组件 带模糊搜索自动展开高亮功能 树结构 【组件】前端ElementUi 下拉Tree树形组件 带模糊 https://live.csdn.net/v/436057 单独使用 <template><div><el-popoverstyle"overflow-y: auto; "placement"bottom…

论文阅读:Dual-disentangled Deep Multiple Clustering

目录 摘要 引言 模型 实验 数据集 实验结果 结论 摘要 多重聚类近年来引起了广泛关注&#xff0c;因为它能够从不同的角度揭示数据的多种潜在结构。大多数多重聚类方法通常先通过控制特征之间的差异性来提取特征表示&#xff0c;然后使用传统的聚类方法&#xff08;如 …

SQL 复杂查询

目录 复杂查询 一、目的和要求 二、实验内容 &#xff08;1&#xff09;查询出所有水果产品的类别及详情。 查询出编号为“00000001”的消费者用户的姓名及其所下订单。&#xff08;分别采用子查询和连接方式实现&#xff09; 查询出每个订单的消费者姓名及联系方式。 在…

thread_id_key != 0x7777(`fibers` 包与 Node.js 16 及以上版本存在兼容性问题)

文章目录 fibers4.0.3 与 node-v16.13.2-win-x64 的兼容性1. Node.js 版本兼容性2. 特定包版本 (fibers4.0.3)3. 解决方案和替代方案 结论解决方案 运行yarn serve 启动项目&#xff0c;就会弹出上述错误。 fibers4.0.3 与 node-v16.13.2-win-x64 的兼容性 要判断 fibers4.0.3…

数据结构 (6)栈的应用举例

1. 递归调用 递归函数在执行时&#xff0c;会将每一层的函数调用信息&#xff08;包括局部变量、参数和返回地址&#xff09;存储在栈中。当递归函数返回时&#xff0c;这些信息会从栈中弹出&#xff0c;以便恢复之前的执行状态。栈的后进先出&#xff08;LIFO&#xff09;特性…

网络安全在数字时代保护库存数据中的作用

如今&#xff0c;通过软件管理库存已成为一种标准做法。企业使用数字工具来跟踪库存水平、管理供应链和规划财务。 然而&#xff0c;技术的便利性也带来了网络威胁的风险。黑客将库存数据视为有价值的目标。保护这些数据不仅重要&#xff0c;而且必不可少。 了解网络安全及其…

php常用伪协议整理

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文整理php常见的伪协议 php伪协议介绍 直观点&#xff0c;就是php可以识别的协议。 类似于我们访问网站的http协议&#xff0c;我们用浏览器访问我们自己本地文件的file协议等。 php可以识别这些协议&#xf…

【软件入门】Git快速入门

Git快速入门 文章目录 Git快速入门0.前言1.安装和配置2.新建版本库2.1.本地创建2.2.云端下载 3.版本管理3.1.添加和提交文件3.2.回退版本3.2.1.soft模式3.2.2.mixed模式3.2.3.hard模式3.2.4.使用场景 3.3.查看版本差异3.4.忽略文件 4.云端配置4.1.Github4.1.1.SSH配置4.1.2.关联…

【SpringBoot】28 API接口防刷(Redis + 拦截器)

Gitee仓库 https://gitee.com/Lin_DH/system 介绍 常用的 API 安全措施包括&#xff1a;防火墙、验证码、鉴权、IP限制、数据加密、限流、监控、网关等&#xff0c;以确保接口的安全性。 常见措施 1&#xff09;防火墙 防火墙是网络安全中最基本的安全设备之一&#xff0c…

零基础学安全--shell脚本学习(1)脚本创建执行及变量使用

目录 学习连接 什么是shell shell的分类 查看当前系统支持shell 学习前提 开始学习 第一种执行脚本方法 ​编辑 第二种执行脚本方法 第三种执行脚本方法 变量声明和定义 ​编辑 查看变量 删除变量 学习连接 声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣…

基于FPGA的FM调制(载波频率、频偏、峰值、DAC输出)-带仿真文件-上板验证正确

基于FPGA的FM调制-带仿真文件-上板验证正确 前言一、FM调制储备知识载波频率频偏峰值个人理解 二、代码分析1.模块分析2.波形分析 总结 前言 FM、AM等调制是学习FPGA信号处理一个比较好的小项目&#xff0c;通过学习FM调制过程熟悉信号处理的一个简单流程&#xff0c;进而熟悉…

“AI玩手机”原理揭秘:大模型驱动的移动端GUI智能体

作者&#xff5c;郭源 前言 在后LLM时代&#xff0c;随着大语言模型和多模态大模型技术的日益成熟&#xff0c;AI技术的实际应用及其社会价值愈发受到重视。AI智能体&#xff08;AI Agent&#xff09;技术通过集成行为规划、记忆存储、工具调用等机制&#xff0c;为大模型装上…

路由策略与路由控制实验

AR1、AR2、AR3在互联接口、Loopback0接口上激活OSPF。AR3、AR4属于IS-IS Area 49.0001&#xff0c;这两者都是Level-1路由器&#xff0c;AR3、AR4的系统ID采用0000.0000.000x格式&#xff0c;其中x为设备编号 AR1上存在三个业务网段A、B、C&#xff08;分别用Loopback1、2、3接…

uniapp开发微信小程序笔记8-uniapp使用vant框架

前言&#xff1a;其实用uni-app开发微信小程序的首选不应该是vant&#xff0c;因为vant没有专门给uni-app设置专栏&#xff0c;可以看到目前Vant 官方提供了 Vue 2 版本、Vue 3 版本和微信小程序版本&#xff0c;并由社区团队维护 React 版本和支付宝小程序版本。 但是vant的优…

Qt-系统相关(1)事件文件

Qt事件 事件介绍 事件是应⽤程序内部或者外部产⽣的事情或者动作的统称。在 Qt 中使⽤⼀个对象来表⽰⼀个事件。所有的 Qt 事件均继承于抽象类 QEvent。事件是由系统或者 Qt 平台本⾝在不同的时刻发出的。当⽤⼾按下⿏标、敲下键盘&#xff0c;或者是窗⼝需要重新绘制的时候&a…