stm32移植MODBUS RTU协议中帧、字节、定时器的关系理解

1. MODBUS RTU协议

 

帧格式(报文格式)

stm32移植MODBUS RTU协议中帧、字节、定时器的关系理解

例如:读40005、40006两个寄存器,假设从机地址为1

主机发给从机的报文(帧数据):01 03 00 04 00 02 85 ca

 

帧与字节:

每个帧,都是以字节作为最小单元进行一次性发送。

每个字节(例如01,03等)在实际发送中,采用下面的格式发送。

 

stm32移植MODBUS RTU协议中帧、字节、定时器的关系理解stm32移植MODBUS RTU协议中帧、字节、定时器的关系理解

起始位位:低电平;

偶检验位:根据1-8中的1的个数,偶数则该位位1;

停止位位:高电平。

 

USART中字节的接收和发送:

在STM32的USART中,是按照字节发送的,每接收或发送一个字节,产生一次中断。

例如上面的命令:01 03 00 04 00 02 85 ca

接收的步骤:

1)先接收01,然后产生一个中断,进入中断服务程序。

(中断服务程序功能:将01放进缓存中,然后重新定时器赋0值,并开启)

2)开始接收下一个数据:03。

3)依次类推,接收完所有的字节,然后拼接在一起,形成一个完整的数据帧。

 

stm32移植MODBUS RTU协议中帧、字节、定时器的关系理解

 

 

如何区分1个完整的帧:

由于RT U没有起始和终止符,如何确定一帧的数据全部接收完了。

答:通过定时器。

stm32移植MODBUS RTU协议中帧、字节、定时器的关系理解

两个帧数据之间,如果超过3.5个字符(字节)定时器的接收或发送周期,则产生中断,告诉本次帧接收完成了。

 

字节、帧、定时器之间的配合:

由于USART的时钟和TIM4的时钟频率一致,因此保证他们的每个时钟周期是一样长。

stm32移植MODBUS RTU协议中帧、字节、定时器的关系理解

在USART每次接收完一个字节,产生中断函数,函数重新给3.5T的这个定时器赋初始值0并开启。

当最后一个字符(例如上例中的 ca)接收完后,对3.5T定时器进行最后一次赋0值。

3.5T定时器就一直计时,直到产生中断。此时,标志着一帧数据接收完成,开始了下一帧的数据。

 

备注:RTU模式中有一个1.5T的定时器,用来表示某个帧中的2个字节时间间隔超过了1.5T小于3.5T,则这个帧需要被丢弃。

           大部分实际开发过程中,并没有用到1.5T。

 

2. Modbus Ascii协议

帧(报文)格式:

stm32移植MODBUS RTU协议中帧、字节、定时器的关系理解

优点:由于有起始、终止符号,因此可以连续传递,不需要时间间隔。

缺点:比RTU多一倍的数据传输。不适合大数据量的传输。

 

例如,地址01的传输。

RTU协议,按照1个字节发送: 起始位(0) + 0000 0001 + 校验位(0) + 停止位(1)

 

ASCII协议,需要发送2次。 01为2个字符。

根据ascii码对应,分别为00000000  00000001.  

起始位(0) + 0000 0000 + 校验位(0) + 停止位(1)

起始位(0) + 0000 0001 + 校验位(0) + 停止位(1)