最近想到幾年前目睹的一場「技術辯論」,至今仍覺得有趣。
A 同事(軟體工程師):「UART 跟 RS-232 差不多啊,不都是串列通訊嗎?」
B 同事(硬體工程師):「什麼差不多?這兩個明明就差很多,是完全不一樣的東西!」
當時我聽到的反應是:「這不是差不多的東西嗎?」畢竟在我的認知裡:
- 都叫 serial 通訊
- 都可以設定 baudrate(9600、115200...)
- 開發時都是透過電腦用 USB 轉 RS-232 接到開發板上
- 程式碼裡面都是叫它 UART
看起來根本就是同一件事啊?為什麼 B 同事會這麼激動?
記憶深處的疑惑
後來又想到以前學數位電路的時候,課本上似乎有提到:
- RS-232 好像有負電壓(-12V、+12V 之類的)
- UART 好像只有 0 和 1 的概念(TTL 電平)
這讓我開始懷疑:它們到底是一樣的東西,還是哪裡有點不一樣?
於是我決定花點時間把這個問題查個清楚。
查完資料後,我終於理解為什麼兩位同事會有完全相反的看法了:
從軟體角度看:基本沒有差別
從硬體角度看:天差地別
難怪 A 同事可以說得理所當然,卻又讓 B 同事氣得半死......
軟體工程師的視角:它們是一樣的
對軟體開發者來說,UART 和 RS-232 在程式碼層面幾乎完全相同:
1. 相同的 API
// 無論是 UART 還是 RS-232,程式碼都一樣
UART_Init(9600); // 設定 baudrate
UART_SendByte(0x55); // 發送資料
data = UART_ReceiveByte(); // 接收資料
# Python 的 serial library
import serial
ser = serial.Serial('/dev/ttyUSB0', 9600)
ser.write(b'Hello') # 不管底層是 UART 還是 RS-232
2. 相同的參數設定
- Baudrate:9600、115200...
- Data bits:7 或 8
- Stop bits:1 或 2
- Parity:None、Odd、Even
3. 相同的協議邏輯
起始位 → 數據位 → 校驗位 → 停止位
[Start][D0 D1 D2 D3 D4 D5 D6 D7][Parity][Stop]
對軟體工程師來說,作業系統和驅動程式已經把底層差異抽象化了,所以在程式碼層面根本感覺不到差異。
硬體工程師的視角:它們完全不同
但對硬體工程師來說,這兩者的差異就像「走路」和「開車」一樣明顯:
1. 電壓標準完全不同
| 項目 | UART (TTL) | RS-232 |
|---|---|---|
| 邏輯 0 | 0V | +3V ~ +15V |
| 邏輯 1 | 3.3V 或 5V | -3V ~ -15V |
| 電壓範圍 | 單電源 | 雙電源(正負電壓) |
注意:RS-232 的邏輯是反向的!負電壓代表 1,正電壓代表 0。
2. 傳輸距離差異
- UART:適合短距離(< 1 公尺),通常用於 PCB 板上或相鄰設備
- RS-232:可達 15 公尺,適合工業環境
3. 抗干擾能力
- UART:單端訊號,容易受干擾
- RS-232:較高電壓擺幅,抗干擾能力較強
4. 需要電平轉換晶片
如果你的微控制器(如 STM32、Arduino)使用 UART,但要連接到電腦的 RS-232 埠,就需要:
MCU (UART/TTL) → MAX232 晶片 → RS-232 (電腦)
3.3V 電平轉換 ±12V
MAX232 這類晶片的工作就是:
- 把 0-5V 轉換成 ±12V
- 把邏輯反向(0↔1)
實際開發場景
場景 1:Arduino 與電腦通訊
Arduino (UART/TTL 5V)
↓
USB 轉 TTL 模組 (CH340、CP2102)
↓
電腦 USB 埠
這裡沒有用到 RS-232,是純 UART 通訊。
場景 2:工業設備通訊
PLC (RS-232)
↓
DB9 連接器
↓
電腦 COM 埠 (RS-232)
這裡是真正的 RS-232,使用 ±12V 電壓。
場景 3:嵌入式開發板
STM32 開發板 (UART/TTL 3.3V)
↓
USB 轉 RS-232 模組 (內建 MAX232)
↓
電腦 USB 埠
這裡有電平轉換,從 UART 轉成 RS-232 再轉成 USB。
本質差異:協議 vs 標準
用一個簡單的比喻:
| 概念 | UART | RS-232 |
|---|---|---|
| 本質 | 通訊協議(怎麼說話) | 物理層標準(用什麼嗓門說話) |
| 比喻 | 說中文 | 用擴音器說中文 |
| 定義 | 數據格式、時序 | 電壓、連接器、線纜規範 |
UART 是一種協議,定義了:
- 如何把並列資料轉成序列資料
- 起始位、停止位、校驗位的規則
RS-232 是一種標準,定義了:
- 使用什麼電壓來表示 0 和 1
- 使用什麼連接器(DB9、DB25)
- 最大傳輸距離和速度
關鍵:RS-232 使用 UART 協議,但加上了特定的電氣特性。
為什麼會產生誤解?
軟體工程師的習慣
- 關注邏輯層和應用層
- 作業系統已經抽象化底層差異
- 程式碼看起來完全一樣
硬體工程師的習慣
- 關注電氣特性和物理層
- 需要選擇正確的元件(MAX232、連接器)
- 錯誤的電壓會燒毀晶片
日常用語的模糊
- 可能「USB 轉 RS-232」其實是「USB 轉 UART(TTL 電平)」
- 「串口通訊」可能指 UART、RS-232、RS-485...
- 開發板上寫的「UART」接腳,可能透過轉換晶片變成 RS-232
結論:都對,只是角度不同
回到最初的爭論:
A 同事(軟體)說「差不多」→ 對的
- 從程式碼角度,API 和協議邏輯完全相同
- 軟體開發時不需要關心電壓差異
B 同事(硬體)說「完全不同」→ 也對
- 從電路設計角度,電壓、元件、PCB 佈線都不同
- 接錯線可能會燒毀晶片
給工程師的建議
軟體工程師
- ✅ 理解底層物理差異有助於除錯硬體問題
- ✅ 知道為什麼有時需要「USB 轉 TTL」,有時需要「USB 轉 RS-232」
- ✅ 遇到通訊問題時,先確認電壓和接線是否正確
硬體工程師
- ✅ 理解軟體視角的抽象化是合理的
- ✅ 溝通時可以說明「協議相同,但電氣特性不同」
- ✅ 提供清楚的硬體規格文件給軟體團隊
跨領域溝通
當討論技術問題時,先確認:
- 🤔 我們在討論協議層還是物理層?
- 🤔 對方的背景是軟體還是硬體?
- 🤔 這個差異在當前情境下重要嗎?
最後的啟示
這個故事告訴我們:
技術爭論往往不是誰對誰錯,而是站在不同的抽象層次看問題。
就像盲人摸象,軟體工程師摸到的是「協議」這隻象腿,硬體工程師摸到的是「電氣特性」這隻象鼻,大家都沒錯,只是看到的面向不同。
下次遇到類似的爭論時,不妨先問一句:
「我們是在討論同一個層次的問題嗎?」
也許就能避免一場無謂的爭執,還能學到新知識。
附錄:快速查表
| 比較項目 | UART | RS-232 |
|---|---|---|
| 類型 | 協議 | 物理層標準 |
| 電壓 | 0-5V (TTL) | ±3V ~ ±15V |
| 邏輯 1 | 高電壓 | 負電壓 |
| 距離 | < 1m | 最遠 15m |
| 軟體差異 | 無 | 無 |
| 硬體差異 | 有 | 有 |
| 需要轉換晶片 | 否 | 是(如 MAX232) |
| 應用場景 | 板上通訊、模組 | 工業設備、長距離 |
希望這篇文章能幫助更多工程師理解 UART 和 RS-232 的關係,也讓軟硬體團隊的溝通更順暢! 😊