news 2026/5/8 5:19:16

解决Modbus 主站回读数据时,eRcvState 一直保持在 STATE_M_RX_IDLE状态,导致无法正常接收数据的问题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
解决Modbus 主站回读数据时,eRcvState 一直保持在 STATE_M_RX_IDLE状态,导致无法正常接收数据的问题

调试报告

问题描述

在 Modbus 主站回读数据时,eRcvState一直保持在STATE_M_RX_IDLE状态,导致无法正常接收数据。经过检查,发现问题出在主循环的轮询调用上。

BOOLxMBMasterRTUReceiveFSM(void){BOOL xTaskNeedSwitch=FALSE;UCHAR ucByte;assert_param((eSndState==STATE_M_TX_IDLE)||(eSndState==STATE_M_TX_XFWR));/* Always read the character. */(void)xMBMasterPortSerialGetByte((CHAR*)&ucByte);switch(eRcvState){/* If we have received a character in the init state we have to * wait until the frame is finished. */caseSTATE_M_RX_INIT:vMBMasterPortTimersT35Enable();break;/* In the error state we wait until all characters in the * damaged frame are transmitted. */caseSTATE_M_RX_ERROR:vMBMasterPortTimersT35Enable();break;/* In the idle state we wait for a new character. If a character * is received the t1.5 and t3.5 timers are started and the * receiver is in the state STATE_RX_RECEIVCE and disable early * the timer of respond timeout . */caseSTATE_M_RX_IDLE:/* In time of respond timeout,the receiver receive a frame. * Disable timer of respond timeout and change the transmiter state to idle. */vMBMasterPortTimersDisable();eSndState=STATE_M_TX_IDLE;usMasterRcvBufferPos=0;ucMasterRTURcvBuf[usMasterRcvBufferPos++]=ucByte;eRcvState=STATE_M_RX_RCV;/* Enable t3.5 timers. */vMBMasterPortTimersT35Enable();break;/* We are currently receiving a frame. Reset the timer after * every character received. If more than the maximum possible * number of bytes in a modbus frame is received the frame is * ignored. */caseSTATE_M_RX_RCV:if(usMasterRcvBufferPos<MB_SER_PDU_SIZE_MAX){ucMasterRTURcvBuf[usMasterRcvBufferPos++]=ucByte;}else{eRcvState=STATE_M_RX_ERROR;}vMBMasterPortTimersT35Enable();break;}returnxTaskNeedSwitch;}

在这个函数中,eRcvState 一直等于0x01 STATE_M_RX_IDLE,一次 case STATE_M_RX_RCV的分支都没执行

原因分析

原始代码中,Modbus 主站的轮询函数 eMBMasterPoll() 在主循环中调用频率过高,导致状态机无法正常切换。具体代码如下:

while(1){// 主机轮询eMBMasterPoll();// 非阻塞方式轮询,避免 HAL_Delay 占用 CPU。if(HAL_GetTick()-lastPollTime>=1000){test(MB_USER_READ_CALLBACK);lastPollTime=HAL_GetTick();// 延时1秒}HAL_Delay(MB_POLL_CYCLE_MS);// 延时1秒}

解决方案

将主循环中的轮询调用调整为合理的频率,确保状态机能够正常切换。调整后的代码如下:

while(1){MX_LWIP_Process();// Modbus 从机轮询eMBPoll();// 主站轮询,调整频率以避免回读问题if(HAL_GetTick()-lastPollTime1>=200){eMBMasterPoll();lastPollTime1=HAL_GetTick();// 延时200ms}// 非阻塞方式轮询,避免 HAL_Delay 占用 CPU。if(HAL_GetTick()-lastPollTime>=1000){test(MB_USER_READ_CALLBACK);lastPollTime=HAL_GetTick();// 延时1秒}}

总结

通过调整主循环中 Modbus 主站轮询的调用频率,解决了eRcvState一直保持在STATE_M_RX_IDLE的问题,确保了主站能够正常接收数据。此调试过程强调了合理设置轮询频率的重要性,避免因调用过于频繁导致状态机无法正常运作。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/3 0:24:27

前端框架文档新思路:基于源码解析的自动化方案

项目背景最近我们团队自研了一个基于 React 的 H5 前端框架&#xff0c;领导让我来负责编写框架的使用文档。我选择了 dumi 来搭建文档站点&#xff0c;大部分内容都是手动写 Markdown 来介绍各种功能&#xff0c;包括&#xff1a;初始化、目录结构、生命周期、状态管理、插件系…

作者头像 李华
网站建设 2026/4/30 20:39:03

如何用UML图构建完整图书管理系统

如何用UML图构建完整图书管理系统 【免费下载链接】图书管理系统的UML图资源 本项目提供了一套完整的图书管理系统UML图资源&#xff0c;涵盖用例图、时序图、协作图等多种图表类型&#xff0c;帮助开发者深入理解系统的功能、结构与行为。资源包括静态图&#xff08;如类图、组…

作者头像 李华
网站建设 2026/5/5 5:36:29

TMK325ABJ476MM-P:25V/47uF多层陶瓷电容, 现货库存

型号介绍&#xff1a;今天我要向大家介绍的是 TAIYOU 的一款电容器——TMK325ABJ476MM-P。 它拥有47uF的大容量能有效平滑电源波动&#xff0c;25V的额定电压覆盖了多数通用设备的工作范围&#xff0c;而X5R温度特性确保在-55℃至85℃环境下性能稳定。更让他满意的是1210/3225的…

作者头像 李华
网站建设 2026/5/7 23:35:46

ERP与OA系统集成领先厂家:推动企业智能化协同管理

在数字化转型浪潮席卷各行各业的今天&#xff0c;企业资源规划&#xff08;ERP&#xff09;系统与办公自动化&#xff08;OA&#xff09;系统的高效集成已成为提升组织运营效率的关键。选择一家靠谱的ERP与OA系统集成厂家&#xff0c;不仅能够打通企业内部的信息孤岛&#xff0…

作者头像 李华
网站建设 2026/5/4 21:20:39

verl框架RLHF训练完全指南:从入门到实战

verl框架RLHF训练完全指南&#xff1a;从入门到实战 【免费下载链接】verl verl: Volcano Engine Reinforcement Learning for LLMs 项目地址: https://gitcode.com/GitHub_Trending/ve/verl 你是否曾经想过&#xff0c;为什么ChatGPT能够如此自然地对话&#xff1f;为什…

作者头像 李华
网站建设 2026/5/1 0:06:25

API设计新标准:Google AIPs如何提升你的接口开发质量

在当今API驱动的软件开发世界中&#xff0c;一个优秀的API设计规范能够显著提升团队协作效率和代码质量。API Improvement Proposals&#xff08;AIPs&#xff09;正是Google推出的这样一套革命性的API设计文档规范&#xff0c;它为开发者提供了一套完整且实用的API设计方法论。…

作者头像 李华