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

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

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

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

相关推荐
沫璃染墨1 天前
《Qt从零入门系列(十四):QThread多线程详解——从线程创建到客户端阻塞处理》
开发语言·c++·笔记·qt·ui·交互·线程
代钦塔拉1 天前
【C++/Qt 进阶】设计模式系列(5):适配器模式——给“不兼容的接口“贴一层翻译膜
c++·qt·设计模式
把我格子衫拿来1 天前
VTK 9.5 与 Qt 6 联合开发:从嵌入三维窗口到可维护的桌面架构
c++·python·qt·vtk·三维可视化
把我格子衫拿来2 天前
VTK 与 Qt 的 CMake 工程怎么组织?模块、工具链与二进制兼容排错
c++·qt·vtk·cmake·工程实践
代钦塔拉2 天前
【C++/Qt 进阶】设计模式系列(4):原型模式——用“克隆“代替“重新构造“
c++·qt·设计模式
Python图像识别2 天前
56-【2027毕设】YOLO11X光安检危险物品检测系统 - Python完整源码+PyQt5界面+训练模型+数据集
python·qt·课程设计
把我格子衫拿来2 天前
鼠标点到哪里才算选中?Qt 与 VTK 的拾取坐标、DPI 与体素定位
python·qt·vtk·坐标变换·三维交互
Lhan.zzZ2 天前
Qt WebEngineView 在 Linux 上无法加载网页:从“看不见 HTML“到“禁用沙箱“
linux·c++·qt
Quz3 天前
QML TabBar 标签栏交互效果合集
qt·动画·qml
zhanghaha13143 天前
Qt 工程实例:逐词逐句保姆级讲解
qt