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

相关推荐
c4fx13 分钟前
Delphi5利用DLL实现窗体的重用
开发语言·delphi·dll
鸽芷咕36 分钟前
【Python报错已解决】ModuleNotFoundError: No module named ‘paddle‘
开发语言·python·机器学习·bug·paddle
Jhxbdks1 小时前
C语言中的一些小知识(二)
c语言·开发语言·笔记
java6666688881 小时前
如何在Java中实现高效的对象映射:Dozer与MapStruct的比较与优化
java·开发语言
Violet永存1 小时前
源码分析:LinkedList
java·开发语言
代码雕刻家1 小时前
数据结构-3.1.栈的基本概念
c语言·开发语言·数据结构
Fan_web1 小时前
JavaScript高级——闭包应用-自定义js模块
开发语言·前端·javascript·css·html
梦想科研社1 小时前
【无人机设计与控制】四旋翼无人机俯仰姿态保持模糊PID控制(带说明报告)
开发语言·算法·数学建模·matlab·无人机
风等雨归期1 小时前
【python】【绘制小程序】动态爱心绘制
开发语言·python·小程序
千穹凌帝1 小时前
SpinalHDL之结构(二)
开发语言·前端·fpga开发