环境与输出均已脱敏:设备型号、主机名抽象为占位符;SoC 型号与 MMIO 地址为公开手册数据,保留作定位依据。

环境:工控机(TI AM64x 系列异构 SoC:Cortex-A53 跑 Linux,Cortex-R5F 跑 RTOS),24V 工业电源供电,引出三线制 RS-232(TXD/RXD/GND)。调试侧为笔记本 + USB 转 RS-232 适配器。

电平定性(第一步)

万用表直流档,表笔接信号对 GND:

工控机 TXD — GND:-5.7V    ← 负逻辑空闲电平,RS-232 无疑
工控机 RXD — GND:0V       ← 输入端悬空,正常
适配器 TXD — GND:-5.6V    ← 适配器同为 RS-232 电平

RS-232 空闲电平为 -3V ~ -15V;TTL 空闲为 +3.3V,绝不会出现负压。3.3V TTL 模块严禁直连此端口——-5.7V 负压会击穿普通 TTL 芯片的 GPIO。

接线按交叉原则:适配器 TXD → 工控机 RXD,适配器 RXD → 工控机 TXD,GND 共地。

现象

串口助手 115200 8N1,三线全接,持续刷乱码,无法交互。乱码有规律(大量 F7 F7 ... FF 00 重复模式,非随机字符)。

反常点随排查逐一浮现:

  1. 两台同型号工控机现象完全一致
  2. 工控机侧能收到 PC 发的明文(SSH 内 cat /dev/ttyS2 可见)
  3. 后期拆线排查:两线组合(RXD+GND / TXD+GND)乱码依旧;拆到单线,任接一根乱码持续、断开即停。其中仅接 GND 也乱码是转折点——地线不承载信号,本不该"收到"任何数据

关键证据:Linux 侧计数器观测

工控机可经 SSH 登录 Linux,无需盲测。内核串口驱动自带现成的观测点。

1. 控制台绑定:

cat /proc/cmdline | grep -o 'console=[^ ]*'
# console=ttyS2,115200n8

2. UART 枚举与域分析(dmesg):

4a00000.serial: ttyS0  ← MCU 域,归 R5F/M4 实时核
4a10000.serial: ttyS1  ← MCU 域
2800000.serial: ttyS2  ← MAIN 域,A53 Linux 主控制台
2810000~2860000: ttyS3~ttyS8  ← MAIN 域扩展,tx:0 rx:0 未使用

异构 SoC 的串口分属不同电源域:MCU 域串口归实时核,Linux 无权访问。定位物理端口归属时必须先分域。

3. 驱动级收发计数器:

cat /proc/tty/driver/serial | grep '2:'
# 2: uart:8250 mmio:0x02800000 irq:314 tx:2132 rx:296 fe:55 RTS|DTR
  • tx:2132——内核已输出 2132 字节开机日志

  • rx:296——已接收 296 字节(含 PC 敲击与悬空噪点)

  • fe:55——55 次帧错误,乱码的物理层体现(采样时未检测到合法停止位)

4. 双向通道验证:

# 设备 → PC 方向:SSH 内主动发一行明文
stty -F /dev/ttyS2 115200 raw -echo
echo "=== HELLO FROM DEVICE ===" > /dev/ttyS2
cat /proc/tty/driver/serial | grep '2:'
# tx: 2132 → 2158 → 2184,每次精确 +26 字节

tx 计数随 echo 精确增长 → 设备发送通道硬件正常(示波器同步验证:发送时 TXD 出现等间距的明显电平跳变,停止发送即消失)。

# PC → 设备方向:串口助手发 HELLO_PC\n,SSH 内 cat /dev/ttyS2
ELLO_PC
HELLO_PC
ELLO_PC

rx 计数 296 → 348(+52),fe 不再增长,设备收到明文(首字节偶有丢失,见要点)→ 波特率 115200 绝对正确(若频偏不可能收到完整明文)。

矛盾锁定:软件配置正确 + 双向硬件通道正常 + 适配器自环正常 + 两台设备复现,但 PC 端就是乱码。问题收敛到两端地系统之间的电气层。

假设与验证

#假设验证结果结论
A波特率/帧格式不匹配穷举 9600~230400 × 8N1/8N2/8E1/7E1全部乱码排除
B适配器故障适配器 TXD-RXD 自环短接发什么收什么排除
C工控机个体故障两台同型号复测 + 示波器看波形现象一致,波形正常排除
D接线/引脚定义错误万用表在线测两端 TXD 对 GND双方均约 -5.7V 负压排除
E共地干扰/地环路拔掉笔记本电源适配器,改电池供电乱码立即消失,双向明文恢复确认根因

E 的验证成本最低(10 秒),却排在最后——直觉上"乱码 = 波特率问题"太强,先穷举了一整轮参数。单线乱码早中期就出现过,当时被"悬空输入噪声"解释打发:信号线悬空拾噪,无需理会。软件层全部排除后回头拆线排查,拆到仅剩 GND 仍乱码——地线不承载信号,“接上地线就收到数据"无法再用悬空噪声解释,干扰只能顺这根地线传导。反常现象要么被证伪,要么就该升级为头号嫌疑,而不是被貌似合理的解释掩埋。

根因

24V 工业开关电源与笔记本市电适配器之间存在地环路(共模电位差)。两端地电位不一致时,工频漏电流通过串口线持续平衡,PC 端适配器的 RX 采样参考(GND)随之地电位漂移,-5.7V 的正常电平被误判为乱码。

两个佐证现象:

  • 不对称性:工控机侧 RS-232 芯片(工业级)接收阈值稳、24V 电源内阻低,能扛住共模抖动;PC 端非隔离适配器采样电路脆弱,先崩的是它——所以"设备收得到、PC 收不到”

  • 人体天线效应:拔电改电池后,手摸适配器铁壳/USB 线又出乱码,松手恢复。电池供电的笔记本是悬浮地(高阻态),人体携带的工频感应杂波经电容耦合注入悬浮地,GND 一抖压差就乱;而手摸工控机外壳无影响——24V 工业电源构成"强地",微安级人体感应电荷如水滴入海

修复方案

方案一治本(推荐);二、三为等不及采购时的应急手段。

方案一:双隔离 USB 转 RS-232 转换器(治本 · 推荐)

选型三要件,缺一不可:

  1. 速率达标:明确支持 115200 bps 及以上。低速光耦(PC817 级)带宽只到 38400,需选高速光电隔离、磁耦或数字隔离方案
  2. 真双隔离:信号隔离(隔离芯片)+ 电源隔离(独立 DC-DC 模块,标称隔离电压 2500Vrms)。只有信号隔离没有电源隔离的是假隔离——地线依然连通
  3. 主控芯片:优先 FT232RL / CP2102,高波特率时钟准、Linux 兼容性好;避开 PL2303/CH340(仿冒芯片多,高波特率时钟偏差大)

隔离带从物理上切断两端地系统——原理上对插电笔记本、台式机、人体感应等所有共地场景免疫。

实测验证:按上述三要件采购了一款双隔离转换器(光电信号隔离 + DC-DC 电源隔离,隔离电压 2500Vrms,速率 300–460800bps,RS-232 端 600W 浪涌 + ±15kV 静电保护,USB 总线供电)。笔记本**插电(市电)**直连工控机:双向明文正常,无任何干扰——此前"插电即乱码"的场景彻底消失。

方案二:笔记本电池供电(应急验证)

拔掉电源适配器即可恢复通信。适合短期调试,但悬浮地易受人体天线干扰(手摸金属即乱码),且笔记本续航有限。

方案三:等电位连接(应急 · 风险高,先测后接,顺序严格)

第 0 步(强制):先用万用表 AC 档测两端地之间的电位差——表笔分别接工控机金属外壳(或 24V 电源 V-)与笔记本/台式机金属机壳(或 USB 外壳):

电位差 < 数伏      → 漏电流小,可按下列顺序等电位连接
电位差达数十伏     → 放弃共地,改用方案二/方案一
                    (强行短接 = 大电流瞬间流过,烧板风险)

电位差决定短接瞬间的电流——测量是唯一的 go/no-go 安全阀,跳过等于盲接。

确认在安全范围后,用一根较粗导线(勿用杜邦线)先连通两端机壳/地,再接信号线:

1. 粗线:工控机金属外壳 ←→ 笔记本/台式机金属机壳(螺丝孔)
2. 确认粗线压实后,最后插 TXD/RXD/GND 三根信号线
3. 拆卸反序:先拔信号线,最后拆粗地线

风险:现场漏电流大时(大电机启动、电源漏电),电流全走这根线;线松动或电阻偏大的瞬间,电流改道信号线,可能击穿 USB 转接芯片甚至烧毁主板。只能应急,不可长期

验证

# 拔掉电源适配器(电池供电),SSH 内循环发送
while true; do echo "1234567890" > /dev/ttyS2; sleep 1; done

# PC 串口助手 HEX 模式,每秒一行
31 32 33 34 35 36 37 38 39 30 0A

# PC 发送 HELLO_PC\n → SSH 内 cat /dev/ttyS2
HELLO_PC

双向明文恢复,fe 计数不再增长。换用双隔离转换器后插电场景同样稳定,故障期间偶发的首字节丢失也随之消失——问题闭环。

要点

  • 万用表电压定性串口电平是最快手段:TXD 对 GND 稳定负压(-3 ~ -15V)= RS-232,+3.3V = TTL;TTL 模块严禁直连 RS-232 负压端口

  • 串口乱码 ≠ 波特率错误。穷举参数前先做三件事:拆线测试(拆到仅剩 GND 仍乱码 = 干扰走地线传导,直指共地问题)、看乱码模式(F7 FF 型规律重复 = 噪声拾取而非波特率失配)、看内核计数器(rx 增长 = 物理送达)

  • 反常现象别被貌似合理的解释打发:信号线单接乱码曾被"悬空噪声"掩盖,拆到仅接 GND 仍乱码(地线不承载信号)才戳破误读

  • /proc/tty/driver/serial 的 tx/rx/fe 计数器是内核级零成本观测点:rx 增长证明物理送达,fe 不增长证明帧完整——比串口助手直观可靠

  • 异构 SoC(A53 + R5F)的串口分属 MCU/MAIN 电源域,dmesg 的 MMIO 地址对照手册可定位归属;MCU 域串口 Linux 无权访问

  • 工业设备(24V 开关电源)与消费电子(市电适配器)对接,地环路应是默认怀疑项;“拔电源改电池"是 10 秒验证法

  • 悬浮地系统对人体电容耦合极敏感:手摸铁壳乱码 = 地系统高阻悬浮的标志

  • 首字节丢失(HELLO_PCELLO_PC)故障期间被归为"起始位同步抖动、非故障”,换隔离转换器后彻底消失——实为残余共模干扰对起始位采样的扰动。连"能自愈、看似无害"的异常也可能是根因的轻度症状,修复后对照复测才能定性

  • 等电位连接前先测两端地电位差(AC 档),达数十伏即放弃共地;此法只能应急,有烧板风险

  • 长期方案只有双隔离转换器(信号 + 电源双隔离,115200+ 速率),已实测验证