<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>RS485 on Zero Day Notes</title>
        <link>https://blog.5772447.xyz/tags/rs485/</link>
        <description>Recent content in RS485 on Zero Day Notes</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh</language>
        <lastBuildDate>Sun, 27 Sep 2026 15:30:00 +0800</lastBuildDate><atom:link href="https://blog.5772447.xyz/tags/rs485/index.xml" rel="self" type="application/rss+xml" /><item>
            <title>产线数据采集网关为何每隔几小时集体掉线？一次 RS485 总线干扰与看门狗误动作的排查记录</title>
            <link>https://blog.5772447.xyz/posts/10494fcc/</link>
            <pubDate>Sun, 27 Sep 2026 15:30:00 +0800</pubDate>
            <guid>https://blog.5772447.xyz/posts/10494fcc/</guid>
            <description>&lt;h2 id=&#34;问题背景&#34;&gt;&lt;a href=&#34;#%e9%97%ae%e9%a2%98%e8%83%8c%e6%99%af&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;问题背景&#xD;&#xA;&lt;/h2&gt;&lt;p&gt;工厂二期产线部署了 12 台基于 ARM Cortex-M4 的 Modbus RTU 采集网关，挂接在同一条 RS485 总线上，负责把变频器、温控仪、电表的数据汇总上传到 MES。这批网关是两年前随产线改造一起上的，运行一直平稳，是车间数据链路的&amp;quot;沉默后台&amp;quot;。&lt;/p&gt;&#xA;&lt;p&gt;9 月中旬开始，值班群里的掉线告警从偶尔一两台变成&amp;quot;成批出现&amp;quot;：每天 2～4 次，每次 3～6 台网关同时从 MES 上消失，30 秒到 2 分钟后自己恢复。设备部最初按&amp;quot;网络抖动&amp;quot;处理了两周，直到 9 月 24 日一次掉线正好赶上质检数据上传，导致该批次产品追溯记录缺失 40 分钟，事情升级为必修项。&lt;/p&gt;&#xA;&lt;h2 id=&#34;故障现象&#34;&gt;&lt;a href=&#34;#%e6%95%85%e9%9a%9c%e7%8e%b0%e8%b1%a1&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;故障现象&#xD;&#xA;&lt;/h2&gt;&lt;p&gt;到现场把日志口接上串口服务器后，故障画像逐步清晰：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;掉线是&amp;quot;集体事件&amp;quot;：每次同时掉 3～6 台，位置无规律，有时在总线中段，有时在末端，唯独挂在总线最前端、离主机柜最近的两台从没掉过。&lt;/li&gt;&#xA;&lt;li&gt;掉线前串口日志出现特征序列：先是一串 CRC 校验错误，随后收不到任何合法帧，十几秒后网关记录 &lt;code&gt;WATCHDOG RESET&lt;/code&gt; 并整机重启。&lt;/li&gt;&#xA;&lt;li&gt;重启后通信恢复，但 MES 侧该时间窗内的采集数据缺失，形成固定长度的&amp;quot;数据空洞&amp;quot;。&lt;/li&gt;&#xA;&lt;li&gt;MES 服务器与交换机侧无任何告警，网络链路 Ping 值稳定，排除了以太网层问题。&lt;/li&gt;&#xA;&lt;li&gt;时间规律隐约可见：掉线集中在白班生产高峰，夜班几乎不发生。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;排查过程&#34;&gt;&lt;a href=&#34;#%e6%8e%92%e6%9f%a5%e8%bf%87%e7%a8%8b&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;排查过程&#xD;&#xA;&lt;/h2&gt;&lt;p&gt;第一步先区分&amp;quot;是谁重启了网关&amp;quot;。收集 12 台网关的串口日志按时间对齐，发现所有掉线都走同一条路径：&lt;strong&gt;CRC 错误爆发 → 总线静默 → 看门狗复位&lt;/strong&gt;。这说明网络和 MES 都是无辜的，问题在 RS485 这一层——网关是因为&amp;quot;听不清总线&amp;quot;才自杀的。&lt;/p&gt;&#xA;&lt;p&gt;第二步分析 CRC 错误的时间戳。把一周内 4 次集体掉线的 CRC 错误起点拉出来对比，发现一个可疑规律：每次错误爆发前 2～3 秒，旁边配电柜的记录里都有 3# 变频器从待机进入运行的启停记录。白班高峰正是变频器频繁启停的时段，夜班变频器几乎满载恒速运行——这和&amp;quot;掉线集中在白班&amp;quot;的时间规律完全吻合。变频器启停瞬间的大电流突变（di/dt）会通过电磁耦合在并行敷设的 RS485 总线上感应出脉冲干扰，这条总线有约 40 米与动力电缆在同一桥架内平行走线，间距只有 10 厘米左右。&lt;/p&gt;&#xA;&lt;p&gt;第三步验证&amp;quot;为什么是网关自杀而不是单纯丢包&amp;quot;。正常情况下，RS485 收到坏帧只需丢弃重试，顶多损失一两个采样点，不该触发看门狗。拆开一台网关看固件逻辑，找到了第二个根因：固件的串口接收状态机在连续 CRC 错误时有一个缺陷——错误计数器累计但&lt;strong&gt;接收缓冲区的清空动作挂在了一次 DMA 传输完成中断之后&lt;/strong&gt;；当坏帧密集到一定程度，DMA 永远等不到&amp;quot;完整一帧&amp;quot;，缓冲区堆积溢出，主循环卡死在等待信号量上，喂狗线程跟着饿死，看门狗 15 秒后复位整机。也就是说，干扰只是诱因，固件的错误恢复缺陷才是把&amp;quot;干扰&amp;quot;放大成&amp;quot;整机重启&amp;quot;的真正推手。&lt;/p&gt;&#xA;&lt;p&gt;第四步解释&amp;quot;为什么最前端两台不掉线&amp;quot;。查线缆敷设图纸发现这两台所在的支路在桥架入口处有独立的金属隔板屏蔽，且距离变频器动力电缆最远——干扰强度分布的不均匀，正好解释了掉线设备位置的无规律中的规律。&lt;/p&gt;&#xA;&lt;p&gt;最后用示波器在总线端子上抓到了实锤：变频器启动瞬间，RS485 差分线上出现约 4V 的共模毛刺，远超 RS485 收发器 ±7V 的容忍裕度内的正常水平，与日志里的 CRC 爆发时刻逐次吻合。&lt;/p&gt;&#xA;&lt;h2 id=&#34;解决方案&#34;&gt;&lt;a href=&#34;#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;解决方案&#xD;&#xA;&lt;/h2&gt;&lt;p&gt;按&amp;quot;先治干扰源，再修恢复逻辑&amp;quot;的顺序执行：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;物理层整改（治本）&lt;/strong&gt;：RS485 总线与动力电缆交叉处改为垂直穿越、平行段套金属波纹管并可靠单端接地，把耦合干扰降到收发器容忍范围内；总线末端电阻核对了阻值（120Ω）并在整改后实测波形无反射毛刺。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;固件修复（治根因放大器）&lt;/strong&gt;：修复串口状态机的缺陷——把缓冲区清空从&amp;quot;DMA 完成后&amp;quot;提前到&amp;quot;检测到 CRC 错误立即执行&amp;quot;，并为喂狗线程加了独立的存活检测：即使主循环卡死，喂狗也不能停。新固件先在 2 台网关上灰度一周，CRC 错误依旧存在（干扰未完全消除前是正常的），但再没有触发过看门狗复位。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;监控补位&lt;/strong&gt;：MES 上为每台网关增加&amp;quot;CRC 错误率&amp;quot;指标，阈值 1%告警；把&amp;quot;看门狗复位&amp;quot;从普通日志升级为告警事件。这样以后干扰再抬头，看到的不再是&amp;quot;设备集体消失&amp;quot;，而是&amp;quot;错误率爬升&amp;quot;的渐进曲线。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;整改后连续观察两周：CRC 错误率从高峰期的 8% 降到 0.3% 以下，零看门狗复位，零数据空洞。&lt;/p&gt;&#xA;&lt;h2 id=&#34;根因分析&#34;&gt;&lt;a href=&#34;#%e6%a0%b9%e5%9b%a0%e5%88%86%e6%9e%90&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;根因分析&#xD;&#xA;&lt;/h2&gt;&lt;p&gt;直接根因是&lt;strong&gt;变频器启停的电磁干扰耦合进同桥架平行敷设的 RS485 总线，引发密集 CRC 错误&lt;/strong&gt;；叠加根因是&lt;strong&gt;网关固件错误恢复路径存在缺陷，把可恢复的坏帧放大成了缓冲区死锁、喂狗饿死、整机复位&lt;/strong&gt;。二者缺一不可：没有干扰，固件缺陷永远潜伏；没有缺陷，干扰只会损失几个采样点。位置分布的差异则由桥架屏蔽的不均匀解释。&lt;/p&gt;&#xA;&lt;h2 id=&#34;预防措施&#34;&gt;&lt;a href=&#34;#%e9%a2%84%e9%98%b2%e6%8e%aa%e6%96%bd&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;预防措施&#xD;&#xA;&lt;/h2&gt;&lt;ul&gt;&#xA;&lt;li&gt;新产线布线规范中明确：RS485/ CAN 等现场总线与动力电缆平行段必须间距 30cm 以上或加隔离屏蔽，验收时用示波器实测共模毛刺；&lt;/li&gt;&#xA;&lt;li&gt;嵌入式设备采购技术要求里加入&amp;quot;串口错误恢复逻辑评审&amp;quot;一项，重点审错误计数与缓冲区清理的耦合关系；&lt;/li&gt;&#xA;&lt;li&gt;所有挂看门狗的固件，喂狗线程必须独立于主循环的信号量体系；&lt;/li&gt;&#xA;&lt;li&gt;网关类设备统一上报 CRC 错误率与复位计数，纳入 MES 监控面板。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;总结&#34;&gt;&lt;a href=&#34;#%e6%80%bb%e7%bb%93&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;总结&#xD;&#xA;&lt;/h2&gt;&lt;p&gt;这次排查走了两周弯路，教训在于第一眼就把&amp;quot;网关掉线&amp;quot;当成了 IT 网络问题去查交换机和链路——而真正的故障链在物理层（干扰耦合）和固件层（错误恢复缺陷）两级。嵌入式设备的&amp;quot;集体异常&amp;quot;几乎总可以从三个维度收敛：谁重启了（日志对齐）、为什么重启（复位前的最后日志）、为什么是这几台（物理位置差异）。把这三个问题回答清楚，根因自然会浮出来。&lt;/p&gt;&#xA;&lt;h2 id=&#34;延伸阅读&#34;&gt;&lt;a href=&#34;#%e5%bb%b6%e4%bc%b8%e9%98%85%e8%af%bb&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;延伸阅读&#xD;&#xA;&lt;/h2&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://blog.5772447.xyz/posts/f691db9d/&#34; &gt;基于STM32的空气质量检测仪&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://blog.5772447.xyz/posts/c4f182e1/&#34; &gt;基于STM32的家庭气象站&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
        </item></channel>
</rss>
