Qt : 实现串口的同步和异步读写消息

一、同步/异步

在串口通信中,同步和异步读写消息是两种常见的通信模式。下面简要介绍它们的区别和示例:

同步读写消息

  • 同步读写:在同步通信中,发送方发送数据后会等待接收方的响应,直到接收到响应后才继续执行后续操作。这种方式是阻塞的,发送和接收是一对一的,直到数据传输完成。

  • 示例:在串口通信中,同步读写消息的示例可能是发送一个数据包到串口,然后等待串口返回响应数据后再继续执行后续操作。这种方式适用于需要确保数据传输完整性和顺序性的场景。

异步读写消息

  • 异步读写:在异步通信中,发送方发送数据后不会等待接收方的响应,而是继续执行后续操作。接收方在接收到数据后会触发一个事件或回调函数来处理接收到的数据。

  • 示例:在串口通信中,异步读写消息的示例可能是发送一个数据包到串口后立即继续执行后续操作,而串口接收到数据后会触发一个信号或回调函数来处理接收到的数据。这种方式适用于需要提高系统的响应速度和并发性能的场景。

二、示例代码

以下是一个简单的示例代码,演示了如何在 Qt 中实现串口的同步和异步读写消息:

cpp 复制代码
#include <QCoreApplication>
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // 同步读写消息
    QSerialPort serialSync;
    serialSync.setPortName("COM1");
    serialSync.open(QIODevice::ReadWrite);
    serialSync.write("Hello, World!");
    serialSync.waitForReadyRead();
    QByteArray responseData = serialSync.readAll();
    qDebug() << "Received response synchronously:" << responseData;

    // 异步读写消息
    QSerialPort serialAsync;
    serialAsync.setPortName("COM2");
    serialAsync.open(QIODevice::ReadWrite);
    QObject::connect(&serialAsync, &QSerialPort::readyRead, [&](){
        QByteArray responseData = serialAsync.readAll();
        qDebug() << "Received response asynchronously:" << responseData;
    });
    serialAsync.write("Hello, World!");

    return a.exec();
}

这段代码演示了如何在 Qt 中实现串口的同步和异步读写消息。在同步通信中,使用 waitForReadyRead 方法等待数据的到达;在异步通信中,通过连接 readyRead 信号来处理接收到的数据。

相关推荐
Larry_Yanan2 小时前
Qt多进程(二)QProcess+stdio
开发语言·qt
码农葫芦侠2 小时前
Qt 跨线程内存管理陷阱:QSharedPointer、deleteLater() 与 QPointer 的致命组合
开发语言·数据库·qt
CC.GG3 小时前
【Qt】信号和槽
开发语言·数据库·qt
水煎包V:YEDIYYDS8887 小时前
QT QML 实现的旋钮按钮,类似收音机音量旋钮,可指示方向和角度
qt·qml·旋钮组件
龚建波7 小时前
Qt程序设计:QPromise/QFuture多线程任务管理
qt·qfuturewatcher·qpromise·qfuture
追烽少年x7 小时前
Qt面试题合集(三)
qt
FirstFrost --sy8 小时前
Qt控件美化:LineEdit与CheckBox实战
开发语言·qt
Larry_Yanan16 小时前
Qt多进程(一)进程间通信概括
开发语言·c++·qt·学习
小灰灰搞电子20 小时前
Qt 开发环境选择Qt Creator、Visual Studio还是 VS Code?
开发语言·qt·visual studio