【QT】串口通信

第一步:在工程文件.pro中添加以下代码
QT += core gui serialport

第二步:在.h文件中添加以下代码

// 引入串口通信的两个头文件(第一步)
#include <QtSerialPort/QSerialPort>         // 提供访问串口的功能
#include <QtSerialPort/QSerialPortInfo>     // 提供系统中存在的串口信息
#include <QException>
#include <QDebug>
#include <QDateTime>

public:
    void slotReadData();

public:
    QSerialPort     *serial = nullptr;                          // 定义全局的串口对象(第三步)
    QDateTime dateTime;
    
private slots:
    void on_toolButton_OpenPort_clicked();
    void on_toolButton_ClosePort_clicked();
    void on_toolButton_SendData_clicked();

第三步:在.cpp文件中添加以下代码

// 打开串口
void MainWindow::on_toolButton_OpenPort_clicked()
{
    try {
        if(serial == nullptr) {
            serial = new QSerialPort();
        }
        serial->setPortName("COM6");
        if(serial->open(QIODevice::ReadWrite)) {
            qDebug() << "COM6 open";
            serial->setBaudRate(9600);
            serial->setParity(QSerialPort::NoParity);
            serial->setDataBits(QSerialPort::Data8);
            serial->setStopBits(QSerialPort::OneStop);
            serial->setFlowControl(QSerialPort::NoFlowControl);
            connect(serial, &QSerialPort::readyRead, this, &MainWindow::slotReadData);
        }
    } catch (std::exception ex) {
        QMessageBox::information(NULL, "Title", ex.what(), QMessageBox::Yes, QMessageBox::Yes);
    }
}

// 关闭串口
void MainWindow::on_toolButton_ClosePort_clicked()
{
    if(serial != nullptr && serial->isOpen()) {
        serial->clear();
        serial->close();
        delete serial;
        serial = nullptr;
    }
}

// 异步接收数据处理
void MainWindow::slotReadData()
{
    QByteArray buffer = serial->readAll();
    if(!buffer.isEmpty()) { //如果非空说明有数据接收
        QString buffer_1;
        //转换成16进制大写
        QString str = buffer.toHex().data();
        str = str.toUpper();
        //一个16进制占4位,8位为一字节,所以每两位16进制空一格
        for(int i = 0; i < str.length(); i += 2) {
            QString str_1 = str.mid (i, 2);
            buffer_1 += str_1;
            buffer_1 += " ";
        }
        dateTime = QDateTime::currentDateTime(); //获取系统当前的时间
        QString timeStr = dateTime .toString("yyyy-MM-dd hh:mm:ss");//格式化时间
        ui->textEdit->append("[" + timeStr + "]" + buffer_1);
        ui->textEdit->moveCursor(QTextCursor::End); //移动文本框内的插入符
    }
    buffer.clear();
}

// 发送数据
void MainWindow::on_toolButton_SendData_clicked()
{
    if(serial != nullptr && serial->isOpen()) {
        if(serial != nullptr && serial->isOpen()) {
        //转换成utf8格式的字节流发送
        // (ui->textEdit_Send->toPlainText().toUtf8();
        QString data = ui->textEdit_Send->toPlainText();
        // 按十六进制编码发送
        QByteArray byte = QByteArray::fromHex (data.toLatin1().data());
        serial->write(byte);
    }
    }
}
posted @   qiutian-hao  阅读(456)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示