環境與輸出均已脫敏:裝置型號、主機名稱抽象為佔位符;SoC 型號與 MMIO 位址為公開手冊資料,保留作定位依據。
環境:工控機(TI AM64x 系列異構 SoC:Cortex-A53 跑 Linux,Cortex-R5F 跑 RTOS),24V 工業電源供電,引出三線式 RS-232(TXD/RXD/GND)。除錯側為筆電 + USB 轉 RS-232 轉接器。
電位定性(第一步)
三用電表 DC 檔,測棒接訊號對 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+ 速率),已實測驗證