stm32移植MODBUS RTU协议中帧、字节、定时器的关系理解
1. MODBUS RTU协议
帧格式(报文格式)
例如:读40005、40006两个寄存器,假设从机地址为1
主机发给从机的报文(帧数据):01 03 00 04 00 02 85 ca
帧与字节:
每个帧,都是以字节作为最小单元进行一次性发送。
每个字节(例如01,03等)在实际发送中,采用下面的格式发送。
起始位位:低电平;
偶检验位:根据1-8中的1的个数,偶数则该位位1;
停止位位:高电平。
USART中字节的接收和发送:
在STM32的USART中,是按照字节发送的,每接收或发送一个字节,产生一次中断。
例如上面的命令:01 03 00 04 00 02 85 ca
接收的步骤:
1)先接收01,然后产生一个中断,进入中断服务程序。
(中断服务程序功能:将01放进缓存中,然后重新定时器赋0值,并开启)
2)开始接收下一个数据:03。
3)依次类推,接收完所有的字节,然后拼接在一起,形成一个完整的数据帧。
如何区分1个完整的帧:
由于RT U没有起始和终止符,如何确定一帧的数据全部接收完了。
答:通过定时器。
两个帧数据之间,如果超过3.5个字符(字节)定时器的接收或发送周期,则产生中断,告诉本次帧接收完成了。
字节、帧、定时器之间的配合:
由于USART的时钟和TIM4的时钟频率一致,因此保证他们的每个时钟周期是一样长。
在USART每次接收完一个字节,产生中断函数,函数重新给3.5T的这个定时器赋初始值0并开启。
当最后一个字符(例如上例中的 ca)接收完后,对3.5T定时器进行最后一次赋0值。
3.5T定时器就一直计时,直到产生中断。此时,标志着一帧数据接收完成,开始了下一帧的数据。
备注:RTU模式中有一个1.5T的定时器,用来表示某个帧中的2个字节时间间隔超过了1.5T小于3.5T,则这个帧需要被丢弃。
大部分实际开发过程中,并没有用到1.5T。
2. Modbus Ascii协议
帧(报文)格式:
优点:由于有起始、终止符号,因此可以连续传递,不需要时间间隔。
缺点:比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)