记录一次Modbus通信的置位错误

老套路,一图胜千言,框图可能有点随意,后面我会解释

先描述下背景,在Modbus线程内有一个死循环,一直在读8个线圈的状态,该线程内读到的消息会直接发送给UI线程,UI线程会解析Modbus数据帧,然后拿到8个布尔值,如果发现M1的值为true就发送置位信号,该信号连接到了Modbus线程,其实就是将一个置位命令添加到队列。

ModBus线程一直也在判断队列是否为空,如果不为空就发送置位数据帧,且本次循环略过发送读取状态的命令,因为判断用户队列和读取状态的代码块是if else的关系最后呈现的现象是每次都会收到两次置位信号,有时甚至是三次,经过一天半的折腾,各种打日志,分析,加互斥量,加标志位,我认知范围内的办法上齐了,依然解决不了。后来通过打印每个消息发送的时间大概猜到了问题,就是说当Modbus线程接收到数据帧,会马上发送给UI线程,但是在死循环下一个周期的时候判断队列依然是空的,于是它又读了一次,又发送了一次数据帧,直到死循环的第三个周期才判断到队列内有命令了,然后才发送了置位信号,所以呈现出的现象就是读到了两次置位信号,其实为题就出在我在Modbus线程接收到数据后并没有处理,而是原封不动的发给了UI线程,等UI线程处理完,添加命令到队列的时候,Modbus线程的死循环已经又跑了一次了,就造成了这个现象。后来通过加标志位的方式解决了这个问题。

相关推荐
小短腿的代码世界2 小时前
Qt进程间通信全体系深度解析:从QSharedMemory到本地Socket的七层武器
开发语言·qt
学习,学习,在学习3 小时前
Qt工控仪器程序框架设计详解(工控多仪器控制版本)
开发语言·c++·qt
mengzhi啊6 小时前
qt程序release版在Windows运行崩溃。使用dump文件+vs2022进行解析+豆包
qt
sycmancia8 小时前
Qt——拖放事件深度剖析
开发语言·qt
长沙红胖子Qt9 小时前
项目实战:Qt圆形百分比进度控件基础设计构架Demo
qt·圆形进行百分比控件
我在人间贩卖青春11 小时前
重学Qt——模型视图结构
qt
qq_4017004111 小时前
Qt如何 发送带结构体数据的信号
开发语言·qt
xiaoye-duck12 小时前
Qt 初识核心:从 HelloWorld 到基础控件,吃透对象树与内存管理
开发语言·qt
小短腿的代码世界13 小时前
KDReports源码深度解析:Qt报表引擎如何做到“所见即所得“?从模板引擎到PDF导出的完整渲染管线揭秘
网络·qt·pdf
小短腿的代码世界13 小时前
Qt布局系统源码深度解析:QLayout如何操控你的界面——从QBoxLayout到QGridLayout的底层引擎揭秘
开发语言·数据库·qt