串口通訊出現亂碼是嵌入式開發常見痛點。本文系統歸納四大核心原因與對應解決方案,並提供實戰除錯檢查清單。
| # | 原因 | 典型徵兆 | 解決方案 |
|---|---|---|---|
| 1 | USB 轉串口晶片品質差 | 換機器/換線即好;廉價 CH340/PL2303 晶片易掉包、時序不穩 | 改用原廠 FT232RL、CP2102 或工業級轉接器 |
| 2 | 波特率不匹配/誤差過大 | 雙方設定相同但實際頻率偏差 >2%,高波特率更明顯 | 檢查單片機波特率公式、晶振頻率、UART 分頻係數;必要時降低波特率 |
| 3 | 高波特率下訊號完整性不足 | 38400 正常,115200 亂碼;長線、無屏蔽、接地不良 | 縮短線長、加屏蔽線、降低波特率、加收發緩衝、檢查終端電阻 |
| 4 | 單片機系統時鐘配置錯誤 | Boot 設定主頻 60MHz,C 代碼 UART 初始化用 40MHz 計算波特率 | 統一系統時鐘來源;SystemCoreClockUpdate();重新初始化 UART |
// Boot 汇编设定主频 60MHz
// C 语言串口初始化却按 40MHz 计算分频
// 导致实际波特率 = 设定值 * 40/60 = 设定值 * 2/3
// 解决:在 C 代码开头同步系统时钟
SystemInit(); // 或手动设置 PLL、时钟分频
SystemCoreClockUpdate(); // 更新 SystemCoreClock 变量
UART_Init(SystemCoreClock, 115200); // 使用正确时钟
亂碼
│
├─ 換 USB 轉串口 → 好? → 是:硬體問題 ✓
│
├─ 降低波特率 (9600) → 好? → 是:訊號完整性/時鐘誤差 → 檢查線材/時鐘
│
├─ 短接 TX/RX 自收自發 → 好? → 否:MCU UART 硬體/驅動問題
│
└─ 示波器量測實際波特率 → 與設定值偏差 >2%? → 是:重新計算分頻係數/校準時鐘
亂碼本質是收發雙方時序不同步。由易到難排查:硬體(轉接器、線材)→ 參數(波特率、資料位、停止位、奇偶校驗)→ 時鐘(主頻、PLL、分頻)→ 協定(幀同步、流控、校驗)。善用示波器量測實際波形是終極利器。