同样是串口,RS-232和RS-485区别在哪?物理层原理与选型指南
我调试设备时碰到过一个很典型的场景客户指着一台仪表后边的 DB9 接口问这不也是串口吗为什么不能直接拧到你们采集器那个 A/B 两个端子上我说不行一个是 RS-232一个是 RS-485。他接着问了句特别到位的话同样是串口为什么 RS-232 只能点对点RS-485 却能组网上千米这个问题看着基础其实把串口通信物理层的核心全带出来了。我见过不少干了三五年的电工、刚入门的嵌入式新手甚至一些做上位机的朋友都说不清楚 232 和 485 到底差在哪。有人觉得 485 是 232 的升级版有人觉得只是接线方式不同还有人把 TTL 电平直接叫 RS-232配线时翻车翻得莫名其妙。这篇文章我想把原理、电气参数、组网条件和选型经验一次性讲透。不堆概念重点讲明白“为什么”适合刚接触串口的初学者也适合正在做设备对接、现场调试、总线改造的工程师参考。1. 先把一个误区摆正RS-232 和 RS-485 不是两代产品1.1 它俩共用一套 UART 语言只换了一种物理传输方式先说一个经常被忽略的事实RS-232 和 RS-485 传输的数据帧格式也就是起始位、数据位、校验位、停止位、波特率这一整套时序逻辑其实完全一样。它们都基于 UART芯片里对数据的封装和解封装方式没有任何区别。那区别在哪在物理层——也就是“把 0 和 1 变成线上什么样的电压信号”这一步。打个比方你对着电话说一句中文对方听到的还是中文但语音信号在铜线里是模拟电信号在光纤里就变成了光脉冲。内容一样承载方式不同。UART 是语言RS-232 和 RS-485 是两种不同的传输介质方案。所以你在 MCU 的同一个 UART 外设上换一块电平转换芯片就能从 232 变成 485程序基本不用大改只改发送控制和参数就行。这个认知很重要。很多人以为换 485 就要换协议、换代码逻辑实际上协议栈确实可能要换但 UART 底层的收发机制是同一套东西。1.2 一个诞生于电话时代一个诞生于工业总线时代RS-232 是 1962 年定下来的标准最初用途是电脑和调制解调器之间的点对点连接。那个年代根本没有“多台电脑挂一条线通信”的需求一台机器配一个调制解调器拨号、传数据完事。所以 RS-232 从娘胎里就是一对一的模型连握手信号线都是按“一台主机连一台从机”设计的。RS-485 则晚了整整二十多年1983 年才出现。那时候工厂自动化已经起来了PLC、仪表、传感器都需要连成网络一条总线挂几十个设备是刚需。于是设计目标从一开始就是多点通信、长距离、抗干扰。二十年的时间差决定了这两个标准的设计哲学完全不同也决定了它们后续的各种参数取舍。所以别把 RS-485 当成 RS-232 的“高配版”。它不是升级而是另一种解决路径。232 解决“点对点可靠通信”485 解决“多点远距离可靠通信”。2. 单端与差分决定一切差异的那道分水岭2.1 RS-232 用“绝对电压”判断地线成了信号回路的一部分RS-232 是单端传输什么意思就是发送端输出一根信号线参考的是自己这一侧的地接收端把信号线电压和自己这一侧的地比较得出逻辑 0 或 1。具体来说RS-232 规定3V 到 15V 是逻辑 0-3V 到 -15V 是逻辑 1-3V 到 3V 是无效区。发送端一般输出 ±5V 到 ±12V接收端必须在 ±3V 的判据上认出信号来。单端方案最大的问题在于地线不只是参考点它本身就是信号传输回路的一部分。想象两台设备相距 50 米都接在同一个电源系统里。地线是有电阻的现场如果有电机、变频器、大功率开关在动作电流会在地线回路里产生压降。结果就是两台设备之间的“地”电位并不相等可能差个一两伏恶劣情况下差十几伏也不稀奇。一旦地电位偏了发送端输出 -8V 表示逻辑 1经过线缆衰减接收端这侧看到的是 -8V 地电位差比如变成了 -2V落进了 -3V 到 3V 的死区接收器就懵了。这还不算线缆上串进来的其他干扰。所以 RS-232 标准把传输距离定在 15 米左右不是没有道理的。短距离内地电位差可以忽略信号余量足够15 米以内怎么折腾都好说一旦拉远单端结构的天花板就卡在那了。2.2 RS-485 用“差值”判断参考点从地变成另一根线RS-485 是差分传输两根线 A 和 B发送端同时推一对互补信号A 高 B 低表示一种逻辑状态A 低 B 高表示另一种。接收端不看任何一根线对地的绝对电压只看 A 减 B 的差值。这个设计精妙在哪干扰信号尤其是共模干扰比如空间电磁辐射、地电位漂移、电源噪声它们会同时耦合到 A 和 B 两根线上。你用万用表量某一根线对地的电压可能被污染得乱七八糟但两根线同时被“抬”或同时被“压”差值基本不变。就好比两个人抬一根扁担一个人高一个人低用这个高低差来传信号。地面本身凹凸不平甚至两个人站的地面高度不同都不影响那个高低差。而且 RS-485 的接收阈值只需要 ±200mV。这意味着即使线缆很长、衰减很大信号从 ±5V 掉到了只剩几百毫伏只要差值的正负还能认出来接收端就能正确恢复数据。这就是 485 能跑上千米的根本原因——它不需要信号保持多大的绝对幅度只要两根线之间的相对关系对就行。2.3 一句话记住两者的不同单端信号是对“地”说话差分信号是对“另一根线”说话。对地说话地一脏信号就完蛋对另一根线说话只要两根线一起脏信号反而没事。RS-232 和 RS-485 的距离差异、抗干扰差异、能不能组网所有答案都藏在这句话里。3. 从电气参数看两个标准的“性格”3.1 RS-232 看着力气大实际上耳朵不好使把两个标准的电气参数放在一起对比视觉冲击力很强参数RS-232RS-485传输方式单端差分驱动输出电压±5V ~ ±15V±1.5V ~ ±6V接收判定阈值±3V±200mV接收输入阻抗典型 3kΩ ~ 7kΩ12kΩ1 单位负载标准最大距离约 15m约 1200m最大节点数1 对 132 单位负载可扩展更多默认传输方向全双工半双工为主也支持全双工注意看电压那一栏。RS-232 输出电压最大能到 ±15VRS-485 输出才 ±1.5V 到 ±6V。如果只看表面很多人会以为 232 力气更大、应该传得更远但结果恰恰相反。关键在接收端。RS-232 的接收判定阈值是 ±3V也就是说你必须保证到达接收端的信号幅度还在 ±3V 之外。发送端输出 12V减去线缆衰减、减去地电位差、减去噪声余量实际余量没你想象的那么大。RS-485 只需要 ±200mV比 232 灵敏一个数量级加上差分抵消共模干扰等量衰减下它还能正常工作。打个比方RS-232 是个声音很大但耳朵不灵的人你离他远一点喊他能听见但很容易听错RS-485 是声音不大但耳朵特别尖的两个人人家直接用“谁高谁低”来沟通背景再吵也不怕。所以别被“电压大等于距离远”这个直觉骗了。3.2 距离和速率是一笔物理账RS-485 最长 1200m这不是随便说说的数字但有一个前提速率要给够低。1200m 对应的典型速率上限大约在 90kbps 到 100kbps工程上跑 Modbus RTU 时常用 9600bps 或 19200bps在这个速率下 1200m 是非常稳的。如果你提高波特率距离就得缩短。我整理一个工程上常见的速查经验波特率典型最大传输距离经验值9.6kbps1200m 以上115.2kbps600m ~ 1000m1Mbps约 100m ~ 150m10Mbps约 15m ~ 30m注意这是经验典型值实际效果跟线缆质量、布线环境、终端匹配都有关系。RS-232 同样存在速率和距离的权衡比如 115200bps 下跑十几米问题不大再快距离就得缩到几米以内。但同样的速率下RS-485 能跑的距离上限基本高一个数量级。3.3 为什么距离和速率互相打架这里要补充一个物理常识。电信号在铜缆里的传播速度大约是光速的三分之二也就是每微秒大概能跑 200 米。一个比特在线上占据的物理长度等于传播速度除以波特率。算一下9600bps 时每个比特周期约 104 微秒一个位在线上占据 20 多公里。1200 米的线上同一时刻只有一个比特的一部分在跑接收端的判断非常从容。但到了 10Mbps每个比特只有 0.1 微秒换算下来一个位在线上只占 20 米左右。1200 米的线上同时存在几十个比特信号碰到线缆末端反射、线径变化、接头阻抗不连续就会前后互相干扰严重时接收端根本分不清当前这个“位”是真是假。所以远距离必须压低速率高速率必须缩短距离这不是 485 的缺点而是所有有线通信的物理规律。RS-485 只不过把这条曲线的整体水平抬高了不少。4. RS-485 组网不是简单并联这些条件缺一不可4.1 为什么 RS-232 连“组网”这个选项都没有先说清楚 RS-232 为什么点对点。技术上不是完全不能实现一对多比如多个接收端并联监听一个发送端有人试过也能工作。但 RS-232 的接收器输入阻抗低标准规定典型 3kΩ 到 7kΩ并联几个设备就把信号拉垮了。更致命的是发送端RS-232 驱动器是推挽输出空闲时也保持高或低电平不是高阻态。两个发送端并在一起一个输出高一个输出低那就不叫通信了叫短路。再加上 RS-232 的信号参考点是地多设备意味着多条地线回路地环路会引入更多干扰通信质量雪崩式恶化。所以 RS-232 标准从头到尾就没定义过多站模式它就是一台设备对一台设备的专用通道。你把它用在多点场景属于超范围使用稳定性和安全性完全没保证。RS-485 从一开始就按总线设计了。接收器输入阻抗 12kΩ 定义为 1 单位负载标准驱动器能驱动 32 个单位负载所以最多可以挂 32 个标准接收器。后来有了 1/4、1/8 单位负载的芯片挂 128 甚至 256 个节点也变得常见。更重要的是RS-485 驱动器可以切到高阻态所有节点空闲时都不占用总线谁要发送谁就申请总线天然适合时分复用。4.2 终端电阻、偏置电阻、接线拓扑一个都不能糊弄RS-485 能组网但组网不是把几十台设备的 A/A/B/B 随便一接就行。我见过太多现场因为少了终端电阻或者接成了星型导致丢包率居高不下。第一接线拓扑必须手拉手。所谓手拉手就是从第一个节点串到第二个、第三个两头各是线缆的物理末端。最忌讳的是星型接法一台主机引出好几条支线分别去接设备信号在支线末端反射反射回来的波形叠加在正常信号上轻则偶发错帧重则完全不通。这不是玄学是阻抗不连续导致的信号完整性问题。第二终端电阻只在总线的两端各接一个 120Ω。为什么是 120Ω因为标准双绞线的特性阻抗大约就是 120Ω在末端并一个匹配电阻等于让信号到达线尾时把能量“吸收”掉不再反射回来。有人图省事只在主机端接一个或者干脆不接近距离低速时可能没事距离一长或者速率一高丢包问题就会冒出来。第三偏置电阻是很多人忽略的点。RS-485 总线在空闲时所有节点都处于高阻接收态A/B 之间没有任何驱动源这时总线电压是浮空的。如果刚好落在接收阈值 ±200mV 的不确定区接收端输出就是随机的你会看到设备在没有通信的时候疯狂收到乱码。解决办法是在主站端或者总线上某一处把 A 线通过电阻上拉到电源B 线通过电阻下拉到地让总线空闲时保持一个确定的差分电压。一个常用的配置是 5V 电源A 上拉 680ΩB 下拉 680Ω。如果节点多、线缆长偏置电阻值要重新算原则是保证总线上最远节点的 A-B 电压在空闲时仍然高于 200mV。这个用万用表量 A-B 之间直流电压就能验证正常空闲电压通常在 1V 左右具体看偏置网络。4.3 半双工模式下软件时序比硬件更容易翻车默认的 RS-485 二线制是半双工同一时刻只能有一个设备在发送其他设备都在听。所以需要一套访问控制机制最常用的是主从轮询——主机问一个问题指定某个从机回答其他从机保持沉默。协议层比如 Modbus RTU 就是这么干的。半双工控制最经典的坑是发送完最后一个字节后立刻把发送使能脚拉低切回接收态。看起来没问题但实际上 MCU 的 UART 外设把最后一个字节交给移位寄存器后还需要一段时间才能完全发完。如果你在写完数据寄存器后就切方向最后一个字节会被截断一半对端永远收到一条不完整的帧。正确的做法是等发送完成标志置位确认移位寄存器里的最后一位已经移出再关发送使能。具体到不同 MCU这个标志名不一样比如有的叫 TC有的叫 TXE但原理都是同一个发完再切不差这几微秒。另外从机在总线上回复之前要确保主机已经切回接收态否则两个设备同时驱动总线轻则通信失败重则烧毁驱动芯片。所以主机的发送控制脚和从机的应答时序要留出足够的切换时间通常几毫秒的延时是安全的。5. 实际项目里选 232 还是 485我的判断标准5.1 这些年头没被淘汰的场景依然离不开 RS-232别一听 RS-485 能组网就以为 RS-232 可以送进博物馆了。实际工作中RS-232 在以下几个场景里依然是最优解。第一板级调试。从电脑的 USB 口通过 USB 转 TTL 模块直接连开发板的 UART距离不到一米速率 115200RS-232 和 TTL 甚至都够用。这里要注意一个高频误区USB 转 TTL 模块输出的不是 RS-232 电平而是 TTL 电平电压范围大概是 0V 和 3.3V/5V。市面上大量基于 CH340、FTDI 芯片的“串口模块”严格来说是 USB 转 TTL不是 USB 转 RS-232。你拿它去连一个真正的 RS-232 设备比如老式仪器仪表的 DB9 口是通信不上的中间还必须加 MAX3232 这种电平转换芯片把 TTL 换成 RS-232 电平。第二老设备对接。工控机、老式 PLC、部分路由器交换机的 Console 口、GPS 模块、打印机几十年来一直保留 RS-232 接口。改造现有设备的时候能用 232 解决问题就不需要动总线架构。第三全双工点对点。RS-232 天然全双工收发互不干扰短距离场景下非常省事。RS-485 二线制虽然也能用 4 线实现全双工但布线成本和复杂度上去了点对点短距离优势不明显。5.2 什么场合老老实实上 RS-485反过来说碰到下面这些情况和 RS-232 谈都别谈直接上 RS-485。距离超过 30 米。这是 RS-232 的物理红线超过以后即使当前调试没问题环境一变、干扰一强问题就来了。三五十米以上的通信老老实实 485。多设备组网。电表、水表、温湿度传感器、PLC、变频器挂在同一条总线上集中采集这是 RS-485 的主场。用 Modbus RTU 协议一条总线挂几十台设备工程上非常成熟。现场电磁环境恶劣。变频器、伺服电机、大功率开关一动作空间里全是干扰。RS-485 的差分结构和可选的屏蔽双绞线能把这种干扰的影响降到很低。当然要做到位收发器要选带隔离的进线口加 TVS 管防浪涌必要时加磁珠这些都是经验之谈。5.3 这些年我踩过的串口坑最后分享几个现场排查经验都是花钱买来的教训。第一个坑RS-232 通信间歇性乱码。排查了一圈最后发现是两台设备电源没有共地地电位差高达好几伏。信号线上的电压被地电位“搬”走了接收端落在死区里。解决方法是把所有设备的 GND 可靠连在一起或者用带隔离的转换器。RS-232 虽然叫点对点但“点对点”的前提也是共地。第二个坑RS-485 一台设备通信不上。测量 A/B 之间的电压发现完全没有偏置总线空闲时浮空。加上偏置电阻后问题立刻消失。如果你用了个内置故障安全偏置的收发器芯片比如 MAX13487 这类可以省去外部偏置电阻但传统 MAX485/SP485 还是得自己搭。第三个坑长距离 485 丢包。布线是星型中间有好几个节点是单独拉线接到主机上的。改成手拉手串联布线在两端加 120Ω 终端电阻丢包率基本归零。这个问题的隐蔽之处在于低速近距离测试一切正常等到实际现场几十米甚至上百米布线问题才暴露。第四个坑A/B 线接反。很多模块 A/B 的标注不统一有的标 A/B有的标 D/D-有的标 485/485-。接反了不会烧设备就是完全不通。排查时两个线头直接对调就能验证这是 485 故障里最便宜的一步操作。第五个坑发送完最后一个字节被截断。之前的从机在回数据时总是差一个字节查来查去发现是发送完没有等移位寄存器清空就释放了总线。把方向切换时机改成发送完成中断后再动作问题彻底解决。运维和调试 485 总线时我自己最常用的排查流程是先用万用表量 A-B 空闲电压判断总线上有没有偏置和终端电阻然后看接线拓扑是不是手拉手再确认每个节点的 A/B 线序一致最后才去检查代码里的方向切换和波特率。按这个顺序排查大部分问题都能快速定位。RS-232 呢优先级最高的检查项永远是地线公共地没接好其他的都不用看。这些经验听起来零碎但现场 80% 的串口故障最后都落在这几个点上。