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

使用qt编写上位机程序,出现串口死掉无法接受数据的bug

项目场景:

使用qt编写上位机程序,出现串口死掉无法接受数据的bug


问题描述

串口打开后一段时间内可以接受串口数据,过了一段时间后,端口就失去了响应,观察下位机指示灯发现下位机的串口还是在正常发送数据,使用其它串口工具打开也能正常接收数据,当上位机的串口死掉之后关掉串口重新打开又能正常接收数据了,过一会儿又会死掉,关掉串口再重新打开又恢复正常。

经调试发现,串口死掉之后时的串口状态仍是open状态,查看缓冲区并没有满,调用error()方法打印错误信息为noerror


原因分析:

多种可能:
1、程序采用的信号机制来读取信息,当产生readyread信号之后,由槽函数进行数据读取并处理,数据的读取和处理位于了同一个线程,可能导致下一包数据来时,上一包的数据还在处理,无法响应readyread信号并读物数据,进而导致上位机的串口缓冲区溢出,再无法触发readyread信号;

2、程序使用了很多定时器,有可能定时器触发定时信号和readyread信号冲突了,信号没有得到处理,进而影响了后续的readyread信号产生;

等等


解决方案:

1、串口和数据处理以及UI显示分别在不同的线程中处理;
2、设置各定时器的定时周期时避免同线程内出现多定时器同时触发的情况,譬如timerA定时周期为2ms、tiemrB的定时周一为1ms,那么在两个定时器同时启动之后,在初始值分别为2ms和1ms的情况下,2ms后两个定时器会同时触发。
3、将信号与槽的连接尽量选择队列的方式,避免,信号没有被处理完,或者产生冲突;
4、设置串口超时处理函数,在串口超时处理函数里以下两行代码:

port->clear(QSerialPort::Input);  // 仅清空输入缓冲区
QCoreApplication::processEvents(); // 强制处理事件队列‌

我是在试了1、2、3之后问题还是没有解决,甚至尝试了在超时函数里面尝试了重启串口,没想到问题没解决还出现了程序闪退的问题。最终在删掉重启串口的操作,添加4之后问题得到解决,这个bug折磨了我近半个月,好在解决了。

http://www.lryc.cn/news/596129.html

相关文章:

  • vue2 webpack 部署二级目录、根目录nginx配置及打包配置调整
  • 【深度解析】从AWS re_Invent 2025看云原生技术发展趋势
  • kafka主题管理详解 - kafka-topics.sh
  • C++ 结构体(struct)与联合体(union)
  • 逻辑回归全景解析:从数学本质到工业级优化
  • AWS PrivateLink方式访问Redis
  • NIO技术原理以及应用(AI)
  • AWS RDS 排查性能问题
  • 图像基础:从像素到 OpenCV 的入门指南
  • 基于python django深度学习的中文文本检测+识别,可以前端上传图片和后台管理图片
  • 【学习路线】Python全栈开发攻略:从编程入门到AI应用实战
  • Spring 核心知识点梳理 1
  • 2.9学习DOM和BOM (主要是获取元素的操作)
  • 【element-ui el-table】多选表格勾选时默认勾选了全部,row-key绑定异常问题解决
  • 重塑优化建模与算法设计:2025年大模型(LLM)在优化领域的应用盘点 - 1
  • MybatisPlus-16.扩展功能-枚举处理器
  • SpringMVC快速入门之核心配置详解
  • 【windows修复】解决windows10,没有【相机] 功能问题
  • Azure可靠性架构指南:构建云时代的高可用系统
  • xss-labs解答
  • 本地数据库有数据,web页面无信息显示,可能是pymysql的版本问题【pymysql连接本地数据库新旧版本的区别】
  • 【51单片机定时器T0输出10毫秒周期方波12M晶振】2022-6-28
  • Web开发 05
  • verilator如何实现RTL的仿真(腾讯混元)
  • 牛客NC16625 [NOIP2009]分数线划定(排序)
  • vue3:十八、内容管理-实现内容的数据展示,开关switch设行,tag标签展示
  • 北京-4年功能测试2年空窗-报培训班学测开-第五十七天
  • Datawhale AI 夏令营-心理健康Agent开发学习-Task1
  • React 面试题库
  • Vue 3 面试题全套题库