从零开始实现自己的串口调试助手(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); //串口关闭,无法向串口发送}
}

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

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

相关文章

MySQL数据表的设计

实际工程中, 对于数据表的设计和创建, 我们遵循以下步骤: 首先确定实体, 找到关键名词, 提取关键信息, 设计表有哪些列, 每一列是什么. (有几个实体, 一般就创建几个表, 一般一个表对应一个实体) 实体之间的关系: 1. 一对一关系 例如: 一个学生, 只能有一个账号; 一个账号只…

【区分vue2和vue3下的element UI Select 选择器组件,分别详细介绍属性,事件,方法如何使用,并举例】

在 Vue 2 的 Element UI 和 Vue 3 的 Element Plus 中&#xff0c;el-select 选择器组件是一个常用的表单控件&#xff0c;用于从一组选项中选择一个或多个值。以下是对这两个版本下 el-select 组件的属性、事件和方法的详细介绍&#xff0c;并附带示例。 Vue 2 的 Element UI…

Flutter 中的 SliverMainAxisGroup 小部件:全面指南

Flutter 中的 SliverMainAxisGroup 小部件&#xff1a;全面指南 Flutter 是一个由 Google 开发的跨平台 UI 框架&#xff0c;它提供了多种布局和控件来帮助开发者构建高性能、美观的移动和 web 应用。在 Flutter 的滚动和布局体系中&#xff0c;SliverMainAxisGroup 是一个较少…

基于单片机的病床呼叫系统设计研究

摘要&#xff1a;随着无线技术的快速发展&#xff0c;无线应用技术已经运用到人们生产生活中的多个领域&#xff0c;运用无线技术来设计病床呼叫系统能够实现无线信号的远距离传输&#xff0c;减少材料耗费&#xff0c;使医患之间的沟通更加便捷&#xff0c;该系统运用单片机作…

决定短视频打开率的要素:成都鼎茂宏升文化传媒公司

​ 在当下这个短视频盛行的时代&#xff0c;无论是个人创作者还是企业品牌&#xff0c;都希望通过短视频平台获得更多的曝光和关注。然而&#xff0c;如何让自己的短视频在众多内容中脱颖而出&#xff0c;吸引用户的点击和观看&#xff0c;成为了摆在我们面前的重要问题。成都…

nginx隐藏版本号、错误信息页面隐藏nginx软件、修改 HTTP 头信息中的connection 字段,防止回显具体版本号、curl命令

目录 安装之后隐藏 配置文件 源代码配置安装之前隐藏 修改nginx.h文件中的 13、14行 修改 HTTP 头信息中的connection 字段&#xff0c;防止回显具体版本号 配置文件49行 错误页面程序返回版本号、nginx隐藏 配置文件36行 ​编辑 安装nginx 相关选项说明 curl命令测试…

更新详情 | Flutter 3.22 与 Dart 3.4

作者 / Michael Thomsen 过去几个月&#xff0c;Dart & Flutter 部门可谓忙碌非凡&#xff0c;但我们很高兴地宣布&#xff0c;Flutter 3.22 和 Dart 3.4 已经在今年的 Google I/O 大会上精彩亮相&#xff01; Google I/Ohttps://io.google/2024/intl/zh/ 我们始终致力于提…

记一次mysql索引优化

生产日志告警出现一条慢 sql 告警, 通过 sql 监控平台拿到 这条sql 语句是 : SELECTid,report_id,report_detail_id,item_code,report_type,photo FROM**** 表 WHEREdel_flag 0 AND (report_type 1 AND report_detail_id IN ( 1742 )) 之后用 explain 分析这条 sql 的命中…

FPGA新起点V1开发板(九)——流水灯

文章目录 一、模块框图二、代码编写三、注意点四、总结 一、模块框图 二、代码编写 endmodule下面需要敲出一个回车代码拼接是大括号 led < {led[2:0],led[3]}注意二进制和十进制 module flow_led(input sys_clk50,input rst_n,output reg [3:0] le…

Java开发分析工具:JProfiler 14 for Mac/win 激活版下载

JProfiler是一款功能强大的Java应用程序性能分析工具&#xff0c;适用于Java开发人员和企业用户&#xff0c;可帮助他们识别和解决Java应用程序中的性能问题&#xff0c;提高应用程序的性能和稳定性。使用JProfiler&#xff0c;开发人员可以实时查看Java应用程序的性能数据&…

项目的各个阶段如何编写标准的Git commit消息

标准提交消息格式 一个标准的提交消息应包括三部分&#xff1a;标题&#xff08;summary&#xff09;、正文&#xff08;description&#xff09;和脚注&#xff08;footer&#xff09;。 1. 标题&#xff08;Summary&#xff09; 简洁明了&#xff0c;不超过50个字符。使用…

Redis数据类型(下篇)

5.Redis有序集合zset(sorted set) 本质就是在set的基础上&#xff0c;每个val值前面加了一个score分数值。 &#xff08;1&#xff09;向有序集合中添加多个&#xff08;或者一个&#xff09;元素和其对应的分数 127.0.0.1:6379> zadd zset1 100 a 90 b 80 c 70 d 60 e (…

【VMware虚拟机中ubuntu系列】—— 在虚拟机中使用本机摄像头的详细教程与常见问题分析及解决

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、虚拟机调用本机摄像头(1) 启动VMware USB 服务(2) 连接本机摄像头(3) 测试摄像头的连接 二、安装usb驱动二、运行usb_cam.launch时出现select timeout的报错…

vulhub中Nexus Repository Manager 3 未授权目录穿越漏洞(CVE-2024-4956)

Nexus Repository Manager 3 是一款软件仓库&#xff0c;可以用来存储和分发Maven、NuGET等软件源仓库。 其3.68.0及之前版本中&#xff0c;存在一处目录穿越漏洞。攻击者可以利用该漏洞读取服务器上任意文件。 环境启动后&#xff0c;访问http://your-ip:8081即可看到Nexus的…

web前端三大典型应用框架

以下是Web前端三大主流框架的作者、使用情况、典型客户。 框架名称 作者/主要开发者 使用情况 典型客户 Angular Google Angular是一个功能强大的前端框架&#xff0c;适用于开发大型和复杂的Web应用。它提供了一套完整的工具和生态系统&#xff0c;使得开发者可以高效地…

Java 虚拟机详解——Java虚拟机、垃圾回收、内存分配策略

文章目录 一、运行时数据区域程序计数器Java 虚拟机栈本地方法栈堆方法区运行时常量池直接内存 二、垃圾收集判断一个对象是否可被回收1. 引用计数算法2. 可达性分析算法3. 方法区的回收4. finalize() 引用类型1. 强引用2. 软引用3. 弱引用4. 虚引用 垃圾收集算法1. 标记 - 清除…

npm发布、更新、删除包

如何将自己开发的依赖包发布到npmjs上供别人使用&#xff1f;五个步骤搞定&#xff01; 实现步骤&#xff1a; 创建自己的工具包项目&#xff0c;进行开发。注册npmjs账号。执行npm login在控制台登录&#xff0c;填写用户信息。执行npm publish发布包。更新及删除。 步骤一…

MongoDB~俩大特点管道聚合和数据压缩(snappy)

场景 在MySQL中&#xff0c;通常会涉及多个表的一些操作&#xff0c;MongoDB也类似&#xff0c;有时需要将多个文档甚至是多个集合汇总到一起计算分析&#xff08;比如求和、取最大值&#xff09;并返回计算后的结果&#xff0c;这个过程被称为 聚合操作 。 根据官方文档介绍&…

c++【提高】简单背包问题

时间限制 : 1 秒 内存限制 : 128 MB 有一个背包能装的重量 maxw (正整数,0≤maxw≤20000),同时有 n 件物品(1≤n≤100),每件物品有一个重量 w_i(正整数)和一个价值 p_i(正整数)。要求从这 n 件物品中任取若干件装入背包内,使背包的物品价值最大。 输入 第 1 行:背包最…

【Python Cookbook】S01E05 一键多值的字典

目录 问题解决方案讨论 问题 如果希望能够将一个键&#xff08;key&#xff09;映射到多个值&#xff08;value&#xff09;上&#xff0c;那么应该如何创建这个字典&#xff1f;&#xff08;即所谓的一键多值字典 [multidict]&#xff09; 解决方案 字典是一种关联容器&…