先看一下初始化函数,参数包括传输模式、从机地址、端口号、波特率和奇偶校验。从函数大概能够猜到,初始化内容:选择传输模式,设置从机地址,配置串口。
/* 初始化Modbus协议栈 */
eMBErrorCode eMBInit(eMBMode eMode, UCHAR ucSlaveAddress, UCHAR ucPort, ULONG ulBaudRate, eMBParity eParity);
先了解一下modbus的地址规则
所以,从机地址必须在1~247之间
在485总线上使用Modbus协议,有两种主要方式:RTU ASCII。在使用过程中,只能选择其中一种传输模式。
Modbus RTU初始化,大概内容包括:串口初始化、超时定时器初始化
/* modbus rtu初始化 */
eMBErrorCode eMBRTUInit(UCHAR ucSlaveAddress, UCHAR ucPort, ULONG ulBaudRate, eMBParity eParity)
{
eMBErrorCode eStatus = MB_ENOERR;
ULONG usTimerT35_50us;
(void)ucSlaveAddress;
ENTER_CRITICAL_SECTION();
/* 串口初始化,失败 */
if(xMBPortSerialInit(ucPort, ulBaudRate, 8, eParity) != TRUE)
{
/* 端口层错误 */
eStatus = MB_EPORTERR;
}
/* 初始化成功 */
else
{
/* 波特率大于19200 */
if(ulBaudRate > 19200)
{
/* 超时时间为35*50=1050us */
usTimerT35_50us = 35;
}
/* 波特率小于等于19200 */
else
{
/* 3.5帧为超时时间 */
usTimerT35_50us = (7UL * 220000UL) / (2UL * ulBaudRate);
}
/* 超时定时器初始化 */
if(xMBPortTimersInit((USHORT)usTimerT35_50us) != TRUE)
{
/* 端口层错误 */
eStatus = MB_EPORTERR;
}
}
EXIT_CRITICAL_SECTION();
return eStatus;
}
特别要注意的是,串口数据位固定为8位,超时时间固定为3.5帧。这两个参数是modbus规定死的。
Modbus ASCII初始化,大概内容包括:串口初始化、超时定时器初始化
/* modbus ascii初始化 */
eMBErrorCode eMBASCIIInit(UCHAR ucSlaveAddress, UCHAR ucPort, ULONG ulBaudRate, eMBParity eParity)
{
eMBErrorCode eStatus = MB_ENOERR;
(void)ucSlaveAddress;
ENTER_CRITICAL_SECTION();
ucMBLFCharacter = MB_ASCII_DEFAULT_LF;
/* 串口初始化,失败 */
if(xMBPortSerialInit(ucPort, ulBaudRate, 7, eParity) != TRUE)
{
/* 端口层错误 */
eStatus = MB_EPORTERR;
}
/* 超时定时器初始化,超时时间1秒 */
else if(xMBPortTimersInit(MB_ASCII_TIMEOUT_SEC * 20000UL) != TRUE)
{
/* 端口层错误 */
eStatus = MB_EPORTERR;
}
EXIT_CRITICAL_SECTION();
return eStatus;
}
特别要注意的是,串口数据位固定为7位,超时时间固定为1秒。这两个参数是modbus规定死的。