FreeModbus学习——定时器
创始人
2024-12-13 00:37:49
0

FreeModbus版本:1.6

协议栈初始化时会初始化定时器:
eMBInit →
eMBRTUInit →
xMBPortTimersInit( ( USHORT ) usTimerT35_50us )

协议栈使能时会使能定时器:
eMBEnable →
pvMBFrameStartCur →
eMBRTUStart →
vMBPortTimersEnable
定时器使能做的操作是:清除中断标志位,清除计数,使能定时器,重新计数

也就是说每次调用vMBPortTimersEnable
都会清除计数并重新计数

那么这个函数除了使能协议栈时调用了,还用在哪里呢

用在接收状态机里
在这里插入图片描述
当接收状态机为空闲态STATE_RX_IDLE,接收到第一个数据时作为帧首,然后接收状态机进入接收态STATE_RX_RCV,并且使能定时器(重新计数)。

当接收状态机为接收态STATE_RX_RCV,接收到的数据放入帧中,然后使能定时器(重新计数)。

也就是每接收到一个数据就要重新计数定时器,以防进入中断。

那看中断里实现了什么

定时器中断:
TIM7_IRQHandler →
prvvTIMERExpiredISR →
pxMBPortCBTimerExpired →
xMBRTUTimerT35Expired →

BOOL xMBRTUTimerT35Expired( void ) {     BOOL            xNeedPoll = FALSE;      switch ( eRcvState )     {         /* Timer t35 expired. Startup phase is finished. */     case STATE_RX_INIT:         xNeedPoll = xMBPortEventPost( EV_READY );         break;          /* A frame was received and t35 expired. Notify the listener that          * a new frame was received. */     case STATE_RX_RCV:         xNeedPoll = xMBPortEventPost( EV_FRAME_RECEIVED );         break;          /* An error occured while receiving the frame. */     case STATE_RX_ERROR:         break;          /* Function called in an illegal state. */     default:         assert( ( eRcvState == STATE_RX_INIT ) ||                 ( eRcvState == STATE_RX_RCV ) || ( eRcvState == STATE_RX_ERROR ) );     }      vMBPortTimersDisable(  );     eRcvState = STATE_RX_IDLE;      return xNeedPoll; } 

协议栈使能后会将接收状态机置为初始化态STATE_RX_INIT。
接收状态机为空闲态时STATE_RX_IDLE才开始计数。

当接收状态机 为STATE_RX_INIT,进入定时器溢出中断,会发布就绪事件EV_READY 。

当接收状态机 为STATE_RX_RCV,进入定时器溢出中断,会发布已接收事件EV_FRAME_RECEIVED 。说明一帧已经接收完毕。

并且在定时器溢出中断的最后,会把接收状态机置为STATE_RX_IDLE。

接收状态机为空闲态时,接收到一个字符,会进入串口接收中断,串口接收中断中会将接收到的字符保存作为帧首,并且把接收状态机变为STATE_RX_RCV。 也就是接收状态机为接收态,每接收到一个字符,会进入中断,然后把定时器清0。直到距离下个字符超过定时器溢出时间,进入定时器中断,此时接受状态机为STATE_RX_RCV,这就意味着接受完成了一帧。然后发布事件EV_FRAME_RECEIVED

定时器中断里为什么会有一个STATE_RX_INIT的状态判断呢?
在这里插入图片描述
因为协议栈使能后会将接收状态机置为初始化态STATE_RX_INIT。

但是万一这个时候串口接收寄存器已经有数据了咋办,那会进入串口接收中断函数,会调用xMBRTUReceiveFSM,当接收状态机为STATE_RX_INIT时,会清空定时器重新计数。

接收状态机为空闲态时STATE_RX_IDLE才开始读取一帧数据。

所以如果STATE_RX_INIT时有数据了,也不会读的,因为无法判断这个数是不是一帧的第一个字符。

所以STATE_RX_INIT时在xMBRTUReceiveFSM里会清空定时器。

直到定时器溢出。

然后会将接收状态机置为空闲态STATE_RX_IDLE。

这个时候在有数据,就可以作为帧首了。

当接收状态机 为STATE_RX_RCV,进入定时器溢出中断,会发布已接收事件EV_FRAME_RECEIVED 。说明一帧已经接收完毕。

这个时候eMBPoll中接收到事件EV_FRAME_RECEIVED ,就可以处理这一帧数据了。

相关内容

热门资讯

随着!大菠萝辅助器(透视)辅助... 随着!大菠萝辅助器(透视)辅助安装(有挂猫腻)-哔哩哔哩1、大菠萝辅助器辅助器安装包、大菠萝辅助器辅...
此事引发网友热议!抓住捣蛋鸡开... 此事引发网友热议!抓住捣蛋鸡开挂!原来有挂辅助挂(新版有挂)-哔哩哔哩;1、金币登录送、破产送、升级...
透视免费!wepokerplu... 透视免费!wepokerplus透视脚本免费(透视)辅助辅助器(确实有挂)-哔哩哔哩wepokerp...
近年来!创思维激k透视挂!竟然... 近年来!创思维激k透视挂!竟然是有辅助软件(有挂辅助)-哔哩哔哩1、创思维激k透视挂破解器简单,创思...
透视安卓版!wepoker怎么... 透视安卓版!wepoker怎么设置盖牌(透视)辅助下载(有挂存在)-哔哩哔哩;1、透视安卓版!wep...
受玩家影响!哈糖大菠萝诀窍!一... 受玩家影响!哈糖大菠萝诀窍!一直真的有辅助修改器(有挂分享)-哔哩哔哩1、用户打开应用后不用登录就可...
透视攻略!epoker透视(透... 透视攻略!epoker透视(透视)辅助app(有挂细节)-哔哩哔哩一、epoker透视游戏安装教程牌...
出现新变化!中至赣州小程序怎么... 出现新变化!中至赣州小程序怎么开挂!原来真的有辅助挂(有挂实锤)-哔哩哔哩1、下载好中至赣州小程序怎...
透视系统!wepoker代打辅... 透视系统!wepoker代打辅助机器人(透视)辅助神器(果真有挂)-哔哩哔哩1、金币登录送、破产送、...
近日!微乐江苏小程序游戏破解下... 近日!微乐江苏小程序游戏破解下载!切实有挂辅助神器(有挂存在)-哔哩哔哩1、上手简单,内置详细流程视...