做工业自动化快十年了,见过最多的入门级坑就是串口。刚入行的时候,我被这几个名词折磨了整整一个月。一会儿UART,一会儿USART,一会儿RS232,一会儿RS485,资料看了一大堆,还是分不清谁是谁。接个传感器,线接了拆拆了接,调试了三天通信就是不通,最后发现是把RS232和RS485搞混了,差点被师傅骂死。
后来做的项目多了才发现,90%的人都搞不清这几个东西的区别。甚至很多工作三五年的工程师,也只会照着接线图插线,出了问题根本不知道怎么排查。今天我就把这些东西彻底讲透,从底层原理到实际应用,再到那些年我踩过的所有坑,全给你说明白。
别觉得串口简单,工业现场80%的通信问题都是串口问题。把串口搞懂了,你就能解决工业自动化一半的通信故障。
先搞懂最基础的:什么是串口通信?
在讲各种名词之前,先搞明白最根本的问题:什么是串口通信?
串口通信,说白了就是一位一位地按顺序传输数据。和它对应的是并口通信,就是一次传8位、16位甚至更多位。
很多人会问,现在都2026年了,USB、以太网、Profinet满天飞,为什么串口还没死?而且在工业界反而越来越吃香?
答案很简单:简单、稳定、便宜、易实现。
- 简单:不需要复杂的协议栈,两个设备只要三根线就能通信
- 稳定:对硬件要求低,抗干扰能力强,适合恶劣的工业环境
- 便宜:一个串口芯片几毛钱,一个RS485模块几块钱
- 易实现:几乎所有的单片机、PLC、传感器都自带串口,不需要额外的硬件
你去任何一个工厂,随便拆开一个设备,里面肯定有串口。小到温度传感器,大到变频器、机器人,没有不支持串口的。
UART vs USART:99%的人都搞混了
先解决第一个误区:UART和USART不是协议,是芯片内部的硬件外设。
很多人说"用UART协议通信",这句话是错的。UART根本不是协议,它是一个硬件模块,全称是通用异步收发传输器(Universal Asynchronous Receiver/Transmitter)。
它的作用只有一个:把芯片内部的并行数据转换成串行数据发出去,再把收到的串行数据转换成并行数据给芯片。
那USART又是什么?USART全称是通用同步异步收发传输器(Universal Synchronous/Asynchronous Receiver/Transmitter)。
看到区别了吗?多了一个"同步"。
也就是说,USART比UART多了一个同步通信模式。同步通信需要额外的时钟线来同步数据,收发双方用同一个时钟,传输速度更快。
但是!重点来了:在工业界,99.9%的情况下,我们都只用异步模式。同步模式几乎没人用。
所以你会发现,现在几乎所有的单片机,比如STM32,上面的串口外设都叫USART,但大家都习惯叫它UART。因为没人用它的同步功能,都是当UART来用的。
这就是为什么很多人会把UART和USART混为一谈的原因。本质上,在实际应用中,你可以认为它们是同一个东西。
记住这个结论:UART是异步的,USART是同步+异步的,工业上只用异步,所以USART=UART。
RS232 vs RS485:这才是最核心的区别
这是最容易搞混的两个东西,也是工业现场用得最多的。
先纠正第二个最大的误区:RS232和RS485不是协议,也不是硬件外设,它们是物理层电气标准。
很多人说"RS232协议",这句话也是错的。它们只是规定了电信号的传输方式,和协议没有任何关系。
UART是芯片内部的东西,输出的是TTL电平(3.3V或者5V)。这种电平传输距离非常短,最多也就几米,而且抗干扰能力很差,根本不能用在工业现场。
所以我们需要把TTL电平转换成更适合长距离传输的电平标准,这就是RS232和RS485的作用。
看到没?UART是内核,RS232和RS485只是不同的外壳。你用UART输出的TTL电平,经过MAX232芯片就变成了RS232电平,经过MAX485芯片就变成了RS485电平。
这就是它们最本质的关系。很多人搞不清,就是因为不知道中间还有个电平转换芯片。
接下来我从各个维度对比一下RS232和RS485,让你一眼就能看明白。
| 对比项 | RS232 | RS485 |
|---|---|---|
| 电气特性 | 单端信号,正负电平表示0和1 逻辑1:-3V ~ -15V 逻辑0:+3V ~ +15V | 差分信号,AB线电压差表示0和1 逻辑1:A-B > +200mV 逻辑0:A-B < -200mV |
| 传输距离 | 最大15米(9600波特率) | 最大1200米(9600波特率) |
| 传输速率 | 最高115200bps,常用9600/19200 | 最高10Mbps,常用9600/19200/38400 |
| 节点数 | 点对点,只能接1个主设备和1个从设备 | 总线型,最多可接32/128/256个节点 |
| 接线方式 | 至少3根线:TX、RX、GND 需要交叉线连接 | 最少2根线:A、B 建议3根线:A、B、GND 不需要交叉线 |
| 抗干扰能力 | 差,单端信号容易受干扰 | 强,差分信号可以抵消共模干扰 |
| 通信方式 | 全双工,同时收发 | 半双工,同一时间只能发或收 |
| 适用场景 | 短距离、点对点、简单设备 比如电脑和单片机通信 | 长距离、多节点、工业现场 比如传感器网络、变频器通信 |
这个表格一定要保存好,以后再分不清的时候拿出来看一眼。
串口通信的完整流程:数据是怎么跑起来的
很多人只会照着接线图接线,根本不知道数据是怎么从一个设备传到另一个设备的。今天我就把这个过程拆解开,让你彻底搞懂。
串口异步通信的数据是一帧一帧传输的,每帧数据的格式如下:
- 起始位:总是低电平,告诉接收方"我要开始发数据了"
- 数据位:真正要传输的数据,通常是8位,也就是一个字节
- 校验位:可选,用来检查数据传输是否出错,常用奇校验、偶校验或者无校验
- 停止位:总是高电平,告诉接收方"这帧数据发完了"
举个例子,我们最常用的串口参数:9600波特率,8位数据位,无校验,1位停止位。
意思就是:每秒传输9600位数据,每帧数据有1个起始位+8个数据位+0个校验位+1个停止位=10位。所以每秒最多能传输960字节的数据。
这里有个非常重要的点:收发双方的串口参数必须完全一致。只要有一个参数不一样,通信就绝对不通。
这是工业现场最常见的问题。很多人调试了半天,最后发现只是波特率设错了,或者停止位设成了2位。
工业现场最常用的串口协议:Modbus RTU
前面说了,RS232和RS485只是物理层标准,它们只负责把数据传过去,不管数据是什么意思。
所以我们需要在上面加一个应用层协议,规定数据的格式和含义。工业现场用得最多的就是Modbus RTU协议。
可以说,Modbus RTU是工业界的通用语言。几乎所有的PLC、变频器、传感器、仪表都支持Modbus RTU协议。
Modbus RTU的帧格式非常简单:
| 地址码 | 功能码 | 数据区 | CRC校验 |
|---|---|---|---|
| 1字节 | 1字节 | N字节 | 2字节 |
- 地址码:从设备的地址,范围1-247,用来区分总线上的不同从设备
- 功能码:告诉从设备要做什么操作,比如读数据、写数据
- 数据区:具体的数据内容,比如要读的寄存器地址和数量
- CRC校验:用来检查数据传输是否出错
最常用的功能码只有两个:
- 03:读保持寄存器
- 06:写单个保持寄存器
比如主设备要读地址为1的从设备的100号寄存器,发出去的帧就是:01 03 00 64 00 01 D5 CA
从设备返回的帧就是:01 03 02 00 0A 79 84,表示寄存器100的值是10。
就这么简单。Modbus RTU之所以这么流行,就是因为它足够简单,容易实现,而且开放免费。
那些年我踩过的串口坑
最后分享一些我踩过的串口坑,这些都是花钱买不来的经验。
RS232交叉线问题。RS232是全双工,TX发RX收,所以两个设备连接的时候,必须TX接RX,RX接TX,GND接GND。很多人直接直连,结果怎么都通信不上。记住:公头对母头直连,公头对公头或者母头对母头必须交叉。
RS485终端电阻问题。RS485总线长度超过100米的时候,一定要在总线的两端各加一个120Ω的终端电阻。否则会有信号反射,导致通信时好时坏,距离越远问题越严重。我曾经因为这个问题,在客户现场调试了整整两天。
RS485一定要接GND。很多人以为RS485只要接A和B两根线就行,这是大错特错。如果不接GND,两个设备的地电位不同,会产生很高的共模电压,轻则通信不稳定,重则直接烧MAX485芯片。工业现场一定要接GND,血的教训。
波特率不要太高。很多人喜欢用115200波特率,觉得速度快。但是在工业现场,波特率越高,传输距离越短,抗干扰能力越差。除非特殊情况,否则用9600或者19200就足够了,稳定最重要。
发送数据不要太快。很多人写代码,发完一帧数据马上发下一帧,结果导致数据丢失。因为串口是低速设备,接收方需要时间处理数据。一定要加适当的延时,一般10-20ms就够了。
接地问题。工业现场的接地非常重要。如果接地不好,会产生很大的干扰,导致串口通信乱码,甚至烧设备。一定要把所有设备的地都接在一起,并且可靠接地。
总结
最后用一句话总结一下这几个东西的关系:
UART是芯片内部的硬件外设,负责并行和串行数据的转换;RS232和RS485是物理层电气标准,负责把TTL电平转换成适合长距离传输的电平;Modbus RTU是应用层协议,规定了数据的格式和含义。
串口通信看起来简单,其实细节非常多。很多人觉得串口没什么技术含量,但是真正能把串口玩明白的人,在工业界绝对是香饽饽。