基于QT5实现的串口调试助手

代码仅供参考,实际效果是读串口缓冲区,但是老师水平不行,说好像(?)不能自己读自己,但是由于没有条件测试,后续没有进一步完善

main.cpp

#include "widget.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

widget.cpp

#include "widget.h"
#include "ui_widget.h"#include <QMessageBox>
#include <QDebug>
#include <QFile>
#include <QFileDialog>
#include <QTimer>
#include <QStringList>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);resize(800,600);                                //窗口限制setWindowTitle("Serial_Port");SendByte=0;ReceByte=0;serial = new QSerialPort(this);ui->comboBox_2->setCurrentIndex(5);             //初始化ui->comboBox_3->setCurrentIndex(3);ui->comboBox_4->setCurrentIndex(2);ui->comboBox_5->setCurrentIndex(0);ui->lineEdit->setText("1000");ui->checkBox->setCheckState(Qt::Checked);ui->checkBox_4->setCheckState(Qt::Checked);ui->pushButton_7->setEnabled(false);ui->checkBox_7->setEnabled(false);connect(serial,SIGNAL(readyRead()),             //信号与槽函数this,SLOT(serialPort_readyRead()));Times=0;portTime=0;lineEditData=1000;timer = new QTimer;timer->start(1);//connect(timer,&QTimer::timeout,this,&Widget::TimerEvent);connect(timer,SIGNAL(timeout()),this,SLOT(TimerEvent()));       //信号与槽函数
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_2_clicked()
{if(ui->pushButton_2->text()==QString("打开串口")){//设置串口名serial->setPortName(ui->comboBox->currentText());//设置波特率serial->setBaudRate(ui->comboBox_2->currentText().toInt());//设置数据位switch(ui->comboBox_3->currentText().toInt()){case 5:serial->setDataBits(QSerialPort::Data5);break;case 6:serial->setDataBits(QSerialPort::Data6);break;case 7:serial->setDataBits(QSerialPort::Data7);break;case 8:serial->setDataBits(QSerialPort::Data8);break;default:serial->setDataBits(QSerialPort::UnknownDataBits);break;}//设置奇偶校验位switch(ui->comboBox_4->currentIndex()){case 0:serial->setParity(QSerialPort::EvenParity);break;case 1:serial->setParity(QSerialPort::MarkParity);break;case 2:serial->setParity(QSerialPort::NoParity);break;case 3:serial->setParity(QSerialPort::OddParity);break;default:serial->setParity(QSerialPort::UnknownParity);break;}//设置停止位switch (ui->comboBox_5->currentIndex()){case 0:serial->setStopBits(QSerialPort::OneStop);break;case 1:serial->setStopBits(QSerialPort::OneAndHalfStop);break;case 2:serial->setStopBits(QSerialPort::TwoStop);break;default:serial->setStopBits(QSerialPort::UnknownStopBits);break;}//设置流控制serial->setFlowControl(QSerialPort::NoFlowControl);//打开串口if(!serial->open(QIODevice::ReadWrite)){QMessageBox::about(NULL,"提示","无法打开串口");return;}//下拉控件失能ui->comboBox->setEnabled(false);ui->comboBox_2->setEnabled(false);ui->comboBox_3->setEnabled(false);ui->comboBox_4->setEnabled(false);ui->comboBox_5->setEnabled(false);ui->pushButton->setEnabled(false);ui->checkBox_7->setEnabled(true);ui->pushButton_2->setText(tr("关闭串口"));ui->pushButton_7->setEnabled(true);}else{//关闭串口serial->close();//下拉按键使能ui->comboBox->setEnabled(true);ui->comboBox_2->setEnabled(true);ui->comboBox_3->setEnabled(true);ui->comboBox_4->setEnabled(true);ui->comboBox_5->setEnabled(true);ui->pushButton->setEnabled(true);ui->checkBox_7->setEnabled(false);ui->pushButton_2->setText(tr("打开串口"));//发送失能ui->pushButton_7->setEnabled(false);}
}void Widget::on_pushButton_clicked()                  //扫描串口
{int i,n;ui->comboBox->clear();portStringLine.clear();foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())portStringLine +=info.portName();n=portStringLine.size();for(i=0;i<n;i++){serial->setPortName(portStringLine[i]);if(!serial->open(QIODevice::ReadWrite)){portStringLine[i]+="(不可用)";QVariant v(0);          //禁用ui->comboBox->setItemData(1, v, Qt::UserRole - 1);}else{QVariant v(1|32);       //可用ui->comboBox->setItemData(1, v, Qt::UserRole - 1);}serial->close();}ui->comboBox->addItems(portStringLine);
}void Widget::serialPort_readyRead()                  //串口接收
{int i,length;QString lasttext;if(ui->checkBox_3->checkState()!=Qt::Checked){lasttext=ui->textEdit->toPlainText();Receivetext = serial->readAll();ReceByte+=Receivetext.length();ui->label_10->setText(QString::number(ReceByte));if(ui->checkBox_2->checkState()==Qt::Checked){Receivetext=Receivetext.toLatin1().toHex();     //字符串转十六进制length=Receivetext.length();for(i=0;i<=length/2;i++){Receivetext.insert((2+3*i),' ');            //插入空格字符串}}elseReceivetext=Receivetext.toLatin1();lasttext=lasttext.append(Receivetext);ui->textEdit->setText(lasttext);}
}void Widget::on_pushButton_7_clicked()                          //串口发送
{QByteArray bytearray;Sendtext=ui->textEdit_2->toPlainText();if(ui->checkBox_6->checkState()==Qt::Checked)Sendtext += '\n';if(ui->checkBox_5->checkState()!=Qt::Checked)bytearray = Sendtext.toLatin1();elsebytearray = QByteArray::fromHex(Sendtext.toUtf8());     //十六进制转字符串serial->write(bytearray);//定长发送//serial->write((const char *)param_data,16);SendByte+=Sendtext.length();ui->label_9->setText(QString::number(SendByte));ui->textEdit_2->moveCursor(QTextCursor::End);
}void Widget::TimerEvent()                                       //定时事件,1ms
{int t=500;                                                  //扫描串口时间Times++;portTime++;if(Times>=lineEditData)                                     //定时发送{if(ui->checkBox_7->checkState()==Qt::Checked)Widget::on_pushButton_7_clicked();Times=0;}if(portTime==t)                                             //定时扫描串口{QStringList newPortStringList;newPortStringList.clear();foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())newPortStringList += info.portName();if(newPortStringList.size() != portStringLine.size()){portStringLine = newPortStringList;ui->comboBox->clear();ui->comboBox->addItems(portStringLine);}portTime=0;}
}void Widget::on_pushButton_8_clicked()              //清除计数
{SendByte=0;ReceByte=0;ui->label_9->setText(QString::number(SendByte));ui->label_10->setText(QString::number(ReceByte));
}void Widget::on_pushButton_4_clicked()              //清除接收区
{ui->textEdit->clear();
}void Widget::on_pushButton_6_clicked()              //清除发送区
{ui->textEdit_2->clear();
}void Widget::on_checkBox_clicked()                  //文本接收
{ui->checkBox->setCheckState(Qt::Checked);ui->checkBox_2->setCheckState(Qt::Unchecked);ui->checkBox_3->setCheckState(Qt::Unchecked);
}void Widget::on_checkBox_2_clicked()                //十六进制接收
{ui->checkBox->setCheckState(Qt::Unchecked);ui->checkBox_2->setCheckState(Qt::Checked);ui->checkBox_3->setCheckState(Qt::Unchecked);
}void Widget::on_checkBox_3_clicked()                //暂停接收
{ui->checkBox->setCheckState(Qt::Unchecked);ui->checkBox_2->setCheckState(Qt::Unchecked);ui->checkBox_3->setCheckState(Qt::Checked);
}void Widget::on_checkBox_4_clicked()                //文本发送
{ui->checkBox_4->setCheckState(Qt::Checked);ui->checkBox_5->setCheckState(Qt::Unchecked);
}void Widget::on_checkBox_5_clicked()                //十六进制发送
{ui->checkBox_4->setCheckState(Qt::Unchecked);ui->checkBox_5->setCheckState(Qt::Checked);
}void Widget::on_pushButton_5_clicked()              //打开文件
{QString fileName = QFileDialog::getOpenFileName(this);QFile file(fileName);     //新建QFile对象if(!file.open(QFile::ReadOnly|QFile::Text)){QMessageBox::warning(this,tr("多文档编辑器"),tr("无法读取文件 %1:\n%2").arg(fileName,file.errorString()));}QTextStream in(&file);    //新建文本流对象// 鼠标指针变为等待状态QApplication::setOverrideCursor(Qt::WaitCursor);//读取文件的全部文本内容,并添加到编辑器中ui->textEdit_2->setPlainText(in.readAll());//鼠标指针恢复为原来状态QApplication::restoreOverrideCursor();ui->textEdit->setVisible(true);
}void Widget::on_pushButton_3_clicked()              //保存文件
{QString fileName = QFileDialog::getSaveFileName(this);QFile file(fileName);if (!file.open(QFile::WriteOnly | QFile::Text)){// %1和%2分别对应后面arg两个参数,/n起换行的作用QMessageBox::warning(this, tr("多文档编辑器"),tr("无法写入文件 %1:/n %2").arg(fileName, file.errorString()));}QTextStream out(&file);// 鼠标指针变为等待状态QApplication::setOverrideCursor(Qt::WaitCursor);out << ui->textEdit->toPlainText();// 鼠标指针恢复原来的状态QApplication::restoreOverrideCursor();
}void Widget::on_lineEdit_editingFinished()          //输入定时时间
{if(ui->lineEdit->text().toInt()>0)lineEditData=ui->lineEdit->text().toInt();
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QtSerialPort>
#include <QSerialPortInfo>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();  int Times,portTime,lineEditData;
private:Ui::Widget *ui;QSerialPort *serial;                    //串口端口QTimer *timer;                          //定时器QString Sendtext,Receivetext;           //发送、接收缓存区long int SendByte,ReceByte;             //发送、接收字符数QStringList portStringLine;             //端口链表private slots:void serialPort_readyRead();            //串口接收void TimerEvent();                      //定时发送、更新串口void on_pushButton_clicked();           //扫描串口void on_pushButton_2_clicked();         //打开串口键按下void on_pushButton_7_clicked();         //串口发送void on_pushButton_8_clicked();         //清除计数void on_pushButton_4_clicked();         //清除接收区void on_pushButton_6_clicked();         //清除发送区void on_checkBox_clicked();             //文本接收void on_checkBox_2_clicked();           //十六进制接收void on_checkBox_3_clicked();           //暂停接收void on_checkBox_4_clicked();           //文本发送void on_checkBox_5_clicked();           //十六进制发送void on_pushButton_5_clicked();         //打开文件void on_pushButton_3_clicked();         //保存文件void on_lineEdit_editingFinished();     //输入定时时间
};
#endif // WIDGET_H

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入探索Java开发世界:Redis~类型分析大揭秘

文章目录 深入探索Java开发世界&#xff1a;Redis~类型分析大揭秘一、数据结构类型二、分布式锁类型三、事物命令类型四、事物三大特性类型 深入探索Java开发世界&#xff1a;Redis~类型分析大揭秘 Redis数据库基础知识&#xff0c;类型知识点梳理~ 一、数据结构类型 Redis是一…

【图像处理】1、使用OpenCV库图像轮廓的检测和绘制

OpenCV (Open Source Computer Vision Library) 是一个用于计算机视觉和图像处理的开源库。它提供了数百种用于图像和视频分析的算法&#xff0c;并被广泛应用于研究和商业领域。OpenCV 支持多种编程语言&#xff0c;包括 C、Python、Java 等&#xff0c;具有跨平台的特性&…

为什么不建议用外键?

在 MySQL 中&#xff0c;有些开发人员建议避免使用外键&#xff08;Foreign Keys&#xff09;&#xff0c;主要原因如下&#xff1a; 性能问题&#xff1a; 外键约束在插入、更新和删除操作时&#xff0c;会导致额外的检查和锁定&#xff0c;从而影响性能。尤其是在大批量数据操…

Vue项目生产环境的打包优化

Vue项目生产环境的打包优化 前言 在这篇文章我们讨论Vue项目生产环境的打包优化&#xff0c;并按步骤展示实际优化过程中的修改和前后对比。 背景 刚开始的打包体积为48.71M 优化 步骤一&#xff1a;删除viser-vue viser-vue底层依赖antv/g2等库一并被删除&#xff0c;…

【selenium 】操作元素

操作元素 元素操作鼠标操作键盘操作 元素操作 元素操作示例清空输入框clear()deiver.find_element_by_id(“username”).clear()输入文字send_keys()deiver.find_element_by_id(“username”).send_keys(‘zs’)元素点击 click()deiver.find_element_by_id(“login”).click()…

【高级篇】MySQL性能监控与故障排查:洞悉与优化(十六)

引言 在深入探讨了InnoDB引擎的内部机制后,我们转向了MySQL性能监控与故障排查的实践领域。这一章节将指导你如何运用一系列强大的监控工具和日志分析技巧,识别并解决数据库中的性能瓶颈和常见故障,为即将到来的MySQL与云环境的融合打下坚实基础。 一. 常用监控工具:透视…

720漫游快速入门

720云全景漫游制作工具自2014年8月上线后&#xff0c;为数十万创作者提供全景图片&全景视频&高清矩阵上传、编辑、分享一站式软件服务&#xff0c;获得众多创作者的青睐与认可&#xff0c;同时也承载了创作者越来越多的期望&#xff0c;为了给大家提供更灵活多样的功能…

【Linux】动/静态库的创建和使用

目录 一、动/静态库的概念回顾&#xff1a; 二、动态库与静态库的区别&#xff1a; 三、静态库的创建与使用&#xff1a; 1、Linux静态库命名规则&#xff1a; 2、静态库的创建和使用&#xff1a; 四、动态库的创建与使用&#xff1a; 1、Linux动态库命名规则&#xff1…

如何根据经纬度查询所在城市

参考文献&#xff1a; https://www.jianshu.com/p/893d359dea0f

【python】pop()函数

python pop() &#xff0c;如何在Python的列表或数组中移除元素 使用 pop() 从列表中删除元素 pop() 语法概述 pop() 方法的语法如下&#xff1a; list_name.pop(index)list_name&#xff1a;列表变量名&#xff1b;内置的 pop() 方法仅需要一个可选参数&#xff1b;可选参…

Windows若要成为最受欢迎的操作系统,则需要解决5个问题

序言 Windows正变得与我在过去几十年中第一次喜欢和使用的操作系统大不相同&#xff0c;但尽管我觉得它偏离了崇高的道路&#xff0c;如果我可以成为CEO一天&#xff0c;那么我会改变以下五件事&#xff0c;让世界上最受欢迎的操作系统重回正轨。 非必要更新的永久延期 多年来…

地平线x3pi板子烧录linux

可以遵循以下链接下载烧录系统与linux镜像&#xff0c;并在新的sd卡里烧录Linux镜像系统并启动。​​​​​​地平线RDK套件 | RDK X3用户手册 注意烧录的镜像需要destop版本。 Index of /downloads/os_images/2.1.0/release/

CSS3 框大小

CSS3 框大小 在CSS3中&#xff0c;框大小&#xff08;Box Sizing&#xff09;是一个重要的概念&#xff0c;它决定了如何计算一个元素的总宽度和高度。本文将详细介绍CSS3中的框大小属性&#xff0c;包括其基本用法、浏览器支持情况以及在实际开发中的应用示例。 基本概念 在…

【无人机三维路径规划】基于鱼鹰算法OOA实现复杂城市地形下无人机避障三维航迹规划附Matlab代码

% 初始化遗传算法参数 population_size 50; % 种群大小 max_generations 100; % 最大迭代次数 mutation_rate 0.1; % 突变率 % 定义目标函数&#xff08;适应度函数&#xff09; fitness_function (x) calculate_fitness(x); % 定义路径规划问题的约束函数 constraint_fu…

SQL面试题练习 —— 微信运动步数在好友中的排名

目录 1 题目2 建表语句3 题解 题目来源&#xff1a;腾讯。 1 题目 有两个表&#xff0c;朋友关系表user_friend&#xff0c;用户步数表user_steps。朋友关系表包含两个字段&#xff0c;用户id&#xff0c;用户好友的id&#xff1b;用户步数表包含两个字段&#xff0c;用户id&am…

鸿蒙HarmonyOS自定义组件开发和使用

自定义组件的介绍 在开发和使用自定义组件直接&#xff0c;我们需要了解什么是自定义组件&#xff1f; 在ArkUI中&#xff0c;UI显示的内容均为组件&#xff0c;由框架直接提供的称为系统组件&#xff0c;由开发者定义的称为自定义组件。在进行 UI 界面开发时&#xff0c;通常…

【Mysql】多表查询、隐式内链接、显式内连接、左外连接、右外连接

多表查询 什么是多表查询 •DQL: 查询多张表,获取到需要的数据 •比如 我们要查询家电分类下 都有哪些商品,那么我们就需要查询分类与商品这两张表 数据准备 创建db3_2 数据库 -- 创建 db3_2 数据库,指定编码 CREATE DATABASE db3_2 CHARACTER SET utf8;创建分类表与商品表 …

美力AI如何改变美妆行业游戏规则

人工智能 (AI) 正在席卷全球&#xff0c;彻底改变我们所知的行业。美容和时尚行业是深受人工智能技术影响的行业之一。人工智能&#xff08;包括生成式人工智能&#xff09;是美容和时尚行业激发信心和产品发现的强大工具&#xff0c;品牌可以利用这项技术为客户激发灵感。 凭…

坑——python的redis库的decode_responses设置

python的redis库查询返回的值默认是返回字节串&#xff0c;可以在redis.Redis()方法中通过设置decode_responses参数&#xff0c;让返回值直接是字符串&#xff1b; 查询返回字节串是因为Redis()方法中decode_responses默认值是False&#xff1a; 设置decode_responses为True就…

【从零开始实现联邦学习】

1. 环境配置如下 python3.7pip install torchpip install torchvision 2. 代码如下 原书的代码存在一点bug&#xff0c;现已被作者修复 Client端代码如下 import torch.utils.dataclass Client(object):def __init__(self,conf,model,train_dataset,id1):self.conf conf …