FreeModbus串行传输初始化

先看一下初始化函数,参数包括传输模式、从机地址、端口号、波特率和奇偶校验。从函数大概能够猜到,初始化内容:选择传输模式,设置从机地址,配置串口。

/* 初始化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规定死的。

发布了208 篇原创文章 · 获赞 90 · 访问量 25万+

猜你喜欢

转载自blog.csdn.net/lushoumin/article/details/89081832