搞工业通信这些年RS485 这块我吃过不少亏。最早偷懒不做隔离到了现场被变频器、伺服一干扰或者两块板子地电位差稍微拉开一点通讯就乱码严重的时候直接烧掉 MAX485。后来所有的 RS485 接口我基本都统一改成了一套路用 6N137 光耦做电气隔离再配合 MAX485 做总线驱动这套组合我用了很久稳定性和抗干扰能力都相当能打。这篇文章我就把从选型到调试的完整过程写下来包括 6N137 的输入电流怎么算、输出上拉电阻选多大、DE/RE 控制怎么接、终端电阻和偏置电阻怎么配以及我在实测中踩过的坑。想给 485 接口加隔离的朋友可以直接照着这套思路做。1. 先搞清楚RS485 为什么非得隔离不隔离能撑多久很多人以为 RS485 是差分信号抗干扰能力本来就很强隔离显得多此一举。这个想法在实验室里没什么问题拿到工业现场就完全不是一回事了。差分信号确实能抑制共模干扰但这里有个前提——共模电压不能超过收发器的允许范围。MAX485 的 A、B 引脚相对 GND 的共模输入电压范围大致在 -7V 到 12V听着好像挺宽可现场的干扰源根本不给面子。最常见的问题就是地环路。两台设备各自接地接地点不同两边的地电位就有差值。这个差值在电机启动、大功率设备切换的时候可能瞬间飙到几伏甚至几十伏。如果两块板子之间还有一根 RS485 线连着这个地电位差就会通过总线电缆形成回路电流轻则让接收端误码重则直接把收发器内部的 ESD 保护二极管打穿。我自己就遇到过一块从机板子在深夜设备启停频繁时突然整片冒烟的情况拆开一看MAX485 的 A 脚和地之间已经烧出了明显的痕迹。还有一种情况是雷击和浪涌。户外走线的 RS485 总线哪怕没有直击雷感应雷也能在线缆上感应出很高的瞬态电压。光耦隔离不能替你挡掉所有的浪涌但它能把浪涌进入 MCU 侧的路径切断大半。MCU 一侧的地和总线一侧的地是彻底分开的浪涌想在两边之间找回路找不到芯片就不容易出问题。那为什么专门用光耦而不是磁隔离或者电容隔离做产品当然可以用 ISO3082 或者 ADM2587 这类集成隔离收发器省事很多。但对于很多小批量、DIY、或者手里已经有一堆库存芯片的场景用 6N137 加 MAX485 是成本最低、供货最稳定、也最容易理解的搭法。6N137 是高速光耦传输速率能到 10Mbps对 RS485 常用的 9600 到 115200 波特率来说绰绰有余。它的输入侧是一个 LED输出侧是集电极开路的检测器两边完全电气隔离耐压常见能到 2500Vrms 以上用在工业控制板上的隔离需求已经足够。说到底隔离解决的不是“差分信号好不好”的问题而是“两边地电位不一致时怎么保证安全”的问题。只要把地环路切断绝大多数乱码和烧芯片的隐患就自动消失了。2. 核心器件吃透6N137 高速光耦和 MAX485 收发器怎么匹配2.1 6N137 的引脚和关键参数怎么看才不会被坑6N137 是一款高速 TTL 兼容光耦外形是常见的 DIP-8也有贴片封装。引脚功能不难记第 2 脚和第 3 脚是输入侧 LED 的阳极和阴极第 6 脚是输出 VO第 7 脚是输出使能第 8 脚接输出侧 VCC5V第 5 脚是输出侧 GND第 1 和第 4 脚悬空。很多人第一次用容易犯的错是把它当成普通光耦来用。普通光耦如 PC817 输出侧是光敏三极管线性度一般速度也慢用来传 RS485 这种高速数字信号会直接畸变。6N137 内部输出侧是一个光敏二极管配合高增益放大器再经过集电极开路的输出级专门为数字信号传输设计边沿的陡峭程度远非 PC817 可比。它的输出是开漏结构所以 VO 到 VCC 之间必须接一个上拉电阻不然输出永远没有高电平。数据手册上有几个参数要重点看最大传播延迟 tPHL/tPLH 大约在 75ns 量级对 115200 波特率来说一个位时间是 8.68 微秒75ns 的传播延迟完全不影响。输入侧 LED 的压降 VF 一般在 1.4V 到 1.8V推荐正向电流 IF 在 5mA 到 15mA。低于 1mA 的话输出侧可能无法可靠导通导致波形毛刺甚至完全没输出。输出侧灌电流能力不错典型最大 IOL 13mAVOL 在 13mA 灌电流下最大约 0.5V驱动后续逻辑电平没压力。第 7 脚使能脚要特别留意。常规 6N137 的使能逻辑是低电平有效也就是说把第 7 脚拉低输出才正常工作。不做使能控制的时候最省事的做法是直接接地让光耦常通。我见过有人把第 7 脚悬空然后输出波形乱七八糟查了半天才发现是使能脚没处理。这里也提醒一句不同品牌、不同批次的光耦引脚功能一样但逻辑标注可能有差异上板之前一定要打开对应的数据手册确认一下。2.2 MAX485 收发器引脚和设计要点一次讲清MAX485 是经典的 RS485 半双工收发器DIP-8 封装5V 供电。它负责把 TTL 电平转成 RS485 差分信号也负责把总线上的差分信号转回 TTL 电平。半双工的意思是一根总线上同一时刻只能有一个设备在发送其他设备都在接收所以收和发必须分时复用。引脚方面RO 是接收数据输出接到 MCU 的 RXDI 是发送数据输入接到 MCU 的 TX 经过隔离后的信号RE 是接收使能低电平有效拉低时 RO 才有效输出DE 是发送使能高电平有效拉高时 MAX485 才会驱动总线A 和 B 是差分总线引脚A 同相、B 反相接线时千万不要一把抓反了否则整个网络都会乱套。MAX485 的失效保护特性也值得说一下。它内部有一个比较器当 A 和 B 之间的差分电压超过 200mV 时RO 输出高低于 -200mV 时RO 输出低如果 A、B 之间电压在 -200mV 到 200mV 之间那是“不定区”。但 MAX485 的失效保护做得比较好专门针对总线空闲或开路的情况会让 RO 默认输出高电平避免接收到一堆随机乱码。不过这只是芯片自身的保护实际总线上如果没有任何偏置空闲状态下 A、B 之间就是在 0V 附近浮动抗干扰依然弱。所以后面我会在电路里加上偏置电阻确保总线上所有节点都不发送的时候A、B 之间有明确稳定的差分电平。MAX485 的带负载能力也很关键。标准 MAX485 能挂 32 个单位负载也就是俗称的“32个节点”。这个数量对你做一主多从的采集系统比如一个主机带 10 个、20 个从机完全够用。如果节点数更多就要换更高输入阻抗的型号比如 1/4 单位负载的 MAX487能挂到 128 个节点。选择时先想清楚总线规模就对了。3. 手把手搭电路隔离电源、发送通道、接收通道、自动收发一起说3.1 隔离电源怎么处理光耦隔离了信号却忽略电源就是白做做光耦隔离最容易犯的一个错误是把电源也“隔离”忘了。6N137 两侧要分别供电MCU 侧用 3.3V 或 5V总线侧用独立的 5V 隔离电源。如果两侧共用同一个电源地光耦隔离就等于白做了地环路的电流照样能通过公共地传过来。我常用的方案是加一个模块化的隔离 DC-DC比如金升阳 B0505S-1W输入 5V输出也是 5V输入和输出之间隔离耐压 1000V 以上。它的体积不大电流输出能力在 200mA 左右带一个 MAX485 和几路 6N137 的输出侧完全够用。如果你 MCU 侧是 3.3V那就选 B0305S 之类或者后面再接一颗 LDO。隔离电源的纹波不可忽视。实际测试中B0505S 这类小功率隔离模块的纹波通常在几十毫伏级别单独给光耦输出侧和 MAX485 供电没问题但最好在输出端并两个电容一个 10uF 电解电容吸收低频纹波一个 0.1uF 瓷片电容滤高频噪声。这样能给 MAX485 提供一个稳定干净的 5V总线的信号质量会明显好一些。电源隔离之后注意地线也要分开。我把 MCU 侧的地叫 GND隔离侧的地叫 ISO_GND。光耦的第 5 脚、上拉电阻的参考地、MAX485 的 GND、隔离电源的输出负端全部接到 ISO_GND 上绝不能和 MCU 侧 GND 有任何电气连接。3.2 发送方向MCU TXD 经过 6N137 再到 MAX485 的 DI发送通路的目标很明确MCU 发出的 TTL 电平经过 6N137 隔离后送到 MAX485 的 DI 引脚。电路连接顺序是MCU TXD - 限流电阻 - 6N137 输入侧 LED然后 6N137 输出 VO - 上拉电阻 - MAX485 的 DI。限流电阻的计算很简单欧姆定律就够。假设 MCU 侧是 5V6N137 输入 LED 压降 VF 约 1.5V选择正向电流 IF 为 10mA那限流电阻就是 (5 - 1.5) / 0.01 350Ω取标称值 330Ω 就行。如果 MCU 侧是 3.3V那就是 (3.3 - 1.5) / 0.01 180Ω取 180Ω 或 200Ω 都行。注意电流不要给太大超过 20mA 会缩短光耦寿命太小又会导致输出侧无法可靠翻转。在数据速率较高时输入电流稍微给大一点是有好处的。我习惯把 IF 定在 8mA 到 12mA这样光耦内部的检测器能更快饱和输出边沿更陡。你如果用的是 3.3V 系统也尽量别把电阻选得太大180Ω 到 220Ω 之间是比较稳妥的范围。输出侧的上拉电阻我推荐 1kΩ 到 4.7kΩ。输出侧 5V 供电时上拉电阻越小输出沿越陡但功耗也越大。1kΩ 上拉高电平时候的静态电流约 5mA对隔离电源来说还能接受波形也足够好如果波特率只有 9600那用 4.7kΩ 也能跑得很稳功耗还能降一些。要是你做的是 460800 这种高速率1kΩ 甚至 470Ω 都得考虑上。3.3 接收方向MAX485 的 RO 经过光耦回到 MCU RXD接收方向和发送方向是镜像的关系MAX485 的 RO 输出 TTL 电平经过 6N137 隔离后回到 MCU 的 RXD。连接顺序是MAX485 RO - 限流电阻 - 6N137 输入侧 LED然后 6N137 输出 VO - 上拉电阻 - MCU RXD。接收路的限流电阻计算和发送路一模一样唯一要注意的是 RO 输出高电平时的驱动能力。RO 输出能力不算强但还是能轻松驱动 10mA 的 LED 电流所以按同样的参数选电阻没问题。我一般发送和接收两路都用一样的 330Ω 限流电阻和 1kΩ 上拉这样备料方便调试时候也不容易搞混。这里的 6N137 上拉电阻一定要接不接的话 VO 开漏输出只能拉低不能拉高MCU 的 RXD 会一直收到低电平。另外上拉电阻的另一端要接 5V也就是隔离侧的 VCC不是接 MCU 侧电源。很多新手在这里接错导致输出电压范围不对信号无法识别。还有一个容易忽略的细节6N137 输出信号和输入信号是反相的。也就是说输入侧 LED 导通时VO 输出低电平输入侧 LED 截止时VO 输出高电平。这意味着如果直接用光耦输出接 MAX485 的 DI发送数据会被反相一次总线上的电平逻辑就和预期相反了。处理办法有两种。第一种是在逻辑设计时直接接受反相比如你把 MCU 的 TXD 经反相后的信号接到 DI那总线上看到的其实是原始数据的反相信号需要软件层再翻转回来。第二种是我更推荐的做法利用 6N137 内部的输出级在输入输出之间本就存在反相的情况下想办法在接收端再把信号翻转回来。实际上很多 6N137 应用电路里输入信号会先经过一个缓冲器或在输出端加反相器来做信号整理。但这样会增加器件。更常见的电路是发送方向用两个 6N137 或者一个 6N137 加反相器或者干脆接受“输入和输出反相”的事实在 MCU 侧把 TXD/RXD 的极性用软件或硬件配合处理。听起来绕实际操作起来最省心的办法是在光耦输入侧 LED 的接法上做文章——把 LED 的阳极和阴极连接方式颠倒过来配合上拉电阻就能让 6N137 的输出与输入同相。具体的说正常接法是阳极接限流电阻至 TXD阴极接 GND如果 TXD 空闲为高LED 不导通输出上拉为高那信号其实是同相的。等一下这里要特别说清楚因为很多人在这一步就乱了。我们来捋一下6N137 输入侧LED 导通时输出 VO 为低LED 截止时输出 VO 为高。如果输入信号是高电平限流电阻串在 LED 阳极阴极接地那高电平时 LED 两端压差大LED 导通输出为低——这就是反相。如果我把 LED 反向连接阳极接 GND阴极通过限流电阻接 TXD那高电平时同样 LED 两端压差存在LED 导通输出还是低——仍然反相。所以只靠改变 LED 极性无法改变输出反相这个特性。那怎么办除了加反相器还有一个常用方案发送方向用一路 6N137 给 DI一路 6N137 给 DE而在 DE 的逻辑设计时接受反相。对于接收方向RO 输出接到光耦输入光耦输出再接 MCU同样反相。所以最稳妥的做法是在光耦输出后加一个反相器或者缓冲器把信号正过来。工程上很多人偷懒不做反相修正然后靠调试软件把逻辑反过来但这个做法在总线有多个设备时会非常痛苦我强烈不建议。我实际使用的方案是在 6N137 输出 VO 和 MAX485 DI 之间串一个 74HC04 反相器或者直接用三极管搭一个反相器。接收侧同样RO 先经过光耦隔离再经过一个反相器后接 MCU RXD。这样逻辑清晰发送和接收都是正的调试时少掉一堆问题。74HC04 是 5V 供电速度和功耗都没问题多出来的成本也就几毛钱。3.4 DE/RE 控制半双工收发切换到底怎么接才稳半双工 RS485 最核心的控制就是 DE 和 RE。MAX485 的 DE 高电平使能发送RE 低电平使能接收实际电路中经常把这两个脚短接用同一个信号控制高电平发送、低电平接收。剩下的问题是这个控制信号从哪里来要不要隔离如果你用的是 MCU 的一个独立 IO 引脚做方向切换那必须把这个 IO 也经过一路 6N137 隔离否则就破坏了整条链路的隔离。多了这一路光耦就多一份成本但换来了完全可控的收发时序。对于高波特率或者一主多从的复杂协议这个方法最稳我一直推荐这种方式。如果不想多占一个 IO可以用自动收发电路。简单版的做法是把发送数据经过光耦后的信号反相接到 DE同时把 DI 固定接低电平。这样总线空闲时 TXD 为高光耦输出也为高反相后 DE 为低进入接收模式起始位到达时 TXD 拉低光耦输出拉低反相后 DE 拉高开始发送起始位低电平驱动总线。问题在于数据位里一旦出现高电平TXD 变高DE 立刻回低总线就进入接收状态靠外部偏置电阻维持高电平。这种做法的优点是省 IO、省一路光耦缺点是发送数据中的“1”是靠电阻“撑”出来的速度一高就容易畸变。实测在 9600 波特率下还能用上了 115200 就非常勉强波形质量不忍直视。还有一种我试过更稳妥的自动收发方案发送数据触发放大器用 RC 延时让 DE 保持高电平一段时间直到一帧数据发完再变低。这个电路比单纯反相复杂一些需要三极管、电阻电容但在 115200 波特率下也能跑出不错的波形。不过电路调试麻烦不如直接用独立 IO 控制来得干脆。我的经验是如果 MCU 还有富余 IO一定用独立 IO 方案只有 IO 实在紧张才考虑自动收发而且尽量别跑高速。3.5 终端电阻和偏置电阻数值怎么算才合适RS485 总线的传输线特性阻抗一般是 120Ω所以在总线的两端各并联一个 120Ω 电阻用来吸收信号反射。这个电阻非常重要总线长度超过几米后不接终端电阻波形会出现振铃导致误码。但要注意终端电阻只加在总线的物理两端而不是每个节点都加。如果你是一条短距离、只有两三个设备的测试环境不加终端电阻也能工作可一旦距离拉长问题就会冒出来。偏置电阻的作用是保证总线空闲时 A、B 之间有明确的电平。A 上拉到 VCC、B 下拉到 GND会让空闲时 A 比 B 高。RS485 规定 A-B 大于 200mV 表示逻辑 1所以偏置电阻的设计目标就是要让空闲差分电压明显大于这个阈值。偏置电阻的取值和终端电阻有关。如果总线两端都有 120Ω 终端电阻那么偏置电阻等效到差分上的负载大约是 120Ω 并联 120Ω等于 60Ω。假设你用的偏置电阻是 1kΩA 上拉 1kΩ、B 下拉 1kΩ那么从 VCC 到 GND 的等效路径是 1kΩ 60Ω 1kΩ总电流约 2.48mA在 60Ω 上产生的差分电压约 0.15V不够 200mV。换 470Ω 的话等效路径是 470 60 470总电流约 5mA60Ω 上电压约 0.3V够用了。所以我建议如果总线上有两个 120Ω 终端电阻偏置电阻选 470Ω 到 680Ω如果只在一端加了终端电阻或者没有终端电阻那 1kΩ 到 4.7kΩ 的偏置也能给出足够的空闲差分电压。偏置电阻太小功耗会变大太大空闲电平又可能撑不住要平衡着选。实际调试时用万用表量 A-B 电压是最快的验证手段。正常状态下总线空闲时 A 相对 B 应该有几百毫伏的正电压比如 200mV 到 500mV 之间。如果测量值接近 0 或者为负说明偏置电阻可能没接对或者 A/B 线接反了。4. 从原理图到实物调试过程中那些值得记录的经验4.1 上电之前先检查这几处能避开九成的低级问题画完板子或者焊完洞洞板不要急着上电我有几个固定的检查顺序每次都能提前揪出问题。先看电源。隔离电源的输入和输出绝对不能短路MCU 侧 GND 和隔离侧 ISO_GND 之间用万用表蜂鸣档量一遍应该是开路。如果短路说明 PCB 布局或焊接哪里出了问题立刻查清楚再上电。再看 6N137 的供电和接地。第 8 脚接隔离后的 5V第 5 脚接 ISO_GND第 7 脚使能脚有没有接好如果是常通模式应该直接接地。第 6 脚的上拉电阻是否接到 5V 而不是接到 GND这几个点都查一遍光耦部分基本就稳了。然后看 MAX485 的 RE/DE。这两个脚如果短接控制确认控制电平逻辑别把发送和接收接反了。A、B 两个引脚到总线连接器的极性也要顺着走线看一遍。我犯过最蠢的错误是 A/B 两根线在端子处接反导致整个网络所有设备都通讯失败排查了半小时才发现。最后看终端电阻和偏置电阻。总线上如果已经有两个 120Ω 电阻那你的板子作为中间节点时就不该再焊 120Ω否则负载太重信号幅度会被拉低。如果只是点对点测试板子上可以先不焊终端电阻用一个外部 120Ω 电阻在总线远端做实验。4.2 示波器怎么看教你快速判断波形到底健不健康示波器是调试 RS485 最得力的工具。上电后先用万用表确认各点静态电平然后再用示波器看动态波形。先把探头夹在 MAX485 的 DI 引脚上让 MCU 循环发送一组数据比如 0x55也就是二进制 01010101。这时候 DI 上应该能看到 0 到 5V 的方波频率和波特率一致。如果 DI 波形有台阶、边沿不陡多半是光耦输入电流不足或者上拉电阻选太大。再把探头移到 A 和 B 之间用差分方式测量或者直接用两个探头分别看 A、B 对 ISO_GND 的波形。发送 0x55 时A 和 B 应该是相反的方波差分电压在正负几伏之间摆。空闲时A 对 ISO_GND 是高电平B 是低电平A-B 的差值应该有 200mV 以上这是偏置电阻在起作用。看波形时重点关注边沿有没有过冲和振铃。如果上升沿顶上有一个明显的“包”多半是缺少终端电阻或者终端电阻位置不对。振铃严重时在总线末端加一个 120Ω 电阻波形立刻会平缓很多。还要注意低电平部分的毛刺如果发送停止时总线电压跳来跳去那说明偏置太弱空闲电平没有锁住。把偏置电阻减小一些或者检查终端电阻是否过多就能解决。4.3 逻辑分析仪和串口工具配合定位是硬件问题还是协议问题很多时候单看波形不能立刻判断是硬件问题还是通信参数问题。我习惯在 MCU 的 TXD 和 RXD 引出测试点用逻辑分析仪同时抓 MCU 发出的原始数据和接收到的返回数据。如果 MCU 发出的数据波形正常但总线上抓不到对应波形那问题出在发送链路的光耦或 MAX485 的 DE 控制上。用万用表量 DE 脚电平确认发送时 DE 确实是高电平。如果发送时 DE 一直是低说明方向控制逻辑反了或者光耦输出没有切换。如果总线波形正常但 MCU 的 RXD 收不到数据或者收到乱码那问题多半在接收链路的光耦或者 MCU 串口配置上。检查 6N137 的输出是否反相、上拉是否正常、RXD 引脚的电平是否空闲时为高。串口调试助手发一组连续数据比如 0x55 或 0xAA观察返回的字节和发送的是否一致。如果只是偶尔错一位大概率是波特率偏差或者波形边沿不够陡如果整个字节全错那基本是电平反相或者 A/B 接反了。用这种“二分定位”的方法一套链路很快就能查清。5. 常见问题速查与排查实录照着这套思路走能省很多时间5.1 通讯乱码、数据错位先检查这三处通讯乱码是 RS485 调试里最磨人的问题。我在实际项目里总结了一套排查顺序按这个顺序走大多数问题能找到根源。第一查地线和隔离。如果隔离电源没加或者隔离地被人为短接了那共模干扰会直接灌进来解决方式就是彻底把两边地分开。第二查终端电阻和偏置电阻。总线过长没加终端电阻波形反射会造成误码总线过短而终端电阻加太多信号幅度被拉低也会误码。第三查波特率和时钟精度。RS485 通讯双方的波特率误差不能太大尤其是用了内部 RC 振荡器的 MCU温度一变化频率就漂连续发长帧数据时就会错位。我调过一块板子9600 波特率完全正常换到 115200 就乱码后来发现 MCU 内部时钟精度根本不够换成外部晶振就解决了。5.2 6N137 输出电平不对、无法翻转多半是这几个原因如果 6N137 的输出一直卡在高电平或者一直卡在低电平最常见的原因有三个输入侧电流不够、上拉电阻没接、使能脚没处理。输入侧电流不够时LED 亮度不足输出级检测器无法可靠导通VO 一直通过上拉电阻保持高电平。用万用表量 6N137 第 2、3 脚之间的电压正常应该能看到约 1.5V 左右的 LED 压降如果电压接近 0 或接近电源电压说明电流路径有问题。输出一直为低通常是上拉电阻没接或者接错了位置。6N137 输出是开漏没有上拉就永远拉不高。另外如果使能脚接了高电平在低有效使能的型号上输出会被禁用也会出现异常。把第 7 脚直接接地确认输出使能再用逻辑分析仪测量输出端在输入变化时是否翻转。5.3 波特率上不去波形畸变问题可能出在电阻而不是光耦6N137 标称 10MbpsMAX485 也能跑 2.5Mbps按道理 115200 波特率很轻松。但如果你发现一上 115200 就出错波形上升沿变得很缓那问题往往出在光耦输出侧的上拉电阻和输入侧的限流电阻上。上拉电阻太大的话输出级的寄生电容充电慢上升沿就会变缓。比如 10kΩ 上拉在 9600 波特率下没问题到 115200 就可能不行。换成 1kΩ 或 470Ω边沿立即变得陡峭。输入侧限流电阻太大LED 电流太小光耦内部的检测器动作慢也会拖慢整体速度。所以做高速率时输入电流建议给到 10mA 以上上拉电阻尽量往 1kΩ 以下选牺牲一点点功耗换可靠性非常值。另一个常被忽略的因素是 MAX485 的 DE 切换速度。如果你用的是自动收发电路DE 在数据位期间频繁切换会导致部分数据没驱动到总线波形少了一段。换成独立 IO 控制 DE并把 DE 切换放在数据位之间的停止位附近问题马上就没了。5.4 MAX485 发热严重说明总线处于异常冲突状态MAX485 正常工作时几乎不发热如果摸上去烫手那一定有问题。最常见的原因是 DE 和 RE 的逻辑接反了导致芯片一直处于发送状态同时总线上又有其他设备在发数据两边对拉电流剧增芯片自然发热。还有一种情况是总线短路。A 或 B 对地短路、A 和 B 之间短路都会让驱动级长时间输出大电流。用万用表在断电状态下量 A、B 之间电阻正常应该是 120Ω 左右或者更高取决于终端电阻。如果接近 0Ω说明线缆或 PCB 上有短路点。总线冲突也要排查。总线上如果多个设备同时满足发送条件就会发生冲突。检查每个从机的 DE 控制逻辑确保只有主机轮询到它时才允许发送。我见过有人把从机的 DE 直接接高等于一直占着总线其他设备一发言就冲突整个网络废掉。5.5 自动收发电路在低速时正常高速时乱跳这是通病自动收发电路在 9600 波特率下能正常工作不代表在 115200 下也能。我前面讲了简单的反相自动收发电路在数据位 1 时会释放总线靠偏置电阻维持高电平速度一高总线电容影响变大电平建立时间不够接收端就可能会把 1 读成 0。如果你实在想用自动收发建议把偏置电阻调小一些比如 470Ω让总线在空闲和释放期间的电平建立更快。或者换带自动方向控制的收发器像 MAX13487 这类芯片内部就能根据发送数据自动管理 DE不需要外部光耦参与方向切换但要注意它也需要和光耦隔离配合。我的建议是项目如果对通讯稳定性要求高别在自动收发上花太多时间老老实实多留一个 GPIO 做方向控制这是最可靠的路。5.6 总线接口的防护电路别等烧了板子再后悔最后提一个很多人忽略的细节RS485 总线是暴露在外部环境中的尤其是户外走线静电、浪涌、雷击感应都可能从 A/B 线串进来。光耦隔离能隔断地环路但不能完全挡住外部强干扰直接打到 MAX485 上。所以在 A、B 线上加防护器件很有必要。我常在 A、B 对地之间并两个 TVS 管比如 SMBJ6.0CA把瞬态电压钳位在安全范围A、B 之间也可以并一个双向 TVS。再在总线入口串两个自恢复保险丝或者小阻值电阻限制过流损坏。这样做之后MAX485 的故障率大幅下降。当然光耦隔离的耐压在 2500Vrms 以上但这不意味着总线侧的强干扰不会击穿器件防护始终要做足。写到这里我想起自己第一版 RS485 隔离开发板调试时的情景波形七扭八歪数据十发九错最后发现是光耦输出上拉电阻用到了 10kΩ加上 DE 控制逻辑没理顺两个问题叠在一起白折腾了两天。后来把上拉降到 1kΩ、DE 用独立 IO 控制整个链路立马稳定下来。如果你也在搭类似电路遇到怪问题时别急着换芯片先把电源隔离、光耦输入输出电流、DE 逻辑、终端偏置这四件事过一遍九成问题都在里面。6N137 加 MAX485 这套方案本身很成熟参数给对、地线隔离干净、方向切换不出错它的稳定性会让你省心很久。
