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

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

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

在这里插入图片描述

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

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

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

相关文章:

  • 数据结构--递归与分治
  • spring cloud gateway中出现503
  • 战略在集体学习过程中涌现
  • html动态爱心代码【四】(附源码)
  • 如何利用SLF4J扩展模块实现高效的日志记录
  • 通用语言模型蒸馏-GLMD
  • kafka--技术文档-基本概念-《快速了解kafka》
  • ChatGPT:ChatGPT 的发展史,ChatGPT 优缺点以及ChatGPT 在未来生活中的发展趋势和应用
  • 【八股】2023秋招八股复习笔记4(MySQL Redis等)
  • 【Unity】 Mesh 和 Mesh.subMeshCount
  • Java开发中Word转PDF
  • 【前端】vscode前端插件笔记
  • windows MFC消息demo
  • 尚硅谷大数据项目《在线教育之离线数仓》笔记003
  • 银河麒麟arm版服务器安装docker
  • 三个视角解读ChatGPT在教学创新中的应用
  • PHP求职招聘系统Dreamweaver开发mysql数据库web结构php编程计算机网页
  • Mysql 基本概念
  • python开发--文件敏感信息识别
  • 【力扣】746. 使用最小花费爬楼梯 <动态规划>
  • sftp命令 添加端口(亲测)
  • Redis.conf详解
  • 【论文笔记】Planning and Decision-Making for Autonomous Vehicles
  • 视频云存储/安防监控EasyCVR视频汇聚平台接入GB国标设备时,无法显示通道信息该如何解决?
  • git中,add到暂存区,commit且push之后,暂存区域里还有内容吗
  • java中用SXSSFWorkbook把多个字段的list数据和单个实体dto导出到excel如何导出到多个sheet页详细实例?
  • ES基础操作
  • PCIE超高速实时运动控制卡在六面外观视觉检测上的应用
  • ctfshow web入门 php特性 web108-web112
  • 数据可视化是什么?有什么工具?