FreeModbus协议栈作为从机,等待主机传送的数据,当从机接收到一帧完整的报文后,对报文进行解析,然后响应主机,发送报文给主机,实现主机和从机之间的通信。
1、初始化协议栈---eMBInit函数(mb.c中),以RTU为例
1 eMBErrorCode eMBInit( eMBMode eMode, UCHAR ucSlaveAddress, UCHAR ucPort, ULONG ulBaudRate, eMBParity eParity ) 2 { 3 4 ?1/*函数功能:*1:实现RTU模式和ASCALL模式的协议栈初始化;*2:完成协议栈核心函数指针的赋值,包括Modbus协议栈的使能和禁止、报文的接收和响应、3.5T定时器中断回调函数、串口发送和接收中断回调函数;*3:eMBRTUInit完成RTU模式下串口和3.5T定时器的初始化,需用户自己移植;*4:设置Modbus协议栈的模式eMBCurrentMode为MB_RTU,设置Modbus协议栈状态eMBState为STATE_DISABLED;*/ eMBErrorCode eStatus = MB_ENOERR; 5 /* check preconditions */ 6 if( ( ucSlaveAddress == MB_ADDRESS_BROADCAST ) || 7 ( ucSlaveAddress < MB_ADDRESS_MIN ) || ( ucSlaveAddress > MB_ADDRESS_MAX ) ) //验证从机地址 8 { 9 eStatus = MB_EINVAL; //地址错误 10 } 11 else 12 { 13 ucMBAddress = ucSlaveAddress; 14 15 switch ( eMode ) 16 { 17 #if MB_RTU_ENABLED > 0 18 case MB_RTU: 19 pvMBFrameStartCur = eMBRTUStart; 20 pvMBFrameStopCur = eMBRTUStop; 21 peMBFrameSendCur = eMBRTUSend; 22 peMBFrameReceiveCur = eMBRTUReceive; 23 pvMBFrameCloseCur = MB_PORT_HAS_CLOSE ? vMBPortClose : NULL; 24 pxMBFrameCBByteReceived = xMBRTUReceiveFSM; //接收状态机,串口接受中断最终调用此函数接收数据 25 pxMBFrameCBTransmitterEmpty = xMBRTUTransmitFSM; //发送状态机,串口发送中断最终调用此函数发送数据 26 pxMBPortCBTimerExpired = xMBRTUTimerT35Expired; //报文到达间隔检查,定时器中断函数最终调用次函数完成定时器中断 27 28 eStatus = eMBRTUInit( ucMBAddress, ucPort, ulBaudRate, eParity ); 29 break; 30 #endif 31 #if MB_ASCII_ENABLED > 0 32 case MB_ASCII: 33 pvMBFrameStartCur = eMBASCIIStart; 34 pvMBFrameStopCur = eMBASCIIStop; 35 peMBFrameSendCur = eMBASCIISend; 36 peMBFrameReceiveCur = eMBASCIIReceive; 37 pvMBFrameCloseCur = MB_PORT_HAS_CLOSE ? vMBPortClose : NULL; 38 pxMBFrameCBByteReceived = xMBASCIIReceiveFSM; 39 pxMBFrameCBTransmitterEmpty = xMBASCIITransmitFSM; 40 pxMBPortCBTimerExpired = xMBASCIITimerT1SExpired; 41 42 eStatus = eMBASCIIInit( ucMBAddress, ucPort, ulBaudRate, eParity ); 43 break; 44 #endif 45 default: 46 eStatus = MB_EINVAL; 47 } 48 49 if( eStatus == MB_ENOERR ) 50 { 51 if( !xMBPortEventInit( ) ) 52 { 53 /* port dependent event module initalization failed. */ 54 eStatus = MB_EPORTERR; 55 } 56 else 57 {//设定当前状态 58 eMBCurrentMode = eMode; //设定RTU模式 59 eMBState = STATE_DISABLED; //modbus协议栈初始化状态,在此初始化为禁止 60 } 61 } 62 } 63 return eStatus; 64 }