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 }
View Code

相关文章:

  • 2021-09-20
  • 2021-05-28
  • 2021-11-07
  • 2021-12-17
  • 2021-11-16
  • 2022-02-26
  • 2021-12-12
  • 2021-07-06
猜你喜欢
  • 2021-11-21
  • 2021-07-23
  • 2021-05-27
  • 2021-11-18
  • 2022-01-12
相关资源
相似解决方案