示波器调试RS485通信波形图

时间:2024-04-06 11:18:51

由于笔者在调试STM32移植的MODBUS协议的时候遇到了一些问题,需要借助示波器来看波形,而关于485通信波形相关的资料网上不多,所以把自己调试过程中的波形记录下来。
硬件:STM32单片机,1个主机和10个从机,移植MODBUS协议,采用轮询机制,主机挨个询问从机,从机采集一些信息回复给主机。
原理图:使用带隔离的芯片ADM2483,PA1,PA2,PA3指的是单片机的引脚,分别是使能,TXD和RXD。
示波器调试RS485通信波形图
代码:基本上是http://www.openedv.com/forum.php?mod=viewthread&tid=98367&highlight=modbus
根据自己的业务稍微做了简化和修改。
以下是主机询问以及从机回答的波形,两组。测试的是AB两线的电压差
示波器调试RS485通信波形图

以下是一组主机询问与从机回答的波形,中间间隔7ms左右。注意,MODBUS规定两组数据之间必须有3.5字符的间隔,我的单个字符时长大约1ms,所以这个间隔不得小于3.5ms。
示波器调试RS485通信波形图

以下是一个命令的波形,可以看出一个命令用时约为8ms多一点,而一个命令是8个字符,通常情况下1个字符包括1位起始位、8位数据位(一般情况)、1位校验位(或者没有,本例子没有校验位)、1位停止位(一般情况下)。也就是一个字符是10位,由此可以推算出波特率:10bit / 1.05ms X 1000 ≈ 9600 bit/s
示波器调试RS485通信波形图

以下两图是把波形进一步“放大”,尝试从波形里读出数据。约4格表示一个字符。
此图是上图前四格的第一个字符,也就是10位,起始位总是低电平,而结束位是高电平,8个数据位,低位在前。可以看出,第一格式起始位的低电平,接下来是连续3个高电平和5个低电平,最后一格是结束位的高电平。中间的数据位是1110 0000,由于低位在前,所以实际是0000 0111,也就是0x07
示波器调试RS485通信波形图
示波器调试RS485通信波形图

下图的黄色线是A线对地电压,蓝线是B线对地电压。为了方便观察,第一个图把两个波形完全分开了,第二个图的“地”在同一水平线上。而A减去B,也就是黄色减去蓝色,就可以得到465总线上的电压情况。可以看出,单个A或是B的波形都不是很理想,定时A-B的波形还不错。大概这就是485通信稳定的一个原因了吧。
示波器调试RS485通信波形图
示波器调试RS485通信波形图