ModbusRTU中的T3.5和T1.5的处理
本文是对上一篇文章的补充,写一写上篇文章中T3.5和T1.5的处理过程
1.首先讲一讲3.5个字符和1.5个字符的时间计算
在RTU模式,报文由时长至少3.5个字符时间的空间间隔区分。如下图:
两个帧数据之间,如果超过3.5个字符(字节)定时器的接收或发送周期,则产生中断,告诉本次帧接收完成了。两个帧数据之间,如果超过3.5个字符(字节)定时器的接收或发送周期,则产生中断,告诉本次帧接收完成了。
两个帧数据之间,如果超过3.5个字符(字节)定时器的接收或发送周期,则产生中断,告诉本次帧接收完成了。
modbus帧内间隔
整个报文帧必须以连续的字符流发送,如果两个字符之间的空闲大于1.5个字符时间,则报文帧认为不完整,应该被接收点丢弃。
注意:RTU接收驱动程序的实现,由于T1.5和T3.5的定时,隐含着大量对中断的管理。在高通信速率下,这导致CPU负担家中,因此,在<=19200bps时,这两个定时必须严格遵守;对于>19200bps的情形,应该使用2个定时的固定值,建议字符间的超时时间t1.5为750us;帧间超时时间为1.75ms。
3.5字符的时间间隔采用以下方式计算:
1个字符包括1位起始位、8位数据位(一般情况)、1位校验位(或者没有)、1位停止位(一般情况下)
这样说起来一般情况下1个字符就包括11位
那么3.5个字符就是3.5 x 11=38.5位 ;
波特率含义是每秒传输的二进制位的个数
我设置的波特率是9600bps,意思就是说每1秒(也就是1000毫秒)传输9600个位,
反过来说传输9600个二进制位需要1000毫秒
那么传输38.5个二进制位需要的时间就是:
38.5/9.6=4.0104167毫秒
MODBUS RTU要求一帧数据起始和结束至少有大于等于3.5个字符的时间
在波特率为9600的情况下,只要大于4.0104167毫秒即可!
1.5个字符时间间隔就是(1.5x11)/9.6=1.71875ms
而在上篇文章中已经设定了定时器溢出时间为 Tout=((9+1)*(7199+1))/72000000=1ms
2.0 FreeRTOSModbusRTU中关于数据的接收的处理过程
USART中字节的接收和发送:
在STM32的USART中,是按照字节发送的,每接收或发送一个字节&#