Qt串口通信详解

一、Qt串口通信代码

Qt提供了QSerialPort类来实现串口通信。下面是实现串口的基本代码:

QSerialPort serial;
serial.setPortName("COM1");
serial.setBaudRate(QSerialPort::Baud115200);
serial.setDataBits(QSerialPort::Data8);
serial.setParity(QSerialPort::NoParity);
serial.setStopBits(QSerialPort::OneStop);
serial.setFlowControl(QSerialPort::NoFlowControl);
serial.open(QIODevice::ReadWrite);

setPortName()设置串口名,setBaudRate()设置波特率,setDataBits()设置数据位,setParity()设置校验位,setStopBits()设置停止位,setFlowControl()设置流控制,open()打开串口。

二、Qt串口通信转换为二进制

在进行串口通信时,需要将数据转换为二进制。下面是将字符串转换为二进制的代码:

QString str = "Hello, world!";
QByteArray data = str.toLocal8Bit();

函数toLocal8Bit()将字符串转换为本地8位编码格式,然后使用QByteArray类将数据存储为二进制数据。

三、Qt串口通信多线程

串口通信过程中,需要实现多线程来避免UI界面卡顿问题。下面是多线程的示例:

class SerialThread : public QThread {
    Q_OBJECT
public:
    SerialThread(QSerialPort *port) : m_port(port) {}
protected:
    void run() {
        while(1) {
            if(m_port->waitForReadyRead()) {
                QByteArray data = m_port->readAll();
                emit newData(data);
            }
        }
    }
signals:
    void newData(QByteArray);
private:
    QSerialPort *m_port;
};

SerialThreadrun()函数中,使用waitForReadyRead()等待串口返回数据,在接收后使用emit newData()发送数据信号,UI界面可以通过连接这个信号获得串口数据。

四、Qt串口通信源代码

Qt提供了官方示例代码,可以快速入门串口通信。下面是源代码下载链接:

https://download.qt.io/archive/qt/5.15/5.15.2/single/qt-everywhere-src-5.15.2.tar.xz

下载并解压后,打开Qt Serial Port Example工程即可查看源代码。

五、Qt串口通信 秒脉冲

串口通信中,需要精确控制发送数据时间。下面是实现秒脉冲的代码:

QTimer *timer = new QTimer(this);
connect(timer, &QTimer::timeout, [&]() {
    QByteArray data;
    //拼接二进制数据
    serial.write(data);
});
timer->start(1000); //1秒一次

使用定时器QTimer来实现1秒钟发送一次数据。

六、Qt串口通信原理

串口通信过程中,先发送数据到串口缓冲区,串口将缓冲区数据发送出去并等待接收数据。当接收到数据后,串口通过readyRead()信号通知主程序有数据返回,主程序可以读取缓冲区数据并处理。串口通信遵循RS232标准,可以实现短路保护、缓冲区、校验等功能。

七、Qt实现串口通信

Qt实现串口通信需要使用QSerialPort类,封装串口通信过程,使其可以在Qt UI界面进行调用。下面是实现串口通信的示例代码:

class SerialPort : public QObject
{
    Q_OBJECT
public:
    SerialPort(QObject *parent = nullptr): QObject(parent)
    {
        m_serialPort = new QSerialPort;

        //配置串口参数
        m_serialPort->setPortName("COM1");
        m_serialPort->setBaudRate(QSerialPort::Baud115200);
        m_serialPort->setDataBits(QSerialPort::Data8);
        m_serialPort->setParity(QSerialPort::NoParity);
        m_serialPort->setStopBits(QSerialPort::OneStop);
        m_serialPort->setFlowControl(QSerialPort::NoFlowControl);

        //打开串口
        if(m_serialPort->open(QIODevice::ReadWrite)) {
            //连接信号和槽
            connect(m_serialPort, &QSerialPort::readyRead, this, &SerialPort::readData);
        } else {
            qDebug() <readAll();
        emit newData(data);
    }

signals:
    void newData(QByteArray data);

private:
    QSerialPort *m_serialPort;
};

在上述代码中,使用QSerialPort类实现串口通信,readData()函数中使用readAll()读取串口缓冲区中的所有数据,然后通过newData()信号发送数据。

八、Qt串口助手

Qt提供了串口助手的例子工程,在Qt Creator中可以快速打开。串口助手提供了UI界面进行串口通信调试,包括发送和接收数据。下面是串口助手的截图:

九、Qt多线程通信

Qt提供了多线程通信的支持,可以在不同的线程中传递数据。下面是在不同线程中传递数据的示例:

class MyThread: public QThread
{
    Q_OBJECT
public:
    MyThread(QObject *parent = nullptr) : QThread(parent) {}

protected:
    void run() {
        QByteArray data;
        //数据处理
        emit send(data); //发送数据到主线程
    }

signals:
    void send(QByteArray data);
};

MyThread中,处理数据后发送信号到主线程,主线程可以接收这个信号来获取线程中发送的数据。

原创文章,作者:CTJJ,如若转载,请注明出处:https://www.506064.com/n/134804.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
CTJJ的头像CTJJ
上一篇 2024-10-04 00:08
下一篇 2024-10-04 00:08

相关推荐

  • Qt雷达探测教程

    本文主要介绍如何使用Qt开发雷达探测程序,并展示一个简单的雷达探测示例。 一、环境准备 在开始本教程之前,需要确保你的开发环境已经安装Qt和Qt Creator。如果没有安装,可以…

    编程 2025-04-29
  • Qt State Machine与状态机模式

    本文将介绍Qt State Machine和状态机模式在Qt中的实现。Qt提供了QStateMachine和QState两个类,可以方便地实现状态机模式,并且能有效地处理复杂的、多…

    编程 2025-04-27
  • 跨域通信浮标——实现客户端之间的跨域通信

    本文将介绍跨域通信浮标的使用方法,该浮标可以实现客户端之间的跨域通信,解决了浏览器同源策略的限制,让开发者能够更加方便地进行跨域通信。 一、浮标的原理 跨域通信浮标的原理是基于浮动…

    编程 2025-04-27
  • 通信专业Python和Java的开发技巧

    本文旨在介绍通信专业Python和Java的开发技巧,为读者提供实用且可操作的思路和方法。 一、Python在通信领域中的应用 Python是一种优秀的程序设计语言,因其易学易用、…

    编程 2025-04-27
  • Python中的Qt库

    Qt库是一个跨平台的C++图形用户界面(GUI)工具包。它提供了丰富的界面控件和处理系统事件的功能,可以轻松创建交互界面、图形化应用和多媒体应用。而Python中的Qt库则是Qt的…

    编程 2025-04-27
  • Python调用串口用法介绍

    本文将从以下几个方面详细阐述如何使用Python调用串口进行数据传输。 一、Python调用串口的基本知识 在使用Python调用串口之前,需要了解串口的相关知识。 串口是计算机与…

    编程 2025-04-27
  • xmake qt:构建Qt应用的全流程解决方案

    本文将会详细阐述xmake qt的使用方法以及其能够解决的问题。针对Qt应用开发中的各种困境,xmake提供了一整套的解决方案,包括自动构建、依赖管理、部署打包等,极大地提高了开发…

    编程 2025-04-27
  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • nginx与apache应用开发详解

    一、概述 nginx和apache都是常见的web服务器。nginx是一个高性能的反向代理web服务器,将负载均衡和缓存集成在了一起,可以动静分离。apache是一个可扩展的web…

    编程 2025-04-25

发表回复

登录后才能评论