4、UART与RS-485通信:异步通信原理、Modbus协议实现、长距离传输问题
各位同学,今天我们来聊聊嵌入式系统里最经典、也最“皮实”的一对通信组合——UART和RS-485。说实话,我入行那会儿,第一个独立调试的硬件就是UART。当时焊好板子,用示波器一看波形,心里那个激动啊。后来做工业项目,RS-485更是天天打交道。这两个东西,你搞懂了,基本上就拿到了工业通信的入场券。
4.1 异步通信原理:没有时钟,怎么对得上话?
UART的全称是Universal Asynchronous Receiver/Transmitter,通用异步收发器。核心就在“异步”两个字上。什么意思呢?就是发送方和接收方没有单独的时钟线,各自靠自己的内部时钟来采样数据。
你想想看,没有时钟线,两边怎么对齐?
答案是:约定好相同的波特率。波特率就是每秒传输的符号数,单位是bps。比如9600bps,意味着每秒钟传9600个比特。发送方按这个速率把数据一位一位发出去,接收方也按这个速率去采样。
我个人的习惯是,调试UART时第一件事就是确认波特率。有一次项目死活收不到数据,折腾了半天,最后发现是波特率设成了9600,但代码里写的是19200。这种低级错误,我犯过一次就再也没忘过。
4.2 UART数据帧格式
一个标准的UART数据帧长这样:
起始位(1bit) + 数据位(5~8bit) + 校验位(可选) + 停止位(1~2bit)
举个例子,8N1格式:1个起始位 + 8个数据位 + 无校验 + 1个停止位。这是最常用的配置。
起始位是低电平,告诉接收方“我要开始发了”。停止位是高电平,表示“这一帧结束了”。数据位可以是5到8位,但绝大多数场景下我们用8位,因为一个字节正好8位。
校验位分奇校验和偶校验。说白了就是让数据中1的个数凑成奇数或偶数。不过说实话,现在很多场景下校验位已经用得少了,大家更倾向于用更高级的协议层校验,比如CRC。
4.3 RS-485:让UART跑得更远、更稳
UART本身是点对点的,而且距离一长就容易出问题。RS-485就是来解决这个问题的。它本质上是一个物理层标准,把UART的单端信号转换成差分信号。
差分信号是什么意思?就是两根线,A和B,用它们之间的电压差来表示逻辑0和逻辑1。A比B高,算逻辑1;B比A高,算逻辑0。这种方式的抗干扰能力比单端信号强太多了。
我记得在工厂里做项目,现场电机一启动,单端信号直接乱跳。换成RS-485之后,稳得像泰山。这就是差分信号的好处。
4.4 长距离传输问题:为什么超过1200米就不行了?
RS-485标准说,最远能传1200米。但这不是绝对的。实际能传多远,取决于三个因素:
- 波特率: 速率越高,距离越短。9600bps能跑1200米,115200bps可能只能跑几百米。
- 线缆质量: 双绞线、屏蔽线,效果差很多。
- 终端电阻: 这个很多人会忽略。没有终端电阻,信号反射会导致数据错乱。
我曾经在一个项目里,现场布线超过了1500米,波特率还设成了38400。结果数据丢包率高达30%。后来把波特率降到9600,加上了120欧姆的终端电阻,问题就解决了。
4.5 Modbus协议实现:工业界的“普通话”
Modbus是建立在RS-485之上的应用层协议。说白了,就是规定好了“谁先说话、说什么、怎么应答”。
Modbus RTU是最常用的模式。它的帧格式如下:
地址码(1字节) + 功能码(1字节) + 数据区(N字节) + CRC校验(2字节)
举个例子,读取从机地址0x01的保持寄存器,起始地址0x0000,读取2个寄存器:
主机发送: 01 03 00 00 00 02 C4 0B
从机应答: 01 03 04 00 0A 00 14 (假设数据是10和20)
这里功能码0x03就是“读取保持寄存器”。数据区里,00 00是起始地址,00 02是数量。最后两个字节是CRC校验。
我个人建议,写Modbus代码时,CRC校验一定要自己实现一遍,不要光用现成的库。为什么?因为很多坑就出在CRC上。比如字节序搞反了,或者多项式用错了。我见过一个项目,CRC算出来总是差一个字节,最后发现是高低位顺序反了。
4.6 避坑指南:我踩过的那些坑
- 波特率误差: 晶振不准,或者分频系数算错,导致实际波特率和理论值有偏差。误差超过2%就容易丢数据。
- 共模电压问题: RS-485虽然抗干扰,但共模电压不能超过-7V到+12V的范围。接地没做好,共模电压漂移,芯片就烧了。
- 总线冲突: 多个从机同时发送数据,总线就打架了。Modbus是主从模式,只有主机能发起通信,从机只能应答。这个设计就是为了避免冲突。
- 隔离: 工业现场,我强烈建议用隔离型RS-485芯片,比如ADM2483。不隔离的话,一次雷击或者浪涌,整个板子就报废了。
4.7 知识体系图
下面这张图,是我自己总结的UART与RS-485通信的知识结构。你可以把它当作一个快速索引。
嗯,这张图把UART、RS-485、Modbus三者的关系梳理得很清楚。你从上往下看,先理解UART怎么传数据,再看RS-485怎么让数据传得更远,最后看Modbus怎么组织这些数据。一层一层,逻辑很顺。
好了,这一章的内容就到这里。记住,通信协议这东西,光看书是不够的。拿块开发板,接上示波器,自己发几帧数据看看波形,比什么都管用。