QT+串口调试助手+扩展版

前言:此文章是这篇文章的拓展 QT+串口调试助手+基本版-CSDN博客,如果需要独立完成串口调试助手直接看基本版文章即可,如果需要完成串口调试助手的其他功能,参考拓展版。

一、更新QT串口调试助手UI界面

1、ui串口设置界面

2、ui串口接收设置界面

3、ui串口发送设置界面

4、更改UI界面控件名称

5、ui界面整体图

二、运行查看UI界面效果

三、串口调试助手功能开发

cpp 复制代码
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QtSerialPort>

QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_openSerialBut_clicked();        //打开串口槽函数
    void serialPort_readyRead();            //串口接收槽函数
    void on_sendBut_clicked();

    void on_clearSendBut_clicked();

    void on_clearReceiveBut_clicked();

    void on_updateSerialBut_clicked();

    void on_sendCheckBox_stateChanged(int arg1);

private:
    Ui::Widget *ui;
    QSerialPort *serial;                    //串口端口
    QTimer *timSend;                    // 定时发送-定时器
};
#endif // WIDGET_H
cpp 复制代码
#include "widget.h"
#include "ui_widget.h"
#include <QMessageBox>
#include <QtSerialPort>
#include <QSerialPortInfo>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    setWindowTitle("Serial_Port");
    serial = new QSerialPort(this);

    ui->dataBitCB->setCurrentIndex(3);//将数据位默认选项就是8
    ui->baundDrateCB->setCurrentIndex(1);//将波特率默认选项是115200

    //通过QSerialPortInfo查找可用串口,但存在一个局限,如果在软件打开后在插入串口,此时串口不可以识别到
    ui->serailCB->clear();
    foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
        ui->serailCB->addItem(info.portName());
    }

    //信号与槽函数,当串口接收到数据后转到对应的接收函数
    connect(serial,SIGNAL(readyRead()),this,SLOT(serialPort_readyRead()));

    // 定时发送-定时器
    timSend = new QTimer;
    timSend->setInterval(1000);// 设置默认定时时长1000ms
    connect(timSend, &QTimer::timeout, this, [=](){
        on_sendBut_clicked();
    });
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_openSerialBut_clicked()
{
    if(ui->openSerialBut->text()==QString("打开串口"))
    {
        //设置串口名
        serial->setPortName(ui->serailCB->currentText());
        //设置波特率
        serial->setBaudRate(ui->baundDrateCB->currentText().toInt());
        //设置数据位
        switch(ui->dataBitCB->currentText().toInt())
        {
            case 8:serial->setDataBits(QSerialPort::Data8);break;
        }
        //设置停止位
        switch (ui->stopBitCB->currentIndex())
        {
            case 0:serial->setStopBits(QSerialPort::OneStop);break;
            case 1:serial->setStopBits(QSerialPort::OneAndHalfStop);break;
            case 2:serial->setStopBits(QSerialPort::TwoStop);break;
        }
        //设置奇偶校验位
        switch(ui->checkBitCB->currentIndex())
        {
            case 0:serial->setParity(QSerialPort::NoParity);break;//无校验
            case 1:serial->setParity(QSerialPort::OddParity);break;//奇校验
            case 2:serial->setParity(QSerialPort::EvenParity);break;//偶校验
        }
        //设置流控制
        serial->setFlowControl(QSerialPort::NoFlowControl);

        //打开串口
        if(!serial->open(QIODevice::ReadWrite))
        {
            QMessageBox::about(NULL,"提示","无法打开串口");
            return;
        }
         ui->openSerialBut->setText(tr("关闭串口"));
    }
    else
    {
        serial->close();//关闭串口
        ui->openSerialBut->setText(tr("打开串口"));
    }
}

void Widget::serialPort_readyRead()                             //串口接收
{
    QByteArray lasttext;
    lasttext=ui->receivePlainTextEdit->toPlainText().toUtf8();//首先将接收文本框的内容全部复制到lasttext里面
    QByteArray receiveText = serial->readAll();//读串口接收数据

    if(ui->timeCheckBox->checkState() ==  Qt::Checked)//时间戳被选中
    {
        QDateTime nowtime = QDateTime::currentDateTime();
        QString str = "[" + nowtime.toString("yyyy-MM-dd hh:mm:ss") + "] "+ "RX: ";//记录当前时间
        str += QString(receiveText).append("\r\n");//数据格式:当前时间+接收内容+换行
        lasttext=lasttext.append(str.toStdString());//显示数据:之前数据+当前数据
    }
    else
    {
        receiveText = "\r\nRX:"+receiveText;
        lasttext=lasttext.append(receiveText);//显示数据:之前数据+当前数据
    }
    ui->receivePlainTextEdit->setPlainText(lasttext);
}

void Widget::on_sendBut_clicked()
{
    QByteArray Sendtext=ui->sendTextEdit->toPlainText().toUtf8();
    serial->write(Sendtext);
    QString lasttext;

    if(ui->timeCheckBox->checkState() ==  Qt::Checked)//时间戳被选中
    {
        QDateTime nowtime = QDateTime::currentDateTime();
        lasttext=ui->receivePlainTextEdit->toPlainText();//首先将接收文本框的内容全部复制到lasttext里面
        lasttext = lasttext+"[" + nowtime.toString("yyyy-MM-dd hh:mm:ss") + "] "+ "\r\nTX: ";//记录当前时间
        lasttext += ui->sendTextEdit->toPlainText();//数据格式:当前时间+接收内容+换行
    }
    else
    {
        lasttext=ui->receivePlainTextEdit->toPlainText();//首先将接收文本框的内容全部复制到lasttext里面
        lasttext=lasttext+"\r\nTX:"+ui->sendTextEdit->toPlainText();
    }
     ui->receivePlainTextEdit->setPlainText(lasttext);
}


void Widget::on_clearSendBut_clicked()
{
    ui->sendTextEdit->clear();
}


void Widget::on_clearReceiveBut_clicked()
{
    ui->receivePlainTextEdit->clear();
}


void Widget::on_updateSerialBut_clicked()
{
    if(ui->openSerialBut->text() == "打开串口"){
        ui->serailCB->clear();
        //通过QSerialPortInfo查找可用串口
        foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
        {
            ui->serailCB->addItem(info.portName());
        }
    }
}


void Widget::on_sendCheckBox_stateChanged(int arg1)
{
    // 获取复选框状态,未选为0,选中为2
    if(arg1 == 0){
        timSend->stop();
    }else{
        timSend->start(ui->sendTimeTextEdit->toPlainText().toInt());// 设置定时时长,重新计数
    }
}

四、完整工程

链接:https://pan.baidu.com/s/119Aod8D9wsfUbtSgIijAjg?pwd=8888

提取码:8888

相关推荐
Ajiang282473530411 分钟前
对于C++中stack和queue的认识以及priority_queue的模拟实现
开发语言·c++
幽兰的天空16 分钟前
Python 中的模式匹配:深入了解 match 语句
开发语言·python
Theodore_10223 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
----云烟----5 小时前
QT中QString类的各种使用
开发语言·qt
lsx2024065 小时前
SQL SELECT 语句:基础与进阶应用
开发语言
开心工作室_kaic6 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
向宇it6 小时前
【unity小技巧】unity 什么是反射?反射的作用?反射的使用场景?反射的缺点?常用的反射操作?反射常见示例
开发语言·游戏·unity·c#·游戏引擎
武子康6 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
转世成为计算机大神6 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
宅小海7 小时前
scala String
大数据·开发语言·scala