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

devtools/2024/9/25 3:28:36/

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

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

1、ui串口设置界面

2、ui串口接收设置界面

3、ui串口发送设置界面

4、更改UI界面控件名称

5、ui界面整体图

二、运行查看UI界面效果

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

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QtSerialPort>QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic: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
#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);//将数据位默认选项就是8ui->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);// 设置默认定时时长1000msconnect(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,选中为2if(arg1 == 0){timSend->stop();}else{timSend->start(ui->sendTimeTextEdit->toPlainText().toInt());// 设置定时时长,重新计数}
}

四、完整工程

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


http://www.ppmy.cn/devtools/38461.html

相关文章

Github 2024-05-05 开源项目日报Top10

根据Github Trendings的统计,今日(2024-05-05统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量TypeScript项目3JavaScript项目3Jupyter Notebook项目1C项目1Shell项目1PHP项目1Blade项目1MDX项目1Python项目1Java项目1HTML项目1免费编程学习…

数据库管理-第186期 23ai:啥?我还能干掉Neo4j?(20240509)

数据库管理186期 2024-05-09 数据库管理-第186期 23ai:啥&#xff1f;我还能干掉Neo4j&#xff1f;&#xff08;20240509&#xff09;1 基本概念2 属性图的结构模型2.1 在数据库中运行图查询的结构模型2.2 运行图分析的结构模型2.2.1 属性图的大小建议 2.3 使用图服务器功能作为…

ABC 350 C - Sort

C - Sort (atcoder.jp) 思路 就按举的例子来说&#xff1a; 输入&#xff1a; 5 34125输出&#xff1a; 2 1 3 2 4 The operations change the sequence as follows: Initially, A(3,4,1,2,5).The first operation swaps the first and third elements, making (1,4,3,2…

生成式人工智能教学解决方案

一、软件技术人员的需求分析 在当今信息化社会&#xff0c;软件技术作为推动科技创新和经济发展的核心力量&#xff0c;其重要性日益凸显。随着数字化转型的加速推进&#xff0c;各行各业对软件技术人才的需求呈现出多元化、高端化的发展趋势。以下是软件技术人员需求的详细分…

医药垃圾分类管理系统|基于SSM医药垃圾分类管理系统的系统设计与实现(源码+数据库+文档)

医药垃圾分类管理系统 目录 基于SSM医药垃圾分类管理系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1系统登录模块 2管理员模块实现 3用户模块实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博…

【Web前端】定位_浮动_音视频

1、定位 1.1想对定位 相对定位&#xff0c;使用relative&#xff0c;参考点是标签之前的位置&#xff0c;不是相对于父节点、同级节点或浏览器。相对定位通过left、right进行水平偏移&#xff0c;通过top、bottom进行垂直偏移Ieft:表示相对于原本位置的左外边界右移的距离rig…

领域驱动设计架构演进

领域驱动设计由于其强调对领域的深入理解和关注业务价值,其架构演进依赖于领域的变化和特定领域中的技术实践。 初始阶段 一个单体架构,所有的功能都集成在一个应用程序中,领域模型可能还不完全清晰,甚至并未形成。这个阶段主要是为了验证产品的可行性,快速迭代并尽快推…

CSS中的Float(浮动)

CSS中的Float&#xff08;浮动&#xff09; 目录 CSS中的Float&#xff08;浮动&#xff09; 一、 什么是Float&#xff1f; 二、 Float的工作原理 三、Float的属性值 四、Float的清除 五、 Float的注意事项 六、 Float的代码示例 七、Float的最佳实践 一、 什么是Floa…