0 工具准备
Modbus协议规范(中文)
1 基于RS-485的Modbus协议的数据链路层实现
基于RS-485的Modbus协议的数据链路层实际上就是UART(通用异步收发器),只不过是将UART的数据变为RS-485总线的半双工、差分方式传输。
1.1 UART(通用异步收发器)概述
UART接口不使用时钟信号来同步发送器和接收器,而是以异步方式传输数据。发送器根据其时钟信号生成的位流取代了时钟信号,接收器内部使用其内部时钟信号对输入数据进行采样。
同步点是通过2个设备的相同波特率来管理的。如果波特率不同,发送和接收数据的时序可能会受影响,导致数据处理过程出现不一致。允许的波特率偏差最大值为10%,超过该值,位的时序就会错乱。
1.2 UART(通用异步收发器)帧格式
典型的UART帧由起始位、数组段、校验位、停止位组成,示意图如下:
注:
(1)当发送方UART帧某位为逻辑“1”时,RS-485总线也为逻辑“1”状态,RS-485总线信号A-B=+2~+6V。
(2)当发送方UART帧某位为逻辑“0”时,RS-485总线也为逻辑“0”状态,RS-485总线信号A-B=-2~-6V。
1.2.1 波特率
UART是异步通信,没有时钟线同步发送和接收方,因此需要在收发数据前需要约定好波特率,确定每个码元的长度,以进行数据解析。
一般来说,UART设置的波特率(单位:bps)如下:
1200、2400、9600、14400、19200、38400、56000、57600、115200、128000、230400、256000、460800、
500000、512000、600000、750000、921600、1000000、1500000、2000000
作为调试用途的串口波特率使用最多的是115200bps,在RS-485从机中最常见的是9600bps。
1.2.2 空闲状态
当UART处于空闲状态,也就是不发送数据时,UART的TX信号保持逻辑“1”状态,RS-485也处于逻辑“1”状态。
1.2.3 起始位
开始传输数据时,UART会将TX从高电平拉到低电平并保持一个时钟周期。当接收UART检测到信号从高到低跳变时,便开始以波特率对应的频率读取数据帧中的位。
1.2.4 数据段
数据段包含我们需要传输的数据。如果使用奇偶校验位,数据段的长度可以是5-8位。如果不使用奇偶校验位,数据段长度可以是5-9位。传输数据时低位在前高位在后(LSB)。
1.2.5 校验位(可选)
校验位是一个可选参数,通过奇偶校验位,接收UART可以判断传输期间是否有数据发生改变。电磁辐射、不一致的波特率或长距离数据传输都可能改变数据位。
校验位可选参数如下:
(1)无校验
无校验情况下,UART帧中不包含校验位,数据段最长可以设置为9位。
(2)奇校验
设置为奇校验时,校验位和数据段中逻辑“1”的数量总是为奇数。例如,数据段中逻辑“1”个数为3,则校验位会自动设置为逻辑“0”以保证校验位和数据段中逻辑“1”的数量总是为奇数。
(3)偶校验
设置为偶校验时,校验位和数据段中逻辑“1”的数量总是为偶数。例如,数据段中逻辑“1”个数为3,则校验位会自动设置为逻辑“1”以保证校验位和数据段中逻辑“1”的数量总是为偶数。
(4)0校验
校验位总是设置为逻辑“0”。
(5)1校验
校验位总是设置为逻辑“1”。
1.2.6 停止位
停止位用来表示UART帧的结束,数据传输线会从逻辑“0”切换到逻辑“1”并保持1-2位时间。
停止位可选长度一般为1、1.5、2位。