FreeModbus版本:1.6
接收状态机xMBRTUReceiveFSM
在协议栈初始化时,会发现有两个接收函数
peMBFrameReceiveCur = eMBRTUReceive;
pxMBFrameCBByteReceived = xMBRTUReceiveFSM;
那么这两个接收函数哪个是状态机?它俩有什么区别呢?
xMBRTUReceiveFSM这个是接收状态机函数。
FSM是finite-state machine的缩写,即有限状态机。
看一下这个函数在哪里调用
pxMBFrameCBByteReceived = xMBRTUReceiveFSM;
在portserial.c文件中,会发现pxMBFrameCBByteReceived 被prvvUARTRxISR调用。
prvvUARTRxISR这个函数是串口接收中断时调用的。
串口接收中断由用户实现,比如这样
所以接收状态机的调用顺序是这样的
接收到字节 →
中断服务函数 →
prvvUARTRxISR →
pxMBFrameCBByteReceived →
xMBRTUReceiveFSM
先看一下接收状态机都有什么状态
typedef enum
{
STATE_RX_INIT, /*!< Receiver is in initial state. */
STATE_RX_IDLE, /*!< Receiver is in idle state. */
STATE_RX_RCV, /*!< Frame is beeing received. */
STATE_RX_ERROR /*!< If the frame is invalid. */
} eMBRcvSta