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

使用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.xdnf.cn/news/16007.html

相关文章:

  • 【windows修复】解决windows10,没有【相机] 功能问题
  • 前端学习 4:一些术语集合
  • 自研能管项目开发界面
  • uniapp “requestPayment:fail [payment支付宝:62009]未知错误“
  • Gerrit多仓库对应多邮箱配置办法
  • 上下文工程的系统性优化:从组件到整合架构
  • 【ArcGIS Pro】设置临时存储文件夹(计算缓存数据存放位置)
  • 网络安全实验 番外篇 使用Web登录eNSP中防火墙
  • 【指南】网络安全领域:HW 行动(国家网络安全攻防演练)是什么?
  • opencv简介(附电子书资料)
  • 2025乐彩V8影视系统技术解析:双端原生架构与双H5免签封装实战 双端原生+双H5免签封装+TV级性能优化,一套代码打通全终端生态
  • MySql 运维性能优化
  • 为什么使用扩展坞会降低显示器的最大分辨率和刷新率
  • 数字签名(Digital Signature)
  • JVM:工具
  • A316-HF-I2S-V1:USB TO I2S HiFi音频转换器评估板技术解析
  • C语言---VSCODE的C语言环境搭建
  • VR技术在元宇宙游戏中的作用及发展前景深度分析
  • 基于mysql云数据库创建和美化表格,对比分析Power BI和Quick BI的功能优劣
  • 《C++初阶之STL》【string类:详解 + 实现】
  • “我在京东外卖上的120天”
  • 记一次flink资源使用优化
  • 操作系统 —— A / 概述
  • 探索飞算JavaAI:AI赋能Java开发的新范式
  • 内网穿透利器:基于HTTPHTTPS隧道的代理工具深度解析
  • Vue3中watch和watchEffect区别和用法
  • 电商项目_秒杀_架构及核心
  • 借助AI学习开源代码git0.7之七commit-tree
  • OpenCV基本的图像处理
  • 风险识别清单:构建动态化的风险管理体系