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

news/2025/3/14 1:00:38/

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

在这里插入图片描述

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

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


http://www.ppmy.cn/news/1064205.html

相关文章

软件架构业务及技术复杂度分析总结

目录 一、综述分析 二、业务复杂性分析 (一)领域建模 (二)领域分层 (三)服务粒度 (四)流程编排 三、技术复杂性分析 (一)高可用 底层逻辑 CAP原则 …

springboot整合第三方技术邮件系统

springboot整合第三方技术邮件系统,发邮件是java程序的基本操作,springboot整合javamail其实就是简化开发。不熟悉邮件的小伙伴可以先学习完javamail的基础操作,再来看这一部分内容才能感触到springboot整合javamail究竟简化了哪些操作。简化…

【CSS】轮播图案例开发 ( 基本设置 | 子绝父相 | 浏览器水平居中 | 圆角设置 | 绝对定位居中设置 )

代码示例 : <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Banner 轮播</title><style>/* 取消浏览器或者其它标签的默认的内外边距 */* {margin: 0;padding: 0;}/* 取消列表样式 主要是…

Mybatis-Plus如何进行时间日期的比较

获取数据库中跟当前日期相等的记录时&#xff0c;还是调用eq方法&#xff0c;所以实体类包括数据库中的类型是Date&#xff0c;而不是DateTime&#xff0c;否则只能获取相同时刻的数据。 pulbic void main(){LocalDate now LocalDate.now();LambdaQueryWrapper<Ebbinghaus…

软考A计划-系统集成项目管理工程师-小抄手册(共25章节)-下

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

理解底层— —Golang缓冲bufio,让io效率提升10倍(自实现)

Golang缓冲bufio&#xff0c;让效率提升10倍&#xff08;自实现&#xff09; 1 分析 我们都知道操作系统往内存写入数据的速度比往磁盘写快了好几个量级。主要原因是因为磁盘的IO耗时间过长。 因此在通过代码操作文件时&#xff0c;我们要尽可能的减少磁盘的IO操作。golang中提…

Unity3D软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 Unity3D是一款全球知名的游戏开发引擎&#xff0c;由Unity Technologies公司开发。它提供了一个跨平台、多功能的开发环境&#xff0c;支持创建2D和3D游戏、交互式应用、虚拟现实、增强现实等多种类型的应用程序。以下是Unity3D…

Spring Authorization Server入门 (十六) Spring Cloud Gateway对接认证服务

前言 之前虽然单独讲过Security Client和Resource Server的对接&#xff0c;但是都是基于Spring webmvc的&#xff0c;Gateway这种非阻塞式的网关是基于webflux的&#xff0c;对于集成Security相关内容略有不同&#xff0c;且涉及到代理其它微服务&#xff0c;所以会稍微比较麻…