FreeModbus:移植
FreeModBus是一款免费开源的modbus协议栈,支持 ModBus RTU/ASCII、Modbus TCP从机。
一下简要分析FreeModbus的移植方法。以FreeModBus-v1.6为例。
1.FreeModBus文件结构

modbus文件夹就是freemodbus的源代码,内容如下

ascii:modbus ASCII 协议相关源码,不适用 ASCII协议,移植的时候可以不包含;
rtu:modbus RTU协议相关源码,不适用RTU协议,移植的时候可以不包含;
tcp:modbus tcp协议相关源码,不适用tcp协议,移植的时候可以不包含;
function文件夹内容如下:

mbfunccoils.c:线圈读写源码
mbfuncdisc.c:读离散寄存器源码
mbfuncholding.c:读写保持寄存器源码
mbfuncinput.c:读写输入寄存器源码
mbutils.c:连续位的操作函数
mbfuncother.c:其他源码,例如设置从机地址、报告地址等。
include文件夹是相应的头文件。

demo文件夹下是不同平台下的移植文件,具体要求包含以下几个文件夹:

2. 移植接口
port.h 文件夹:重点实现以下两个临界区管理函数,使用RTOS的情况下,可以直接采用系统的函数。
#define ENTER_CRITICAL_SECTION( ) EnterCriticalSection( )
#define EXIT_CRITICAL_SECTION( ) ExitCriticalSection( )
portevent.c文件夹:实现事件发送和接收的函数,使用RTOS的情况下,可以直接采用系统的事件管理函数。
BOOL xMBPortEventInit( void )
BOOL xMBPortEventPost( eMBEventType eEvent )
BOOL xMBPortEventGet( eMBEventType * eEvent )
porttimer.c文件夹:实现定时器的初始化、打开、关闭,以及中断处理函数,并在中断处理函数中调用 ( void )pxMBPortCBTimerExpired( );该函数主要是对接收的一帧数据进行处理。
注:modbus帧结束的方法是2.5个字节事件内没有接收到任何数据,并触发定时器超时中断。
BOOL xMBPortTimersInit( USHORT usTim1Timerout50us )
void vMBPortTimersEnable( )
void vMBPortTimersDisable( )
portserial.c文件夹:完成串口初始化函数、串口收发中断使能(协议栈开启发送缓冲区空中断后,软件会自动进入中断函数进行数据发送)、串口接收字节函数、串口发送字节函数、串口发送缓冲区空中断(中断中调用pxMBFrameCBTransmitterEmpty( );函数,协议栈会在中断中发送一个新的字节)、串口接收中断(中断中调用pxMBFrameCBByteReceived( );函数,协议栈会在中断中接收一个char数据)
void vMBPortSerialEnable( BOOL xRxEnable, BOOL xTxEnable )
BOOL xMBPortSerialInit( UCHAR ucPORT, ULONG ulBaudRate, UCHAR ucDataBits, eMBParity eParity )
BOOL xMBPortSerialPutByte( CHAR ucByte )
BOOL xMBPortSerialGetByte( CHAR * pucByte )
浙公网安备 33010602011771号