Qt学习之ui创建串口助手

一、串口简介

二、Qt编写串口助手

1、创建Qt工程

选择MinGW 64-bit

点击下一步完成,工程创建完成。

使用串口模块,需要在工程文件.pro中添加以下代码,不添加的话,会报错。

或者在core gui 后输入 serialport 也可以

2、配置UI界面 

双击打开带.ui后缀的文件

可以在右边设置窗口的大小(宽和高)

创建一个Widget界面,用于放置控件

下面框选的就是Wiget界面,可以看出里面有很多控件,这样可以方便我们控件布局

做一个串口助手,需要有接收和发送功能,这里接收功能使用接收控件实现.

选择接收控件(Plain Text Edit),拖到UI界面中。

因为接受数据是只读的,我们需要把这个控件的属性设置为只读。在右下角属性栏勾选readOnly。

设置串口号、波特率、停止位、数据位、校验位需要下拉框,所以在左边找到Combo Box,添加到UI界面中。

使用标签 Label控件作注释 

使用Line Edit作为发送控件,也就是发送数据的框

打开串口(关闭串口)、发送数据、清除接受等需要使用Push Button作为点击控件

通过以上的配置,一个基础的串口调试助手就完成了

除此之外,还可以加入复选框,使用的是Check Box控件

最终配置UI界面如下

工程文件

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"#include <QSerialPortInfo>    //提供系统中存在的串口的信息
#include <QMessageBox>
#include <QFileDialog>
#include <QStandardPaths>
#include <QFile>
#include <QDebug>
#include <QTimer>MainWindow::MainWindow(QWidget *parent): QWidget(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);initPort();// 默认显示文本数据dispalyText();// 将复选框的 toggled(bool) 信号连接到槽函数connect(ui->hexDisplayChex, &QCheckBox::toggled, this, &MainWindow::on_hexDisplayChex_toggled);
}MainWindow::~MainWindow()
{delete ui;
}/****************************串口初始化******************************/
void MainWindow::initPort()
{//设置改变connect(ui->baudRateCmb, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),this, [=]{auto br = ui->baudRateCmb->currentData().value<QSerialPort::BaudRate>();if (!serialPort_.setBaudRate(br)){QMessageBox::warning(this, "false", "设置波特率失败:" + serialPort_.errorString());}});connect(ui->dataBitsCmb,static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),this,[=]{auto value = ui->dataBitsCmb->currentData().value<QSerialPort::DataBits>();if(!serialPort_.setDataBits(value)){QMessageBox::warning(this,"false","设置数据位失败:"+serialPort_.errorString());}});connect(ui->stopBitCmb,static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),this,[=]{auto value = ui->stopBitCmb->currentData().value<QSerialPort::StopBits>();if(!serialPort_.setStopBits(value)){QMessageBox::warning(this,"false","设置停止位失败:"+serialPort_.errorString());}});connect(ui->parityCmb,static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),this,[=]{auto value = ui->parityCmb->currentData().value<QSerialPort::Parity>();if(!serialPort_.setParity(value)){QMessageBox::warning(this,"false","设置校验位失败:"+serialPort_.errorString());}});//获取所有可用的串口auto portsInfo = QSerialPortInfo::availablePorts();for (auto& info : portsInfo){qInfo() << info.description() << info.portName() << info.systemLocation();ui->portsCmb->addItem(info.portName() + ":" + info.description(),info.portName());}//获取标准的波特率auto baudRates = QSerialPortInfo::standardBaudRates();for(auto br : baudRates){ui->baudRateCmb->addItem(QString::number(br),br);//遍历设置波特率}//设置默认的波特率ui->baudRateCmb->setCurrentText("9600");//设置停止位ui->stopBitCmb->addItem("1",QSerialPort::OneStop);ui->stopBitCmb->addItem("1.5",QSerialPort::OneAndHalfStop);ui->stopBitCmb->addItem("2",QSerialPort::TwoStop);//设置数据位ui->dataBitsCmb->addItem("5",QSerialPort::Data5);ui->dataBitsCmb->addItem("6",QSerialPort::Data6);ui->dataBitsCmb->addItem("7",QSerialPort::Data7);ui->dataBitsCmb->addItem("8",QSerialPort::Data8);ui->dataBitsCmb->setCurrentText("8");//设置校验位ui->parityCmb->addItem("NoParity   ",QSerialPort::NoParity   );  //按住ALT多行编辑ui->parityCmb->addItem("EvenParity ",QSerialPort::EvenParity );ui->parityCmb->addItem("OddParity  ",QSerialPort::OddParity  );ui->parityCmb->addItem("SpaceParity",QSerialPort::SpaceParity);ui->parityCmb->addItem("MarkParity ",QSerialPort::MarkParity );connect(&serialPort_,&QSerialPort::readyRead,this,&MainWindow::onReadyRead);timer_.callOnTimeout([=]{this->on_sendBtn_released();});//    //读取串口信息
//    foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
//    {
//        qDebug()<<"Name:"<<info.portName();
//        qDebug()<<"Description:"<<info.description();
//        qDebug()<<"Manufacturer:"<<info.manufacturer();//        //这里相当于自动识别串口号之后添加到了cmb,如果要手动选择可以用下面列表的方式添加进去
//        QSerialPort serial;
//        serial.setPort(info);
//        if(serial.open(QIODevice::ReadWrite))
//        {
//            //将串口号添加到cmb
//            ui->portsCmb->addItem(info.portName());
//            //关闭串口等待人为(打开串口按钮)打开
//            serial.close();
//        }
//    }//    QStringList baudList;//波特率
//        QStringList parityList;//校验位
//        QStringList dataBitsList;//数据位
//        QStringList stopBitsList;//停止位//        baudList<<"50"<<"75"<<"100"<<"134"<<"150"<<"200"<<"300"
//               <<"600"<<"1200"<<"1800"<<"2400"<<"4800"<<"9600"
//              <<"14400"<<"19200"<<"38400"<<"56000"<<"57600"
//             <<"76800"<<"115200"<<"128000"<<"256000";//        ui->baudRateCmb->addItems(baudList);
//        ui->baudRateCmb->setCurrentIndex(12);//        parityList<<"无"<<"奇"<<"偶";
//        parityList<<"标志";
//        parityList<<"空格";//        ui->parityCmb->addItems(parityList);
//        ui->parityCmb->setCurrentIndex(0);//        dataBitsList<<"5"<<"6"<<"7"<<"8";
//        ui->dataBitsCmb->addItems(dataBitsList);
//        ui->dataBitsCmb->setCurrentIndex(3);//        stopBitsList<<"1";
//        stopBitsList<<"1.5";
//        stopBitsList<<"2";//        ui->stopBitCmb->addItems(stopBitsList);
//        ui->stopBitCmb->setCurrentIndex(0);//        //设置按钮可以被按下
//        ui->openPortBtn->setCheckable(true);}/****************************串口设置******************************/
void MainWindow::on_openPortBtn_released()
{//串口是否已经打开if(serialPort_.isOpen()){serialPort_.close();ui->openPortBtn->setText("打开串口");if(timer_.isActive()){timer_.stop();}return;}//获取串口auto portName = ui->portsCmb->currentData().toString();
//    //获取波特率
//    auto baudRate = ui->baudRateCmb->currentData().value<QSerialPort::BaudRate>();
//    //获取数据位
//    auto dataBits = ui->dataBitsCmb->currentData().value<QSerialPort::DataBits>();
//    //获取停止位
//    auto stopBits = ui->stopBitCmb->currentData().value<QSerialPort::StopBits>();
//    //获取校验位
//    auto parity = ui->parityCmb->currentData().value<QSerialPort::Parity>();serialPort_.setPortName(portName);
//    serialPort_.setBaudRate(baudRate);
//    serialPort_.setDataBits(dataBits);
//    serialPort_.setStopBits(stopBits);
//    serialPort_.setParity(parity);//打开串口if(!serialPort_.open(QIODevice::ReadWrite)){QMessageBox::warning(this,"warning",portName + "open failaed:" + serialPort_.errorString());return;}else{ui->openPortBtn->setText("关闭串口");}
}//发送数据
void MainWindow::on_sendBtn_released()
{auto dataStr = ui->sendEdit->toPlainText() + (ui->sendNewLineChx->isChecked() ?"\r\n":"");//+ ui->sendNewLineChx->isChecked() ?"\r\n":""serialPort_.write(dataStr.toLocal8Bit());
}//接收函数
void MainWindow::onReadyRead()
{
//    auto data = serialPort_.readAll();
//    ui->recvEdit->setPlainText(QString::fromLocal8Bit(data));QByteArray data = serialPort_.readAll();QString receivedData = QString::fromLocal8Bit(data);  // 使用正确的编码解析数据processReceivedData(receivedData);}//接收处理函数
void MainWindow::processReceivedData(const QString& data)
{if (ui->hexDisplayChex->isChecked()) {// 如果复选框已勾选,将接收到的数据转换为十六进制并显示QString hexData = data.toLocal8Bit().toHex(' ').toUpper();ui->recvEdit->appendPlainText(hexData);} else {// 如果复选框未勾选,显示接收到的数据文本ui->recvEdit->appendPlainText(data);}
}//打开文件
void MainWindow::on_openfileBtn_released()
{auto filename = QFileDialog::getOpenFileName(this,"选择文件",QStandardPaths::writableLocation(QStandardPaths::DesktopLocation),"txt(*.txt);;all(*.*)");if(!filename.isEmpty()){ui->fileNameEdit->setText(filename);}
}//发送文件
void MainWindow::on_sendfileBtn_released()
{auto filename = ui->fileNameEdit->text();QFile file(filename);if(!file.open(QIODevice::ReadOnly)){QMessageBox::warning(this,"warning",filename + "open failed:" + file.errorString());return;}//最好判断一下文件的编码serialPort_.write(QString::fromUtf8(file.readAll()).toLocal8Bit());}//显示十六进制或者十进制
void MainWindow::on_hexDisplayChex_toggled(bool checked)
{if (checked) {// 如果复选框被选中,显示接收数据的十六进制格式dispalyHex();} else {// 如果复选框未选中,显示接收数据的文本格式dispalyText();}
}void MainWindow::dispalyHex()
{QString currentText = ui->recvEdit->toPlainText();QString hexData = currentText.toLocal8Bit().toHex(' ').toUpper();ui->recvEdit->setPlainText(hexData);
}void MainWindow::dispalyText()
{QString currentText = ui->recvEdit->toPlainText();ui->recvEdit->setPlainText(currentText);
}//十六进制显示
//void MainWindow::on_hexDisplayChex_toggled(bool checked)
//{
//    if(checked)
//        dispalyHex();
//    else
//        dispalyText();//}//void MainWindow::dispalyHex()
//{
//    //先把数据拿出来
//    auto dataStr = ui->recvEdit->toPlainText();
//    //转成十六进制
//    auto hexData = dataStr.toLocal8Bit().toHex(' ').toUpper();//添加间隔符' '
//    //写回去
//    ui->recvEdit->setPlainText(hexData);//}//void MainWindow::dispalyText()
//{
//    //先把数据拿出来
//    auto dataStr = ui->recvEdit->toPlainText();
//    //转成文本
//    auto textData =QString::fromLocal8Bit(dataStr.toLocal8Bit());
//    //写回去
//    ui->recvEdit->setPlainText(textData);
//}void MainWindow::on_timerSendChx_toggled(bool checked)
{if(checked){timer_.start(ui->timerperiodEdit->text().toUInt());ui->timerperiodEdit->setEnabled(false);}else{timer_.stop();}
}void MainWindow::on_sendstopBtn_released()
{serialPort_.clear();if(timer_.isActive())timer_.stop();}
//清空槽函数
void MainWindow::on_clearRecvBtn_clicked()
{ui->recvEdit->clear();
}

mainwindow.h 

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QWidget>
#include <QTimer>
#include <QSerialPort>        //提供访问串口的功能
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QWidget
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();void initPort();  //Alt+回车快捷键private slots:void on_openPortBtn_released();void on_sendBtn_released();void onReadyRead();void on_openfileBtn_released();void on_sendfileBtn_released();void on_hexDisplayChex_toggled(bool checked);void on_timerSendChx_toggled(bool checked);void on_sendstopBtn_released();void on_clearRecvBtn_clicked();//    void toggleHexDisplay(int state);void processReceivedData(const QString& data);private:void dispalyHex();void dispalyText();Ui::MainWindow *ui;QSerialPort serialPort_;QTimer timer_;
};
#endif // MAINWINDOW_H

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

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

相关文章

【Unity】RPG2D龙城纷争(六)关卡编辑器之角色编辑

更新日期&#xff1a;2024年6月26日。 项目源码&#xff1a;第五章发布&#xff08;正式开始游戏逻辑的章节&#xff09; 索引 简介一、角色编辑模式1.将字段限制为只读2.创建角色&#xff08;刷角色&#xff09;3.预览所有角色4.编辑选中角色属性5.移动角色位置6.移除角色 简介…

vue中【事件修饰符号】详解

在Vue中&#xff0c;事件修饰符是一种特殊的后缀&#xff0c;用于修改事件触发时的默认行为。以下是Vue中常见的事件修饰符的详细解释&#xff1a; .stop 调用event.stopPropagation()&#xff0c;阻止事件冒泡。当你在嵌套元素中都有相同的事件监听器&#xff08;如click事件…

【Linux系统】进程替换 自主实现shell(简易版)

1.先看代码 && 现象 我们用exec*函数执行新的程序&#xff0c; exec*系列的函数&#xff0c;执行完毕后&#xff0c;后续的代码不见了&#xff0c;因为被替换了。 execl的返回值可以不关心了&#xff0c;只要替换成功&#xff0c;就不会向后继续运行&#xff0c;只要…

单片机是否有损坏,怎沫判断

目录 1、操作步骤&#xff1a; 2、单片机损坏常见原因&#xff1a; 3、 单片机不工作的原因&#xff1a; 参考&#xff1a;细讲寄存器读写与Bit位操作原理--单片机C语言编程Bit位的与或非屏蔽运算--洋桃电子大百科P019_哔哩哔哩_bilibili 1、操作步骤&#xff1a; 首先需要…

前置章节-熟悉Python、Numpy、SciPy和matplotlib

目录 一、编程环境-使用jupyter notebook 1.下载homebrew包管理工具 2.安装Python环境 3.安装jupyter 4.下载Anaconda使用conda 5.使用conda设置虚拟环境 二、学习Python基础 1.快排的Python实现 (1)列表推导-一种创建列表的简洁方式 (2)列表相加 2.基本数据类型及运…

Navicat上新啦

前言 Navicat&#xff0c;在数据库界&#xff0c;几乎是一个神奇的存在&#xff0c;似乎统治了数据库开发工具的“一片天”。且看下图&#xff1a; 红的蓝的绿的橙的…&#xff0c;可以说&#xff0c;留给它的color不多了。 那么商业BI到服务监控、从云托管到云协作&#xff…

最强文生图模型Stable Diffusion 3 Medium 正式开源

Stability AI 宣布 Stable Diffusion 3 Medium 现已开源&#xff0c;是 Stable Diffusion 3 系列中最新、最先进的文本生成图像 AI 模型 —— 官方声称是 “迄今为止最先进的开源模型”&#xff0c;其性能甚至超过了 Midjourney 6。 Stable Diffusion 3 Medium 模型规格参数达到…

【鸿蒙学习笔记】位置设置

官方文档&#xff1a;位置设置 目录标题 align&#xff1a;子元素的对齐方式direction&#xff1a;官方文档没懂&#xff0c;看图理解吧 align&#xff1a;子元素的对齐方式 Stack() {Text(TopStart)}.width(90%).height(50).backgroundColor(0xFFE4C4).align(Alignment.TopS…

Spring+Vue集成AOP系统日志

新建logs表 添加aop依赖 <!-- aop依赖--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency> 新建获取ip地址工具类 import javax.servlet.http.H…

昇思25天学习打卡营第12天|ShuffleNet图像分类

1. 学习内容复盘 ShuffleNet网络介绍 ShuffleNetV1是旷视科技提出的一种计算高效的CNN模型&#xff0c;和MobileNet, SqueezeNet等一样主要应用在移动端&#xff0c;所以模型的设计目标就是利用有限的计算资源来达到最好的模型精度。ShuffleNetV1的设计核心是引入了两种操作&a…

自然语言处理:第三十八章: 开箱即用的SOTA时间序列大模型 -Timsfm

自然语言处理:第三十八章: 开箱即用的SOTA时间序列大模型 -Timsfm 文章链接:[2310.10688] A decoder-only foundation model for time-series forecasting (arxiv.org) 项目链接: google-research/timesfm: TimesFM (Time Series Foundation Model) is a pretrained time-ser…

【FFmpeg】avformat_alloc_output_context2函数

【FFmpeg】avformat_alloc_output_context2函数 1.avformat_alloc_output_context21.1 初始化AVFormatContext&#xff08;avformat_alloc_context&#xff09;1.2 格式猜测&#xff08;av_guess_format&#xff09;1.2.1 遍历可用的fmt&#xff08;av_muxer_iterate&#xff0…

C : 线性规划例题求解

Submit Page TestData Time Limit: 1 Sec Memory Limit: 128 Mb Submitted: 93 Solved: 49 Description 求解下述线性规划模型的最优值min &#xfffd;1&#xfffd;1&#xfffd;2&#xfffd;2&#xfffd;3&#xfffd;3&#xfffd;.&#xfffd;. &…

【SkiaSharp绘图13】SKCanvas方法详解(二)填充颜色、封装对象、高性能绘制、点(集)(多段)线、圆角矩形、Surface、沿路径绘制文字

文章目录 SKCanvas方法DrawColor 填充颜色DrawDrawable 绘制封装对象DrawImage 高性能绘制图像SKBitmap与SKImage对比DrawPicture 绘制图像SKPicture DrawPoint / DrawPoints 绘制点DrawRoundRect/DrawRoundRectDifference绘制圆角矩形DrawSurface 绘制SurfaceDrawTextOnPath沿…

Android - 利用 jitpack 免费发布闭源 aar

一、简述 目前(Android/java) library 的主要发布仓库有 MavenCentral 和 jitpack,我之前也对这两种仓库的发布流程做了详细介绍: 发布至 MavenCentral: https://juejin.cn/post/6953598441817636900发布至 jitpack: https://juejin.cn/post/7040733114506674183#heading-…

C# 入门—实现 Hello, World!

目录 一、.net 平台与.NET Framework框架 .NET Framework的构成 CLR&#xff1a;公共语言运行库 FCL&#xff1a;框架类库 WinForms ASP.NET ADO.NET WPF WCF WF LINQ Entity Framework Parallel LINQ 二、.net 能干什么 .net 两种交互模式 .net 能干什么 .net …

优化模型验证30:多车场车辆路径问题模型及Gurobipy验证

目录 1 数学模型 1.1 用到的符号集合 1.2 模型公式 2 模型验证代码 2.1 Gurobipy代码 2.2 结果可视化 多车场车辆路径问题的定义:大型的物流公司拥有多个车场,而每个车场都有若干车辆用于配送,决策者需要根据客户的所在位置,将客户分配到合适的车场和车辆中。 1 数学模…

c++静态成员变量和静态成员函数

1&#xff09;C入门级小知识&#xff0c;分享给将要学习或者正在学习C开发的同学。 2&#xff09;内容属于原创&#xff0c;若转载&#xff0c;请说明出处。 3&#xff09;提供相关问题有偿答疑和支持。 我们可以使用 static 关键字来把类成员定义为静态的。当我们声明类的成…

华为云鲲鹏架构docker部署2048小游戏

华为云鲲鹏架构docker部署2048小游戏 1. 鲲鹏架构ESC2. 配置docker3. 上传2048镜像4. 删除容器,镜像 1. 鲲鹏架构ESC 2. 配置docker 安装dockeryum -y install docker开机启动 systemctl enable docker启动docker服务 systemctl start docker查询docker的运行版本 docker -v3…

注意力机制之ECA-Net:Efficient Channel Attention for Deep Convolutional Neural Network

论文link&#xff1a;link code&#xff1a;code 1.摘要 近年来&#xff0c;通道注意机制被证明在改善深层卷积神经网络&#xff08;CNN&#xff09;的性能方面提供了巨大的潜力。然而现有的大多数方法都致力于开发更复杂的注意模块以获得更好的性能&#xff0c;这不可避免地增…