Qt读写Usb设备的数据

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 ,静态库。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024最新python使用yt-dlp

2024最新python使用yt-dlp下载YT视频 1.获取yt的cookie1&#xff09;google浏览器下载Get cookies.txt LOCALLY插件2&#xff09;导出cookie 2.yt-dlp下载[yt-dlp的GitHub地址](https://github.com/yt-dlp/yt-dlp?tabreadme-ov-file)1&#xff09;使用Pycharm(2024.3)进行代码…

一加ACE 3 Pro手机无法连接电脑传输文件问题

先说结论&#xff1a;OnePlus手机无法连接电脑传输数据的原因&#xff0c;大概率是一加数据线的问题。尝试其他手机品牌的数据线&#xff08;比如华为&#xff09;&#xff0c;再次尝试。 连接电脑方法&#xff1a; 1 打开开发者模式&#xff08;非必要操作&#xff09; 进入…

java:aqs实现自定义锁

aqs采用模板方式设计模式&#xff0c;需要重写方法 package com.company.aqs;import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.AbstractQueuedSynchronizer; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock;…

linux系统下如何将xz及ISO\img等格式压缩包(系统)烧写到优盘(TF卡)

最近用树莓派做了个NAS&#xff0c;效果一般&#xff0c;缺少监控及UI等&#xff0c;详细见这篇文章&#xff1a; https://blog.csdn.net/bugsycrack/article/details/135344782?spm1001.2014.3001.5501 所以下载了专门的基于树莓派的NAS系统直接使用。这篇文章是顺便复习一…

python除了熟悉的pandas,openpyxl库也很方便的支持编辑Excel表

excel表格是大家经常用到的文件格式&#xff0c;各行各业都会跟它打交道。之前文章我们介绍了使用openpyxl和xlrd库读取excel表数据&#xff0c;使用xlwt库创建和编辑excel表&#xff0c;在办公自动化方面可以方便我们快速处理数据&#xff0c;帮助我们提升效率。 python之open…

【VUE3】新版Vue3+ElementPlus全家桶开发视频项目实战

VUE 介绍 Vue (发音为 /vjuː/,类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。 Vue.js是一个MVVM(Model - View - ViewModel)的SPA框架。 Model:数…

介绍一下atol(arr);(c基础)

hi , I am 36 适合对象c语言初学者 atol(arr)&#xff1b;是返回整数(long型)&#xff0c;整数是arr数组中字符中数字 格式 #include<stdio.h> atol(arr); 返回值arr数组中的数字 未改变arr数组 #include<stdio.h> //atol(arr); 返 <stdlib> int main…

微信小程序WXSS全局样式与局部样式的使用教程

微信小程序WXSS全局样式与局部样式的使用教程 引言 在微信小程序的开发中,样式的设计与实现是提升用户体验的关键部分。WXSS(WeiXin Style Sheets)作为微信小程序的样式表语言,不仅支持丰富的样式功能,还能通过全局样式与局部样式的灵活运用,帮助开发者构建美观且易于维…

OceanBase 大数据量导入(obloader)

现需要将源数据库&#xff08;Oracle|MySQL等&#xff09;一些表的海量数据迁移到目标数据库 OceanBase 中&#xff0c;基于常规 jdbc 驱动编码的方式涉及开发工作&#xff0c;性能效率也要看编码的处理机制。 OceanBase 官方提供了的 OceanBase Migration Service (OMS) 数据…

Spring Boot框架:英语知识网站构建指南

3系统分析 3.1可行性分析 通过对本英语知识应用网站实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本英语知识应用网站采用SSM框架&#xff0c;JAVA作为开发语…

路由器中继与桥接

一 . 背景 现在的路由器大多数已经开始支持多种网络连接模式&#xff0c;以下将以TP-Link迷你无线路由器为例进行展开介绍。在TP-Link迷你无线路由器上一般有AP&#xff08;接入点&#xff09;模式&#xff0c;Router&#xff08;无线路由&#xff09;模式&#xff0c;Repeate…

Paddle Inference部署推理(一)

一&#xff1a;Paddle Inference推理 简介 Paddle Inference 是飞桨的原生推理库&#xff0c;提供服务器端的高性能推理能力。由于 Paddle Inference 能力直接基于飞桨的训练算子&#xff0c;因此它支持飞桨训练出的所有模型的推理。 Paddle Inference 功能特性丰富&#xff…

前端 vue3 + element-plus + ts 对话框示例

【父组件】&#xff1a;SampleInput.vue&#xff0c;局部代码片段 引入子组件 ApplyItemChooseDialog.vue&#xff0c;定义变量&#xff0c;用于渲染和显示标识 <script>片段代码 import ApplyItemChooseDialog from "/views/accept/ApplyItemChooseDialog.vue&q…

【最优清零方案——贪心+滑动窗口:暴力/线段树/单调队列】

题目 暴力 #include <bits/stdc.h> using namespace std; using ll long long; const int N 1e6 10; int a[N]; int main() {int n, k;cin >> n >> k;ll sum 0;for (int i 1; i < n; i)cin >> a[i], sum a[i];int minn 1e9, pos;ll cnt 0…

Python爬取豆瓣电影全部分类数据并存入数据库

在当今数字化的时代&#xff0c;网络上丰富的影视资源信息吸引着众多开发者去挖掘和利用。今天&#xff0c;我就来和大家分享一段有趣的代码&#xff0c;它能够从豆瓣电影平台获取相关数据并存储到数据库中哦。 结果展示&#xff08;文末附完整代码&#xff09;&#xff1a; 目…

数据结构 ——— 归并排序算法的实现

目录 归并排序的思想 归并排序算法的实现 归并排序的思想 将已经有序的子序列合并&#xff0c;得到完全有序的序列&#xff0c;即先使每个子序列有序后&#xff0c;再使子序列段间有序 若将两个有序表合并成一个有序表&#xff0c;称为二路归并 归并排序步骤示意图&#x…

vue2面试题11|[2024-11-25]

1.vue源码-模版解析 <!DOCTYPE html> <html> <head><title></title> </head> <body><div idapp><h1> {{ str }} </h1>{{ str }} </div></body><script type"text/javascript" srcvue.js…

web博客系统的自动化测试

目录 前言测试用例编写自动化脚本测试准备博客登录页相关测试用例登陆成功登录失败 博客首页相关测试用例登陆成功登录失败 博客详情页相关测试用例登录成功登录失败 博客编辑页相关测试用例登陆成功登录失败 编写测试文档测试类型内容 前言 本次测试是运用个人写的一个博客系…

MATLAB矩阵元素的修改及删除

利用等号赋值来进行修改 A ( m , n ) c A(m,n)c A(m,n)c将将矩阵第 m m m行第 n n n列的元素改为 c c c&#xff0c;如果 m m m或 n n n超出原来的行或列&#xff0c;则会自动补充行或列&#xff0c;目标元素改为要求的&#xff0c;其余为 0 0 0 A ( m ) c A(m)c A(m)c将索引…

告别 Kafka,拥抱 Databend:构建高效低成本的用户行为分析体系

用户行为数据埋点指标是数据仓库中不可或缺的重要数据源之一&#xff0c;同时也是企业最宝贵的资产之一。通常情况下&#xff0c;用户行为数据分析包含两大数据源&#xff1a;用户行为分析日志和上游关系型数据库&#xff08;如 MySQL&#xff09;。基于这些数据&#xff0c;企…