news 2026/6/10 15:35:55

解决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/6/8 4:54:58

东京IT软件会社-(株)GSD|多种技术栈募集,高度人才+20分

【株式会社GSD 採用情報】 募集中のポジション Java / C# / Salesforce / AWS / GO / COBOL など多様な開発エンジニア、およびプロジェクトマネージャー&#xff08;PM&#xff09;を募集しています。 働く環境 高度人材ポイント対象&#xff08;20点&#xff09; 勤務時間&…

作者头像 李华
网站建设 2026/6/9 15:01:47

揭秘3D微结构重建:5个实战步骤带你从零掌握材料科学分析

揭秘3D微结构重建&#xff1a;5个实战步骤带你从零掌握材料科学分析 【免费下载链接】DREAM3D Data Analysis program and framework for materials science data analytics, based on the managing framework SIMPL framework. 项目地址: https://gitcode.com/gh_mirrors/dr…

作者头像 李华
网站建设 2026/6/8 2:47:42

OpenBao终极指南:构建现代应用的安全基石

OpenBao终极指南&#xff1a;构建现代应用的安全基石 【免费下载链接】openbao OpenBao exists to provide a software solution to manage, store, and distribute sensitive data including secrets, certificates, and keys. 项目地址: https://gitcode.com/gh_mirrors/op…

作者头像 李华
网站建设 2026/6/10 15:32:13

AWR1843毫米波雷达终极指南:5分钟实现实时数据可视化的完整方案

德州仪器AWR1843毫米波雷达作为业界领先的77GHz传感解决方案&#xff0c;在智能驾驶、工业检测等领域广泛应用。然而&#xff0c;从原始雷达数据到直观可视化展示的技术门槛&#xff0c;往往让初学者望而却步。今天我们将深入评测一个基于Python的开源工具&#xff0c;它能让你…

作者头像 李华
网站建设 2026/6/10 7:23:37

量价合一副图四线粘合共振变盘行情

{}DIF:EMA(CLOSE,12)-EMA(CLOSE,26); DEA:EMA(DIF,9); MACD:(DIF-DEA)*2,COLORSTICK; DIFL:EMA(VOL,12)-EMA(VOL,26); DEAL:EMA(DIFL,9); MACL:(DIFL-DEAL)*2,COLORSTICK; 基点:CONST(LLV(MACL,250)); 基:CONST(HHV(MACL,250))-基点; STICKLINE(MACL>0,0,MACL,2,-1),colorli…

作者头像 李华
网站建设 2026/6/10 15:31:03

软件定制开发哪家技术强

软件定制开发行业分析&#xff1a;广州青橙动力科技有限公司的技术优势一、行业痛点分析在软件定制开发领域&#xff0c;存在着诸多技术挑战。首先&#xff0c;不同客户的业务需求差异巨大&#xff0c;这就要求开发者能够精准地理解并转化为可行的技术方案。例如&#xff0c;在…

作者头像 李华