当前位置: 首页 > article >正文

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


http://www.kler.cn/a/413277.html

相关文章:

  • 鸿蒙本地模拟器 模拟TCP服务端的过程
  • Python网络爬虫基础
  • Python图像处理:打造平滑液化效果动画
  • 跨标签通信的几种方式
  • HTTP 管道传输与多路复用
  • 英伟达推出了全新的小型语言模型家族——Hymba 1.5B
  • Linux 上 MySQL 8.0 的备份与恢复实战指南
  • vi/vim文件管理命令练习
  • 基于Spring Boot的林业产品智能推荐平台
  • 【leetcode100】最大子数组和
  • Oracle-伪劣rowid和rownumber的用法
  • 设计模式学习之——责任链模式
  • Educator头歌:离散数学 - 图论
  • 【若依ruoyi Vue前端线上个人服务器部署】以及常见报错问题解决
  • 2024年11月27日Github流行趋势
  • 【Flink-scala】DataStream编程模型之 窗口的划分-时间概念-窗口计算程序
  • Day28 贪心算法 part02
  • CTF之密码学(费纳姆密码)
  • LLamafactory API部署与使用异步方式 API 调用优化大模型推理效率
  • 初识Linux(4):Linux基础环境工具(下)
  • YOLO的框架及版本迭代
  • Mac安装及合规无限使用Beyond Compare
  • Linux iptables 命令详解
  • 【设计模式】【结构型模式(Structural Patterns)】之享元模式(Flyweight Pattern)
  • 八、利用CSS制作导航栏菜单的习题
  • Easyui 实现订单拆分开票功能