当前位置: 首页 > news >正文

从零开始实现自己的串口调试助手(3) - 显示底部收发,优化串口打开/关闭

注意:


1. 我们要实现自发自收,要将tx,rx连起来


2.发送的 不能是中文符号,因为这可能导致,读取到的是英文符号 --> 导致接收到的size 和发送的size 大小不一致

3.注意同时定义两个槽函数的时候两个槽函数都会被调用,我们应该注释掉不需要的那个,爆率剩下的那个避免产生干扰

实现收发消息数的显示:

//并且做了一个历史判断 -->避免重复记录 

修改代码:


void Widget::on_btnSendContext_clicked()
{const char * sendData = ui->lineEdit_SendContext->text().toStdString().c_str();//QString->String(C++)->char*int writeCnt = 0;writeCnt = serialPort->write(sendData);if(writeCnt == - 1){ui->label_SendStatus->setText("SendError!");}else {writeCntTotal += writeCnt;qDebug()<<"Send:"<<sendData;qDebug()<<"writeCnt"<<writeCnt;ui->label_SendStatus->setText("SendOK!");ui->label_SendCnt->setNum(writeCntTotal);if(strcmp(sendData,sendBak.toStdString().c_str())!=0){ //只有当数据与上一次不相等的时候我们才会追加到我们的历史发生中ui->textEditRecord->append(sendData);sendBak = QString(sendData);}}
}void Widget::on_SerialData_readToRead()
{QString recvMessage = serialPort->readAll();if(recvMessage != NULL){qDebug()<<"get Message: "<<recvMessage;ui->textEditRev->append(recvMessage);readCntTotal += recvMessage.size();qDebug()<<"readCnt"<<recvMessage.size();ui->label_RecvCnt->setNum(readCntTotal);}}

输出效果

================================================================

添加关闭/打开按钮功能

添加打开失败的判断:QMessageBox

添加代码

效果图


方式一: 自己定义一个flag,比如serialStatus 判断串口是否被打开


 

void Widget::on_btnCloseOrOpenSerial_clicked()
{if(!serialStatus){ //串口没有被打开  --> 配置参数,打开串口//    1.选择端口号serialPort->setPortName(ui->comboBox_serialNum->currentText());
//    2.配置波特率   注意把String ->intserialPort->setBaudRate(ui->comboBox_Baudrate->currentText().toInt());
//    3.配置数据位serialPort->setDataBits(QSerialPort::DataBits(ui->comboBox_dataBit->currentText().toInt()));
//    4.配置校验位switch (ui->comboBox_checkBit->currentIndex()) // 根据下标来匹配{case 0:serialPort->setParity(QSerialPort::NoParity);break;case 1:serialPort->setParity(QSerialPort::EvenParity);break;case 2:serialPort->setParity(QSerialPort::MarkParity);break;case 3:serialPort->setParity(QSerialPort::OddParity);break;case 4:serialPort->setParity(QSerialPort::SpaceParity);break;default:serialPort->setParity(QSerialPort::UnknownParity);break;}//    5.配置停止位serialPort->setStopBits(QSerialPort::StopBits(ui->comboBox_stopBit->currentData().toInt()));
//    6.流控if(ui->comboBox_fileCon->currentText() == "None")serialPort->setFlowControl(QSerialPort::NoFlowControl);// 配置完毕,打开串口if(serialPort->open(QIODevice::ReadWrite)){ // open -- 能成功打开,返回trueqDebug()<<"serial open success!";//打开串口后这些串口参数就不可以设置了ui->comboBox_dataBit->setEnabled(false);ui->comboBox_fileCon->setEnabled(false);ui->comboBox_stopBit->setEnabled(false);ui->comboBox_Baudrate->setEnabled(false);ui->comboBox_checkBit->setEnabled(false);ui->comboBox_serialNum->setEnabled(false);ui->btnSendContext->setEnabled(true); //串口打开成功,允许发送ui->btnCloseOrOpenSerial->setText("关闭串口");serialStatus  = true; // 打开成功,设置状态}//打开失败,给出提示else{QMessageBox msgBox;msgBox.setWindowTitle("打开串口错误!");msgBox.setText("打开失败,串口可能占用被拔出");msgBox.exec();}}else{ // if 串口已经打开我们就关闭串口,并且让 参数可选serialPort->close(); // 关闭串口serialStatus = false; // 关闭成功,设置状态ui->btnCloseOrOpenSerial->setText("打开串口");ui->comboBox_dataBit->setEnabled(true);ui->comboBox_fileCon->setEnabled(true);ui->comboBox_stopBit->setEnabled(true);ui->comboBox_Baudrate->setEnabled(true);ui->comboBox_checkBit->setEnabled(true);ui->comboBox_serialNum->setEnabled(true);ui->btnSendContext->setEnabled(false); //串口关闭,无法向串口发送}}

效果展示
 

setEnable  --  设置comboBox 是否可变

 

 观察下面的左下角串口配置信息 和 发送按钮的 深色(不可操作) / 白色(可操作)



方式二: checkable --> 利用槽函数判断串口是否被打开


先 √ checkbool

在重新生成 checkbool 类型的 槽函数  



 

void Widget::on_btnCloseOrOpenSerial_clicked(bool checked)
{if(!checked){ //串口没有被打开  --> 配置参数,打开串口//    1.选择端口号serialPort->setPortName(ui->comboBox_serialNum->currentText());
//    2.配置波特率   注意把String ->intserialPort->setBaudRate(ui->comboBox_Baudrate->currentText().toInt());
//    3.配置数据位serialPort->setDataBits(QSerialPort::DataBits(ui->comboBox_dataBit->currentText().toInt()));
//    4.配置校验位switch (ui->comboBox_checkBit->currentIndex()) // 根据下标来匹配{case 0:serialPort->setParity(QSerialPort::NoParity);break;case 1:serialPort->setParity(QSerialPort::EvenParity);break;case 2:serialPort->setParity(QSerialPort::MarkParity);break;case 3:serialPort->setParity(QSerialPort::OddParity);break;case 4:serialPort->setParity(QSerialPort::SpaceParity);break;default:serialPort->setParity(QSerialPort::UnknownParity);break;}//    5.配置停止位serialPort->setStopBits(QSerialPort::StopBits(ui->comboBox_stopBit->currentData().toInt()));
//    6.流控if(ui->comboBox_fileCon->currentText() == "None")serialPort->setFlowControl(QSerialPort::NoFlowControl);// 配置完毕,打开串口if(serialPort->open(QIODevice::ReadWrite)){ // open -- 能成功打开,返回trueqDebug()<<"serial open success!";//打开串口后这些串口参数就不可以设置了ui->comboBox_dataBit->setEnabled(false);ui->comboBox_fileCon->setEnabled(false);ui->comboBox_stopBit->setEnabled(false);ui->comboBox_Baudrate->setEnabled(false);ui->comboBox_checkBit->setEnabled(false);ui->comboBox_serialNum->setEnabled(false);ui->btnSendContext->setEnabled(true); //串口打开成功,允许发送ui->btnCloseOrOpenSerial->setText("关闭串口");// serialStatus  = true; // 打开成功,设置状态}//打开失败,给出提示else{QMessageBox msgBox;msgBox.setWindowTitle("打开串口错误!");msgBox.setText("打开失败,串口可能占用被拔出");msgBox.exec();}}else{ // if 串口已经打开我们就关闭串口,并且让 参数可选serialPort->close(); // 关闭串口// serialStatus = false; // 关闭成功,设置状态ui->btnCloseOrOpenSerial->setText("打开串口");ui->comboBox_dataBit->setEnabled(true);ui->comboBox_fileCon->setEnabled(true);ui->comboBox_stopBit->setEnabled(true);ui->comboBox_Baudrate->setEnabled(true);ui->comboBox_checkBit->setEnabled(true);ui->comboBox_serialNum->setEnabled(true);ui->btnSendContext->setEnabled(false); //串口关闭,无法向串口发送}
}

相关文章:

从零开始实现自己的串口调试助手(3) - 显示底部收发,优化串口打开/关闭

注意: 1. 我们要实现自发自收&#xff0c;要将tx&#xff0c;rx连起来 2.发送的 不能是中文符号&#xff0c;因为这可能导致&#xff0c;读取到的是英文符号 --> 导致接收到的size 和发送的size 大小不一致 3.注意同时定义两个槽函数的时候两个槽函数都会被调用&#xff0c;…...

更改Web网站设计——css和css框架

虽然使用HTML可以定义文章的结构&#xff0c;但是其中不包含设计相关的信息。此时CSS就派上用场&#xff0c;可以用它对HTML文章指定设计样式。由于可以决定Web网页的外观风格&#xff0c;因此&#xff0c;它有时也被称为格式表。 如果使用CSS设置背景色&#xff0c;文…...

持续监控和优化的简单介绍

DevOps 监控提供了有关生产环境状况的全面且最新的信息&#xff0c;以及有关其服务、基础设施和应用程序的详细信息。通过从日志和指标中收集数据&#xff0c;您可以在软件开发生命周期的每个步骤中监控合规性和性能。 监控不仅仅针对生产问题&#xff0c;它涵盖了规划、开发、…...

针对硅基氮化镓高电子迁移率晶体管(GaN-HEMT)的准物理等效电路模型,包含基板中射频漏电流的温度依赖性

来源&#xff1a;Quasi-Physical Equivalent Circuit Model of RF Leakage Current in Substrate Including Temperature Dependence for GaN-HEMT on Si&#xff08;TMTT 23年&#xff09; 摘要 该文章提出了一种针对硅基氮化镓高电子迁移率晶体管&#xff08;GaN-HEMT&…...

基于websocket与node搭建简易聊天室

一、前言 上一篇文章介绍了websocket的详细用法与工具类的封装&#xff0c;本篇就基于websocket搭建一个简易实时的聊天室。 在本篇开始之前也可以去回顾一下websocket详细用法&#xff1a;WebSocket详解与封装工具类 二、基于node搭建后台websocket服务 首先确认本机电脑中…...

DevOps全面综述:从概念到实践

一、背景与概述 1.1 DevOps的起源与发展 DevOps&#xff08;Development and Operations的缩写&#xff09;是软件工程领域中的一种文化和实践方法&#xff0c;旨在促进开发团队与运维团队之间的协作&#xff0c;从而实现更高效、更可靠的软件交付。DevOps起源于敏捷软件开发方…...

[C++]vector的模拟实现

下面是简单的实现vector的功能&#xff0c;没有涉及使用内存池等复杂算法来提高效率。 一、vector的概述 &#xff08;一&#xff09;、抽象数据类型定义 容器&#xff1a;向量&#xff08;vector&#xff09;vector是表示大小可以变化的数组的序列容器。像数组一样&#xf…...

【云原生】Kubernetes----POD控制器

目录 引言 一、Pod控制器概述 二、Pod控制器的种类 &#xff08;一&#xff09;ReplicaSet &#xff08;二&#xff09;Deployment &#xff08;三&#xff09;StatefulSet &#xff08;四&#xff09;DaemonSet &#xff08;五&#xff09;Job 三、使用POD控制器 &a…...

Java环境配置(超详细)

Java环境配置&#xff08;超详细&#xff09; 引言1、安装 JDK1.1、下载安装JDK1.2、配置环境变量&#xff1a;JAVA_HOME1.3、将JAVA_HOME添加到Path中 2、安装 Maven2.1、下载安装Maven2.2、配置maven的环境变量: M2_HOME2.3、将Maven变量添加到Path中 引言 Java开发环境的配…...

【操作系统】(详细理解进程的状态)执行状态、就绪状态、阻塞状态、挂起状态

下面是进程的几种状态的概念&#xff1a; 执行状态&#xff1a;当一个进程已获得必要资源&#xff0c;并占有CPU进行执行。 就绪状体&#xff1a;进程已分配到除CPU外的所有必要资源&#xff0c;只要获取CPU允许就可立即执行。 阻塞状态&#xff1a;正在执行的进程&#xff0c;…...

C++ -- string常用接口的底层实现

一.string介绍 1. string是表示字符串的字符串类&#xff0c;对C语言的字符串指针进行了包装。 2. 该类的接口与常规容器的接口基本相同&#xff0c;有增删查改等&#xff0c;再添加了一些专门用来操作string的常规操作。 二.成员变量 创建string类的时候要在自己的命名空间…...

怎么做好企业短信服务呢?(文字短信XML接口示例)

企业短信服务已经成为各行各业都信赖的行业推广方式之一&#xff0c;并且短信行业也与时俱进的发展着&#xff0c;随之而来的就是市场上短信平台的数量也随之增多。那么怎么在鱼龙混杂的短信行业中选择适合自己的企业短信服务平台呢&#xff1f;企业短信服务平台又适用于哪些应…...

鸿蒙小案例-音乐播放器

之前参加鸿蒙比赛的音乐播放器 效果展示 HF音乐效果展示 功能列 有一些功能没写上去&#xff0c;自行发掘 说明&#xff1a; 1.API:网易云接口&#xff0c;QQ个人接口&#xff0c; 需要请看gitee 2.本地关系型数据由bug,提的工单已确认&#xff0c;建议使用API11,12,9的不稳…...

语言模型测试系列【9】

语言模型 文心一言讯飞星火通义千问2.5豆包360智脑百小应腾讯元宝KimiC知道 好长时间没有做语言模型的测试了&#xff0c;一方面是没有好的素材&#xff0c;各模型都在升级优化&#xff0c;而且频率很高&#xff1b;另一方面近期在阅读和学习其他的知识&#xff0c;所以更的也…...

优思学院|质量工程师工资不高怎么办?

你是否曾经好奇&#xff0c;为什么在职场中&#xff0c;质量工程师的工资普遍不高&#xff1f;这一现象背后的原因&#xff0c;实际上与他们的职业门槛和专业知识密切相关。早期&#xff0c;国内的质量工程师入行门槛较低&#xff0c;许多人即使没有任何专业知识也可以进入这一…...

【面向就业的Liux基础】从入门到熟练,探索Linux的秘密(一)

主要帮助大家面向工作过程中Linux系统常用的命令联系&#xff0c;采用极致的实用主义&#xff0c;帮助大家节省时间。 文章目录 前言 一、linux系统 二、linux系统基本命令 1.Linux系统的目录结构 2. 常用命令介绍 3.命令演示 4.作业练习 总结 前言 主要帮助大家面向工作过程中…...

高效数据处理的前沿:【C++】、【Redis】、【人工智能】与【大数据】的深度整合

目录 1.为什么选择 C 和 Redis&#xff1f; 2.人工智能与大数据的背景 1.大数据的挑战 2.人工智能的需求 3.C 与 Redis 的完美结合 1.安装 Redis 和 Redis C 客户端 2.连接 Redis 并进行数据操作 高级数据操作 列表操作 哈希操作 4.与大数据和人工智能结合 5.实际应…...

Vitis HLS 学习笔记--控制驱动与数据驱动混合编程

目录 1. 简介 2. 示例分析 2.1 代码分析 2.2 控制驱动TLP的关键特征 2.3 数据驱动TLP的关键特征 3. 总结 1. 简介 在 HLS 硬件加速领域&#xff0c;Vitis HLS 提供了强大的抽象并行编程模型。这些模型包括控制驱动和数据驱动的任务级并行性&#xff08;TLP&#xff09;&…...

VUE3 学习笔记(12):对比Vuex与Pinia状态管理的基本理解

在组件传值中&#xff0c;当嵌套关系越来越复杂的时候必然会将混乱&#xff0c;是否可以把一些值存在一个公共位置&#xff0c;无须传值直接调用呢&#xff1f;VUEX应运而生&#xff0c;但是从VUE3开始对VUEX的支持就不那么高了&#xff0c;官方推荐使用Pinia。 Vuex配置 ST1:…...

区间预测 | Matlab实现QRCNN-BiGRU-Attention分位数回归卷积双向门控循环单元注意力机制时序区间预测

区间预测 | Matlab实现QRCNN-BiGRU-Attention分位数回归卷积双向门控循环单元注意力机制时序区间预测 目录 区间预测 | Matlab实现QRCNN-BiGRU-Attention分位数回归卷积双向门控循环单元注意力机制时序区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...