FreeModbus--完全分析--系列1

来源:互联网 发布:陌陌八格切图软件 编辑:程序博客网 时间:2024/05/17 21:59

说明:freemodbus-v1.5.0

主流程

/* ----------------------- Start implementation -----------------------------*/intmain( void ){    eMBErrorCode    eStatus;    eStatus = eMBInit( MB_RTU, 0x0A, 0, 38400, MB_PAR_EVEN );    /* Enable the Modbus Protocol Stack. */    eStatus = eMBEnable(  );    for( ;; )    {        ( void )eMBPoll(  );        /* Here we simply count the number of poll cycles. */        usRegInputBuf[0]++;    }}

由上述主函数可知协议栈经eMBInit和eMBEnable初始化、使能后进入协议栈的循环eMBPoll中。

eMBInit分析

首先,使用eMBInit初始化协议栈,根据你使用的参数eMBMode eMode初始化相应的函数入口!
#if MB_RTU_ENABLED > 0        case MB_RTU:            pvMBFrameStartCur = eMBRTUStart;            pvMBFrameStopCur = eMBRTUStop;            peMBFrameSendCur = eMBRTUSend;            peMBFrameReceiveCur = eMBRTUReceive;            pvMBFrameCloseCur = MB_PORT_HAS_CLOSE ? vMBPortClose : NULL;            pxMBFrameCBByteReceived = xMBRTUReceiveFSM;            pxMBFrameCBTransmitterEmpty = xMBRTUTransmitFSM;            pxMBPortCBTimerExpired = xMBRTUTimerT35Expired;            eStatus = eMBRTUInit( ucMBAddress, ucPort, ulBaudRate, eParity );            break;#endif#if MB_ASCII_ENABLED > 0        case MB_ASCII:            pvMBFrameStartCur = eMBASCIIStart;            pvMBFrameStopCur = eMBASCIIStop;            peMBFrameSendCur = eMBASCIISend;            peMBFrameReceiveCur = eMBASCIIReceive;            pvMBFrameCloseCur = MB_PORT_HAS_CLOSE ? vMBPortClose : NULL;            pxMBFrameCBByteReceived = xMBASCIIReceiveFSM;            pxMBFrameCBTransmitterEmpty = xMBASCIITransmitFSM;            pxMBPortCBTimerExpired = xMBASCIITimerT1SExpired;            eStatus = eMBASCIIInit( ucMBAddress, ucPort, ulBaudRate, eParity );            break;#endif

以上代码中pvMBFrameStartCurpvMBFrameStopCur等即协议栈函数的接口,对于不同模式使用不同的函数进行赋值初始化!!此编写模式可以借鉴学习!!

其中eMBRTUInit函数对底层驱动(串口和定时器)进行了初始化。

在上述初始化完成并且成功后对事件功能也进了初始化,最后全局变量eMBState = STATE_DISABLED。

eMBEnable的分析

eMBErrorCodeeMBEnable( void ){    eMBErrorCode    eStatus = MB_ENOERR;    if( eMBState == STATE_DISABLED )    {        /* Activate the protocol stack. */        pvMBFrameStartCur(  );        eMBState = STATE_ENABLED;    }    else    {        eStatus = MB_EILLSTATE;    }    return eStatus;}

由第一节的分析,此时将启动协议栈pvMBFrameStartCur,查看程序该函数指针被分配到为eMBRTUStart。

该函数中将全局变量eRcvState = STATE_RX_INIT,并使能串口和定时器,注意此时的定时开始工作!!!

全局变量eMBState =STATE_ENABLED。