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

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

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

1、ui串口设置界面

2、ui串口接收设置界面

3、ui串口发送设置界面

4、更改UI界面控件名称

5、ui界面整体图

二、运行查看UI界面效果

我们发现UI设计界面与运行时显示界面不一致,一般导致该现象的原因有:显示屏分辨率过高

 

解决办法是:如果想要界面自适应电脑分辨率大小,可以将所有组件的sizePolicy中的Horizontal Policy和Vertical Policy设置成Ignored,再进行布局。

将sizePolicy更改之后,再次运行界面程序,我们很明显感觉到UI界面整体更加美观。

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

 

#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
#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/1eYDk0LrXw3CFAjd66YYpug?pwd=8888 
提取码:8888

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/592954.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java与Go: 生产者消费者模型

什么是生产者消费者模型 生产者-消费者模型&#xff08;也称为生产者-消费者问题&#xff09;是一种常见的并发编程模型&#xff0c;用于处理多线程或多进程之间的协同工作。该模型涉及两个主要角色&#xff1a;生产者和消费者&#xff0c;一个次要角色&#xff1a;缓冲区。 生…

Unity---版本控制软件

13.3 版本控制——Git-1_哔哩哔哩_bilibili Git用的比较多 Git 常用Linux命令 pwd&#xff1a;显示当前所在路径 ls&#xff1a;显示当前路径下的所有文件 tab键自动补全 cd&#xff1a;切换路径 mkdir&#xff1a;在当前路径下创建一个文件夹 clear&#xff1a;清屏 vim…

EtherCAT通信总线状态监视

1、EtherCAT总线运动控制学习笔记 EtherCAT总线运动控制学习笔记(RXXW_Dor)_汇川pdo控制命令607a-CSDN博客文章浏览阅读3.3k次,点赞3次,收藏9次。说到总线控制,就要说到报文、对象字典、PN通信我们大部分会说报文,EtherCAT通信我们常说对象字典,叫法不一样,但是原理基…

OneFlow深度学习框原理、用法、案例和注意事项

本文将基于OneFlow深度学习框架&#xff0c;详细介绍其原理、用法、案例和注意事项。OneFlow是由中科院计算所自动化研究所推出的深度学习框架&#xff0c;专注于高效、易用和扩展性强。它提供了一种类似于深度学习库的接口&#xff0c;可以用于构建神经网络模型&#xff0c;并…

数据结构---单链表

题目&#xff1a;构造一个单链表。 使用的软件&#xff1a;VS2022使用的语言&#xff1a;C语言使用的项目&#xff1a;test.c Setlist.h Setlish.c 项目实践&#xff1a; Setlist.h的代码为&#xff1a; #pragma once#include<stdio.h> #include<stdlib.h> #incl…

SQL注入基础-3

一、宽字节注入 1、宽字节&#xff1a;字符大小为两个及以上的字节&#xff0c;如GBK&#xff0c;GB2312编码 2、数据库使用GBK编码时&#xff0c;会将两个字符合并为一个汉字(宽字节)。特殊值字符如单引号都会被转义【--->\】&#xff0c;如sqli-lads第32关&#xff0c;输…

【C++】学习笔记——vector_2

文章目录 七、vector2. vecotr的使用3. vector的模拟实现 未完待续 七、vector 2. vecotr的使用 上节我们以二维数组结束&#xff0c;这一节我们以二维数组开始。 // 二维数组 vector<vector<int>> vv;二维数组在底层是连续的一维数组。vv[i][j] 是怎样访问的&a…

Sarcasm detection论文解析 |使用基于多头注意力的双向 LSTM 进行讽刺检测

论文地址 论文地址&#xff1a;https://ieeexplore.ieee.org/document/8949523 论文首页 笔记框架 使用基于多头注意力的双向 LSTM 进行讽刺检测 &#x1f4c5;出版年份:2020 &#x1f4d6;出版期刊:IEEE Access &#x1f4c8;影响因子:3.9 &#x1f9d1;文章作者:Kumar Avinas…

第11章 软件工程

这里写目录标题 1.软件过程1.1能力成熟度模型(CMM)1.2能力成熟度模型集成(CMMI)1.3瀑布模型(线性顺序)1.4增量模型1.5演化模型1.5.1原型模型1.5.2螺旋模型 1.6喷泉模型1.7统一过程(UP)模型 2.敏捷方法3.系统设计4.系统测试4.1单元测试(模块测试)4.2集成测试4.3黑盒测试(功能测试…

论文辅助笔记:Tempo之modules/prompt.py

1 get_prompt_param_cls 2 get_prompt_value 3 Prompt 类 3.1 _init_weights 3.2 forward

一、RocketMQ基本概述与部署

RocketMQ基本概述与安装 一、概述1.MQ概述1.1 用途1.2 常见MQ产品1.3 MQ常用的协议 2.RocketMQ概述2.1 发展历程 二、相关概念1.基本概念1.1 消息&#xff08;Message&#xff09;1.2 主题&#xff08;Topic&#xff09;1.3 标签&#xff08;Tag&#xff09;1.4 队列&#xff0…

gige工业相机突破(一,准备资源)

gige相机能不能绕开相机生产商提供的sdk&#xff0c;而直接取到像&#xff1f; 两种办法&#xff0c;第一&#xff0c;gige vision2.0说明书&#xff0c;第二&#xff0c;genicam 首先你会去干什么事&#xff1f; 好几年&#xff0c;我都没有突破&#xff0c;老虎吃天&#x…

产品AB测试设计

因为vue2项目升级到vue3经历分享1&#xff0c;vue2项目升级到vue3经历分享2&#xff0c;前端系统升级&#xff0c;界面操作也发生改变&#xff0c;为了将影响降到最低&#xff0c;是不能轻易让所有用户使用新系统的。原系统使用好好的&#xff0c;如果新界面用户不喜欢&#xf…

2024/5/5 英语每日一段

Meanwhile, in a twist, Tesla this month settled a high-profile case in Northern California that claimed Autopilot played a role in the fatal crash of an Apple engineer, Walter Huang. The company’s decision to settle with Huang’s family—along with a ruli…

如何打包Apk适配32和64位

一个表格了解lib下的文件夹 .so文件描述armeabi-v7a第七代及以上的ARM处理器&#xff0c;2011年以后生产的大部分Android设备都使用。arm64-v8a第8代、64位ARM处理器&#xff0c;很少设备&#xff0c;三星GalaxyS6是其中之一。armeabi第5代、第6代的ARM处理器&#xff0c;早期…

Mysql报错红温集锦(一)(ipynb配置、pymysql登录、密码带@、to_sql如何加速、触发器SIGNAL阻止插入数据)

一、jupyter notebook无法使用%sql来添加sql代码 可能原因&#xff1a; 1、没装jupyter和notebook库、没装ipython-sql库 pip install jupyter notebook ipython-sql 另外如果是vscode的话还需要安装一些相关的插件 2、没load_ext %load_ext sql 3、没正确的登录到mysql…

Git-flow分支管理与Aone-flow分支管理对比

Git-flow分支管理与Aone-flow分支管理对比 git-flow分支管理&#xff1a; master: 主分支&#xff0c;主要用来版本发布。 hotfix&#xff1a;线上 bug 紧急修复用到的临时分支。这个分支用来修复主线master的BUG release&#xff08;预发布分支&#xff09;&#xff1a;rel…

深入理解网络原理2----UDP协议

文章目录 前言一、UDP协议协议段格式&#xff08;简图&#xff09;校验和 二、UDP与TCP 前言 随着时代的发展&#xff0c;越来越需要计算机之间互相通信&#xff0c;共享软件和数据&#xff0c;即以多个计算机协同⼯作来完成业务&#xff0c;就有了⽹络互连。 一、UDP协议 协…

基于matlab GUI的Alpha shapes边缘提取

1、程序介绍 本程序是基于matlab语言&#xff0c;使用alpha shapes算法实现点云边缘提取。算法具体原理参考博客&#xff1a;基于alpha shapes的边缘点提取&#xff08;matlab&#xff09;-CSDN博客。该程序包括3个按钮&#xff1a;加载点云、边缘点提取、保存。其中&#xff0…

A Bug‘s Life (并查集)

//新生训练 #include <iostream> #include <algorithm> using namespace std; const int N 5000; int p[N], sz[N]; int n, m; int find(int x) {if (p[x] ! x)p[x] find(p[x]);return p[x]; } int main() {int T;scanf("%d", &T);for (int k 1; …