环境与输出均已脱敏:设备型号、主机名抽象为占位符;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 重复模式,非随机字符)。
反常点随排查逐一浮现:
- 两台同型号工控机现象完全一致
- 工控机侧能收到 PC 发的明文(SSH 内
cat /dev/ttyS2可见) - 后期拆线排查:两线组合(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 转换器(治本 · 推荐)
选型三要件,缺一不可:
- 速率达标:明确支持 115200 bps 及以上。低速光耦(PC817 级)带宽只到 38400,需选高速光电隔离、磁耦或数字隔离方案
- 真双隔离:信号隔离(隔离芯片)+ 电源隔离(独立 DC-DC 模块,标称隔离电压 2500Vrms)。只有信号隔离没有电源隔离的是假隔离——地线依然连通
- 主控芯片:优先 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_PC→ELLO_PC)故障期间被归为"起始位同步抖动、非故障”,换隔离转换器后彻底消失——实为残余共模干扰对起始位采样的扰动。连"能自愈、看似无害"的异常也可能是根因的轻度症状,修复后对照复测才能定性等电位连接前先测两端地电位差(AC 档),达数十伏即放弃共地;此法只能应急,有烧板风险
长期方案只有双隔离转换器(信号 + 电源双隔离,115200+ 速率),已实测验证