RS485 是我在工业项目里用得最多的一个通信接口没有之一。从温湿度采集、电机驱动器参数读写到 PLC 和仪表之间的数据交换几十上百米的距离、强电在旁边走、变频器满世界发噪声——这种场合下UART 直接拉根线根本没法看而 RS485 属于那种“看起来原理不复杂但想让它稳定跑一两年不出问题背后的细节全在电路和板卡设计上”的东西。这篇文章我拿 SIT3485E 当主角——一颗很常见的国产 3.3V RS485 收发器从原理图怎么画、BOM 怎么选到 PCB 怎么布局、现场怎么排查问题完整走一遍。适合手里有单片机开发板、想自己做一块能实际用的 RS485 节点板的人也适合刚入行的硬件工程师对照着查漏补缺。看完你能直接照着画板子也能搞明白每个电阻电容为什么要放在那个位置。1. RS485不是“串口”而是一套传输层的物理层方案1.1 UART解决不了的问题很多朋友第一次接触 RS485 时都会有个疑问UART 不也是串口通信吗单片机引脚直接连过去不就行了短距离、同一块板子内部确实可以比如 STM32 和 WiFi 模块之间走 UART一根 TX、一根 RX、一根 GND 就够了。但一旦把通信距离拉到十米以上或者现场有电机、变频器、继电器这些强干扰源单端信号就非常脆弱。原因在于 UART 的 TTL 电平是“用电压绝对值表示 0 和 1”3.3V 或者 5V 对 GND。导线本身有电阻距离一长就会出现压降而且外界电磁干扰会直接叠加在信号线上。如果干扰幅度超过逻辑阈值接收端就会把噪声当成数据表现出来就是乱码、丢包甚至通信完全中断。RS485 解决的就是这两个问题传输距离和抗干扰能力。RS485 本质上还是 UART 的数据帧起始位、数据位、停止位那一套全都不变变的只是物理层——它把单片机的 TX 信号转换成 A、B 两根线之间的差分电压来传输。接收端再把差分电压还原成 UART 电平。所以对单片机来说RS485 就是个透明管道你发什么它传什么只是发送和接收的方向需要额外控制。1.2 差分信号为什么能抗干扰差分传输的原理可以这么理解普通单端信号就像一个人站在嘈杂的广场上喊话声音大小是信息差分信号则是两个人同时喊一个喊正相、一个喊反相听的人只听两个人声音的差值。广场上的环境噪声对两个人的影响是一样的做差之后就被抵消了。在 RS485 里A、B 两根线就是这对“双绞线”它们紧紧绞在一起受到的电磁干扰几乎相同接收器只关心 A 减 B 的结果所以共模干扰天然被抑制。RS485 标准规定当 A 比 B 高 200mV 以上时逻辑为 1空闲态当 A 比 B 低 200mV 以上时逻辑为 0起始位。这个 200mV 门槛看似很小但因为它是差分判断抗干扰能力远强于 TTL 电平。再加上驱动器本身能提供 ±1.5V 到 ±5V 的差分摆幅在 100kbps 左右的速率下理论传输距离可以做到 1200 米。这里要说清楚一点RS485 的“远距离”是用速率换来的。距离越长速率就要越低。1200 米对应的通常是不超过 100kbps 的速率如果你要在 10Mbps 下跑 RS485那距离一般就缩到几米十几米了。工业现场最常见的配置是 9600bps 或 115200bps配上双绞线屏蔽电缆几十米到几百米都在安全范围。1.3 RS485和RS232、RS422怎么选这三兄弟经常被放在一起比较其实它们的逻辑层都是 UART区别全在物理层。RS232 是单端传输用 ±12V 左右的电平表示 0 和 1抗干扰比 TTL 好一些但仍然是共地单端距离限制在 15 米左右而且只能点对点。RS422 是差分传输但它是全双工一共 4 根线两发两收支持一对多距离也可以到 1200 米。RS485 则是差分传输里的“半双工”两根线既发又收靠方向控制切换支持一条总线上挂多个节点。实际选型时RS485 是工业现场最常用的因为半双工两根线就能组网成本低、接线方便。RS422 在一些需要同时收发、且从机不主动上报的场景里还有应用但多数新设计都被 RS485 替代了。RS232 则是老设备上很常见比如一些仪表、条码枪需要通过电平转换芯片MAX232 之类和单片机对接。如果你的项目是全新设计、要组网、要抗干扰直接选 RS485 就行这也是今天这篇文章的主线。1.4 为什么用SIT3485E这颗芯片市面上 RS485 收发器很多TI 的 SN65HVD72、MAX485、SP3485 都是经典型号。我选 SIT3485E 的理由很实在第一它是国产芯片供应链稳定价格便宜交期短小批量打样买几片也很方便第二它是 3.3V 供电的正好和现在主流单片机STM32、ESP32、GD32 等电平匹配不需要额外做电平转换第三它内部集成了失效保护功能当总线开路、短路或者空闲时接收器输出一个确定的高电平不会因为总线悬空产生乱码。SIT3485E 的封装是 SOIC-8引脚定义和 MAX3485 完全兼容你就算以前用的是 MAX3485直接换上 SIT3485E 也不用改板。它的驱动器能支持挂接多个接收器具体节点数和上拉下拉电阻有关从十几个到一百多个都能做具体选型时要结合数据手册的输入阻抗参数来计算。在 Modbus 这种最常见的 RS485 应用协议里SIT3485E 属于那种“不会给你添乱”的芯片——速率够用、功耗低、静态电流只有几百微安电池供电的设备也能接受。2. 原理图设计每个引脚和每颗保护器件该怎么接2.1 SIT3485E引脚说明与最小系统搭建先看 SIT3485E 的 8 个引脚1 脚 RO接收输出接到单片机 RX、2 脚 RE#接收使能低电平有效、3 脚 DE发送使能高电平有效、4 脚 DI发送输入接到单片机 TX、5 脚 GND、6 脚 A同相总线端、7 脚 B反相总线端、8 脚 VCC。最小系统非常简洁VCC 接 3.3V在芯片电源引脚旁边放一个 0.1uF 的陶瓷电容做高频去耦再并联一个 10uF 的电解或钽电容做低频储能这两个电容要尽可能靠近芯片引脚。GND 直接和系统地相连。RO 接单片机 RXDI 接单片机 TXRE# 和 DE 接在一起由 GPIO 控制或者通过自动收发电路控制。A、B 两个引脚就是出去接总线的地方。这里有个很多人容易忽略的细节如果单片机是 5V 供电SIT3485E 的 RO 输出高电平只有 3.3V单片机 RX 引脚如果兼容 5V TTL那没问题但反过来SIT3485E 的 DI 输入引脚对 5V 电平并不完全兼容最好串一个限流电阻或者用电平转换电路。现在主流单片机基本都是 3.3V 供电直接连就行5V 系统建议加一颗 1kΩ 串联电阻作为保护。2.2 方向控制从硬件握手到自动收发电路RS485 是半双工同一时间只能发或者只能收所以必须控制方向。最简单的做法是把 RE# 和 DE 短接用单片机一个 GPIO 控制发送数据前拉高发完拉低。这种方式最可靠实时性也最好适合 Modbus 这类主机明确、时序可控的协议。缺点是多占一个引脚而且如果程序里控制时序没写好容易出现“发完最后一个字节立刻拉低但移位寄存器还没把数据完全推出去”的问题导致最后一帧尾部被砍掉。另一种做法是自动收发电路也叫免方向控制电路。核心思路是让 TXD 信号在空闲时为高电平通过三极管把方向控制线拉到接收状态当 TXD 出现起始位低电平时三极管翻转把芯片切到发送状态。这样硬件自动切换方向程序里完全不用管。我常用的是一个 NPN 三极管方案SIT3485E 的 DE/RE# 短接后接一个 10kΩ 上拉电阻到 3.3V默认发送三极管集电极也接在这个点发射极接地基极通过 4.7kΩ 电阻接单片机 TXD。当 TXD 空闲为高时三极管导通DE/RE# 被拉低芯片处于接收状态当 TXD 发送起始位低电平时三极管截止DE/RE# 被上拉到高芯片切换到发送。这个电路用起来很方便但要注意发送完最后一个字节后三极管恢复导通DE 拉低到接收状态需要一点点时间如果单片机在最后一个字节刚发出后就立刻把 TXD 置高等待回复接收端可能丢失尾部的停止位。解决办法是在发送完成后加一个 1 字节的延时或者在 UART 发送空中断后等发送移位寄存器完全空闲再切换。自动收发电路还要注意三极管选型和电阻分压。我习惯用 S8050 这类通用 NPN基极电阻 4.7kΩ集电极电阻直接用 DE 的上拉电阻 10kΩ实测在 3.3V 系统下非常稳定。如果你用的是 5V 单片机基极电阻可以加大到 10kΩ防止基极电流过大把 3.3V 的 DE 引脚拉坏。2.3 总线保护与失效保护设计RS485 总线长距离走线相当于一根天线雷击浪涌、静电放电、电机启停产生的尖峰都可能耦合到 A、B 线上。SIT3485E 芯片本身有 ESD 防护但实际工业现场的干扰远超过芯片的承受能力所以外围保护电路不能省。标准的一字型保护电路从总线侧到芯片侧是这样排列的首先是在 A、B 线对地各接一个 TVS 管双向瞬态抑制二极管型号常用 SMBJ6.5CA 或者 PESD1CAN作用是钳位浪涌电压然后在 A、B 线上串联两个 10Ω~20Ω 的电阻限制浪涌电流电阻后面才是芯片的 A、B 引脚同时 A、B 之间再跨接一个 TVS 管或者压敏电阻抑制差模过压。很多资料里还会在 A、B 和 GND 之间加一个高压电容比如 1nF/2kV给共模干扰提供一个低阻抗回流路径。这个电容位置很重要要放在 TVS 管和串联电阻之间也就是靠近连接器的一端不能放在靠近芯片的一端否则会把干扰引入芯片。失效保护指的是总线空闲、短路或者开路时接收器输出的状态。普通 485 芯片在 A 悬空、B 悬空时RO 输出可能是随机的这会导致单片机收到一堆乱码。SIT3485E 内置了失效保护但为了更可靠工程上习惯在 A 线上拉到 3.3V、B 线下拉到 GND通过 5kΩ 到 10kΩ 的电阻给总线一个确定性的偏置。这样空闲时 A-B 电压是一个明确的正值RO 稳定输出高电平。偏置电阻的大小会影响总线节点数总线上挂的设备越多偏置作用越弱需要根据实际节点数调整。2.4 完整参考原理图与BOM清单把上面这些串起来一个完整的 RS485 节点就包含以下部分单片机侧的 TXD、RXD、方向控制 GPIO或自动收发电路SIT3485E 收发器总线侧的偏置电阻、串联电阻、TVS 管以及可选的终端电阻。终端电阻一般只加在总线最远端的两个节点上阻值 120Ω跨接在 A、B 之间作用是在高速通信时消除信号反射。我常用的 BOM 清单大致是这样的SIT3485E 一片0.1uF/0603 瓷片电容一个用作电源去耦10uF/0805 电容一个用作储能10Ω/0603 电阻两个串联在 A、B 线上5.1kΩ/0603 电阻两个作为 A 上拉、B 下拉偏置SMBJ6.5CA 双向 TVS 管三颗A 对地、B 对地、A-B 之间各一颗120Ω 终端电阻看情况预留一般做成跳线或者焊盘预留方便现场调试时焊接。注意TVS 管选型要关注钳位电压和最高工作电压。对于 3.3V 系统A/B 线上的静态电压在 0~3.3V 之间SMBJ6.5CA 的工作电压是 6.5V 左右既能保证正常信号不受影响又能把浪涌钳位在芯片能承受的范围内。别选工作电压太低的 TVS否则正常通信时它就开始漏电反而影响总线电平。3. PCB布局布线决定485稳定性的一半功夫3.1 布局顺序与关键器件摆放原理图画得再漂亮布局布线乱了照样现场翻车。RS485 的 PCB 设计核心原则是收发器靠近连接器单片机靠近收发器的数字侧保护器件放在收发器和连接器之间。我布局的顺序是先把接线端子或者 DB9 连接器放在板边然后从连接器往 PCB 内侧依次放 TVS 管、串联电阻、SIT3485E再放单片机。这样信号路径是直的A、B 线从连接器进来先过保护器件再到芯片路径最短、环路最小。TVS 管的接地引脚要单独打过孔到主地平面不要和芯片的地引脚共用过孔否则浪涌电流流过地弹会抬高芯片参考地。电源部分也要提前规划。如果整板用 3.3V那 SIT3485E 的去耦电容放在芯片电源引脚和地之间离引脚越近越好一般不超过 3mm。如果给 RS485 部分单独用隔离电源比如 B0505S-1W 隔离 DC-DC那要保证隔离电源的输出地和系统地彻底分开中间不能有铜皮相连只能通过光耦或者数字隔离器跨越隔离带。3.2 A/B差分线布线原则与阻抗控制RS485 工作在几百 kbps 到几 Mbps有人觉得这么低的频率随便走线就行这其实是个误区。A、B 两根线作为差分对要尽量做到等长、平行、靠近不要让它们中间夹着其他信号线。等长的目的是保证差分信号到达接收端的时刻一致A、B 之间的长度差控制在 5mm 以内就很安全。靠近的目的是让两根线受到的干扰尽可能一致这样共模抑制才有效。两层板没有完整参考地平面时A、B 走线最好走在顶层底层铺大面积地铜并且 A、B 线正下方的地平面不要被切断。如果板子上还有其他高频信号比如 SPI、晶振、PWM要让它们远离 A、B 走线尤其是晶振和高速数字线不能和 A/B 平行长距离走线否则串扰会让 RS485 误码率显著上升。关于差分阻抗RS485 的标准特性阻抗是 120Ω但实际应用中只要走线长度不超过几十厘米阻抗不匹配的影响微乎其微。真正要关注的是走线宽度不要太细建议做到 10mil 以上走线宽度不足会导致环路电阻偏大在长距离通信时影响驱动能力。如果你要走很长的板内走线比如超过 10cm可以让 A、B 两线之间保持 2 倍线宽的间距并且尽量贴着走。还有一个容易忽略的细节A、B 走线上不要打过孔。每一对过孔都会引入额外的电感和电容不连续点在高速率下会造成信号反射。如果必须换层至少保证 A、B 一起换过孔旁边加一个回流地孔。3.3 电源、地与隔离的处理RS485 节点最容易受干扰的地方其实是电源和地。长距离通信时不同节点的参考地电位可能有几伏甚至几十伏的差异这个电位差就是共模电压。如果节点之间没有可靠的地连接共模电压超过收发器的共模输入范围一般是 -7V 到 12V芯片就会损坏或者误判。解决共模电压问题有两个方向。一个是通过屏蔽双绞线的屏蔽层把各个节点的地连接起来让它们电位尽量一致但这在现场很难做到完美另一个是使用隔离方案单片机侧和总线侧之间用数字隔离器如 ADuM1201、ISO7721、Si8620隔开总线侧电源用隔离 DC-DC 单独供电。这样两个节点之间没有电气连接共模电流无法形成回路抗干扰能力会强很多。如果做非隔离方案布局时同样要注意地的问题。我习惯把 RS485 区域的数字地和模拟地先分开铺铜然后在单片机的电源地引脚处单点汇合也就是常说的星型接地。这样单片机数字电路开关产生的高频噪声不会通过地平面直接注入 RS485 收发器。要注意的是分离地之间必须有一个明确的汇合点不能形成地环路否则反而会引入更大的干扰。3.4 保护器件位置与“先保护后匹配”的顺序PCB 布局里最容易被搞反的就是保护器件和终端电阻的顺序。正确的顺序从连接器往里看是TVS 管 → 串联电阻 → 终端电阻如果有→ 芯片。TVS 管必须最靠近连接器因为浪涌是从外面进来的要第一时间被钳位掉串联电阻在 TVS 后面用来限制剩下的电流终端电阻用在总线末端做阻抗匹配应该靠近芯片侧放置或者通过跳线切换到总线末端。很多人在布局时把终端电阻放在连接器旁边这样做会带来一个问题A、B 线经过串联电阻、走线到连接器的这段路径在高速信号下会产生反射。合理的做法是预留终端电阻焊盘但平时不焊只有在确认节点处于总线末端时才焊接而且焊盘位置靠近芯片的 A、B 引脚。这样既方便现场调试也不会影响非末端节点的通信质量。保护器件的接地也非常重要。TVS 管的接地端要直接打到保护地或系统地平面走线越短越好。如果保护地没有独立的平面就单独拉一根粗走线到电源输入的滤波电容地端。千万不要让 TVS 管的地电流流过芯片的地引脚否则浪涌电流会通过地线串进芯片那就起不到保护作用了。3.5 PCB布局自查清单画完板子进行评审时我通常会对照这样一份自查清单你可以直接拿去用SIT3485E 的 0.1uF 去耦电容是否靠近 VCC 引脚走线是否先过电容再进芯片A、B 走线是否等长平行是否远离晶振和高速数字线TVS 管是否在连接器侧接地走线是否短而粗串联电阻是否靠近芯片侧A、B 走线是否有最小宽度限制自动收发电路的三极管布局是否靠近 SIT3485E 的 DE/RE# 引脚基极电阻是否靠近单片机 TXD 引脚如果用了隔离方案隔离带是否清晰数字地和总线地是否完全分开终端电阻焊盘是否预留能否方便现场焊接总线侧的连接器是否选择了螺丝端子或带锁扣的连接器防止振动脱落这条清单看着简单但每一条背后都有真实的事故支撑。比如去耦电容放远了EMC 测试时辐射超标A、B 线离晶振太近导致通信在电机启动时偶尔丢一字节TVS 管地线太长雷击测试时芯片照样被打坏。做硬件就是这样每一个不起眼的细节都可能成为现场问题的根源。4. 调试实录从波形到组网问题逐个排查4.1 上电先看这些波形和电平焊接完成后不要急着接单片机跑程序先用万用表和示波器把基本状态确认一遍。第一步测量 SIT3485E 的 VCC 和 GND 是否正常3.3V 电源纹波在正常范围内第二步用示波器探头测 RO 引脚在总线开路的状态下RO 应该稳定输出高电平因为 SIT3485E 内置了失效保护第三步手动把 A 线对地短路一下RO 应当变为低电平松开后恢复高电平这说明接收链路是通的。接下来测试发送方向。用单片机持续发送 0x55二进制 01010101示波器分别测 SIT3485E 的 DI 引脚和 A-B 差分电压。DI 引脚上应该看到正常的 UART 波形A-B 差分波形应该是幅度大约 2V~3V 的方波波形上升沿和下降沿不能有明显的振铃。如果波形边缘有超过 1V 的过冲说明终端电阻没加好或者走线阻抗不匹配。如果用的是自动收发电路建议先把 RXD 引脚悬空观察一下在单片机不发送数据时RXD 上的波形应该是一条高电平直线。如果出现周期性的低电平脉冲说明自动收发电路在空闲状态误触发了发送方向一般是三极管基极电阻偏小、误把噪声放大了可以适当加大基极电阻或者加一个小电容滤除噪声。4.2 常见故障现象速查与解决办法调试 RS485 主从通信时最典型的几个问题我在下面这张表里整理一下方便你对照故障现象可能原因排查与解决办法完全收不到数据方向控制逻辑反了检查 RE#/DE 连接与控制时序先用 GPIO 手动控制确认方向能收到数据但乱码波特率不匹配或总线空闲电平不确定确认两端波特率一致检查 A 上拉、B 下拉偏置电阻是否接入发送时波形过冲严重缺少终端电阻或线缆过长在总线两端各加 120Ω 终端电阻重新测波形距离稍远就丢包A/B 线被其他信号干扰检查 A/B 走线走向确认是否远离晶振、PWM 线换屏蔽双绞线上电瞬间收到乱码单片机复位期间 GPIO 悬空方向被拉高在 RE#/DE 控制脚加一个下拉电阻如 10kΩ确保复位时为接收状态多个节点时通信不稳定总线拓扑问题或终端电阻过多用菊花链连接只在最远两端加终端电阻移除中间节点的终端电阻芯片发烫总线短路或驱动器过载断电测量 A-B 之间是否短路检查是否多个节点都启用了发送驱动上电瞬间乱码这个问题特别常见。单片机复位期间GPIO 处于高阻态如果 DE/RE# 引脚悬空芯片可能被随机拉高进入发送状态此时总线上相当于有一个节点在乱发数据。解决方法是把 DE/RE# 引脚用一个 10kΩ 电阻下拉到地保证复位期间默认进入接收状态。如果是自动收发电路这个下拉电阻就加在 TXD 到地之间防止 TXD 悬空导致三极管状态不确定。还有个容易被忽略的点测试用的 USB 转 RS485 模块。很多便宜的模块使用的芯片比如 CH340 MAX485质量参差不齐有些模块上的终端电阻和偏置电阻已经内置你如果在这类模块下游再接一个 120Ω 终端电阻等于总线两端各挂了一个再加上偏置电阻的影响信号幅度会被拉低。遇到“和这个模块通信正常换个模块就不行”的情况先检查模块的原理图确认它内部是否已经带了偏置和终端电阻。4.3 组网时最容易翻车的三个细节RS485 组网比如 Modbus RTU 总线上挂几十个从站时布线拓扑是最关键的一环。正确做法是手拉手的菊花链也就是每个节点用短线从总线上引出主总线一根线从第一个节点走到最后一个节点。千万不要用星型拓扑也就是把所有节点用长线汇聚到一个中心点。星型连接会在各个分支末端产生反射节点多了以后通信质量急剧下降而且很难排查。第二个细节是终端电阻怎么加。很多新手会在每个节点上都焊上 120Ω 终端电阻结果总线驱动器的负载被拉到很低信号幅度不足通信失败。记住终端电阻只加在总线物理拓扑的最远端也就是最后一个节点的 A-B 之间。如果现场不方便确认哪个是最远端就把它做成可插拔的跳线端子需要时插上不需要时保持开路。第三个细节是共模电压。即使总线看起来都正常A、B 之间波形标准只要两个节点之间的地电位差超过 SIT3485E 的共模范围通信就会出问题。最常见的表现是单独测试每个节点都正常两个节点接一起就丢包或者一端接电脑调试时正常一接到现场设备就不稳定。这时候最好用万用表交流档测一下两个节点之间的地电位差超过几伏就需要考虑隔离方案了。如果是临时调试可以先用一根粗线把两个节点的 GND 连起来看问题是否消失就能验证是不是共模电压引起的。关于线缆工业现场建议用屏蔽双绞线屏蔽层单端接地一般接主机侧不要两端都接地避免形成地环路。线径不要太细0.5mm² 以上比较稳妥。如果你用普通的杜邦线在桌面上测试几百毫秒的通信没问题但那只能验证逻辑不能代表现场性能。最后再分享一个小技巧我习惯在每块 RS485 板子的 A、B 线上预留测试点封装做成 1.27mm 的排针焊盘调试时直接夹示波器探头非常方便。而且 A、B 两个测试点要靠近芯片不要靠近连接器因为靠近芯片能同时观察到保护和匹配电路对波形的影响。这种小细节看着不起眼但在现场排查问题时能省很多时间。做硬件就是这样一个脚印一个脚印踩出来的RS485 这种基础接口只要你把原理图、布局、调试这三关都走一遍以后做其他通信接口心里会非常有底。
阅读完成 · 觉得有帮助?