作者:實作派
開發單晶片程式時,通常都用 RS232 介面接到 PC 來做 debug,簡單好用又穩定,但晶片這端沒有 RS232 ,只有 UART,這樣要怎麼接呢?明明都是接到電腦的 COM port,電路圖內卻有人寫 UART ,也有人寫 RS232 ,這到底是怎麼回事?
RS232 序列埠
RS232 主要用在裝置之間的長距離傳輸,使用的電壓按標準如下所示:
- Logic 1:傳送端 -5 V ~ -15 V / 接收端 -3 V ~ -15 V
- Logic 0:傳送端 +5 V ~ +15 V / 接收端 +3 V ~ +15 V
其餘詳細規格請參考 Interface Circuits for TIA/EIA-232-F Design Note,裡面詳述了阻抗、線長計算方式與接頭各腳位訊號的動作細節等;在商用領域,從 ±5 V 到 ±15 V 都有;以 PC 來說,使用的電壓是 ±7.5 V,高低間的電壓差就是 15 V。
在早期的電腦主機板上,都有兩個 COM port,當年就是用它來接滑鼠與 PSTN Modem(電話線數據機)。你可能感到懷疑,但當時的滑鼠確實就是接 COM port,用電話線撥接純文字 BBS 站,大夥也是用得很開心呢!

RS232 connector(圖片來源:實作派提供)
RS232 有兩種接頭形狀,分別是 D-sub 9(簡稱DB-9)與 D-sub 25(簡稱DB-25),對於 pin 腳也有各自的定義,但是時間一久,各家廠商(除了 PC 外)就開始亂做一通,讓工程師們很困擾。
UART 序列埠
UART(Universal Asynchronous Receiver/Transmitter)是 IC 吐資料的對外管道,電壓最高就是 chip 自身的邏輯電壓,通常是 5 V 或 3.3 V。由於電壓低、速度慢,通常用在裝置內部電路板的對外溝通,也就是 debug;如果你想讓程式印出變數值,通常會呼叫 printf( ) 函式對吧,這時字串就會從 UART 的 TXD 跑出來。
UART 只是晶片內序列傳輸模組的通稱,Universal 表示是泛用型,你可以 config 它成為各種形式的序列埠,例如要不要 parity check、bit rate 要多少之類的。換言之,UART 只是稱呼,不是標準,因此沒有定義接頭形狀,接頭形式完全看個人方便而定。
另外有人會問,UART 裡的「非同步 Asynchronous」是什麼意思?不知您有無發現 RS232/UART 只用一條線來傳資料,所以它沒有額外的 clock,沒有 clock 輔助表示「接收端即便知道發射端的 bit rate,自身的資料取樣速度也無法完全與發射端相同」,因此稱為非同步,若是像 I2C/SPI 等傳輸介面是包含 clock 訊號的,就稱為「同步傳輸」。
Protocol 通訊協定
簡單來說,我們可以將 RS232 視為 UART 的高電壓版本,下圖的 MAX232 就是做轉電壓。用有學問一點的說法來講,RS232 定義了實體層,方便各種裝置彼此交換資料,而每個裝置中處理器裡面的 UART 模組,則負責資料收送的功能。

UART 與 RS232 的接線方塊圖(圖片來源:實作派提供)
要提醒各位的是,當兩個裝置相連時,電壓準位要相同,千萬別將 RS232 與 UART 相接,這可能會把 UART 打壞,也就是 chip 會壞掉。UART 與 RS232 最大的差別有兩個:
- RS232 的 Vpp 電壓較高,有 6 V~30 V;UART 則是較低的 3.3 V 或 5 V
- RS232 為負邏輯, UART 為正邏輯,因此兩者波形是反相的
兩者的通訊協定如下圖所示(以 PC 為例),事實上它本來還有定義 parity check bit,只不過通常在 debug 連線時,大家只是看看變數,而且我目前在 debug 上也還沒看過有人用過 parity,但還是建議大家在長距離大量的連續資料傳送時,用一下 parity 比較保險。

UART 與 RS232 的資料格式(圖片來源:實作派提供)
- Idle
表示 Serial port 資料送完了,目前沒事做,正在等待下一筆資料中,UART level 固定在 H。
- Start
將狀態反相,是送資料前的準備動作,這樣接收端才知道後面有資料要送,UART level 固定為 L。
- D0~D7
送資料的順序是 D0 先送,D7 最後送,所以在示波器顯示的波形是 D0:D7,在判讀資料前記得先在腦中反序變成 D7:D0 再來判讀,也別忘了 RS232 是負邏輯喔!
- Stop
資料送完後,要變成 Stop 狀態。Stop bit 很妙,我遇過 Stop bit 太短導致接收端誤判的情況(最短一個 bit,最長其實可以很長),由你決定。
實際上 Stop bit 本身可視為下個 bit 的 idle 狀態,因為兩個狀態其實一樣。邏輯上來說,你可以把 Stop state 經過 2 bit 後才視為 Idle,但實際上 D7 送完,接收器馬上就會準備接收下個 byte,除非你跟我一樣遇到兩光接收器,非得每個 byte 都間格一段時間,不然 stop bit 設定為 1 bit 應該就可以了。
實際波形
我把實際測量到的波形貼上,上方是 UART,下方是 RS232 ,大家解讀得出來是什麼 byte 嗎?這是 2 個byte 0x0D、0x0A,也就是鍵盤上的 Enter 鍵,按下去就會送出 2 個 byte。光是這個 Enter key,有時送 0x0A,有時送 0x0D、0x0A(這又可以寫另一篇專文了,希望各位都能順利解讀訊號)。

RS232 與 UART 的波形(圖片來源:實作派提供)
接頭定義與 flow control
RS232 在 PC 上的定義非常有規矩,一定都是 DB9 公接頭、第 3 pin 為 TXD、第 2 pin 為 RXD,但除了 PC,其他可以說是亂七八糟,DB9 的接頭有公有母,有些設備 TX 在 3 pin 、有些設備在 2 pin,所以在實務上我們經常需要各種 DB9 的公母轉接座,甚至有時候還需要 Null modem 轉接,而設備能否順利動作,端看你是否清楚雙方的 pin define,才能找到正確的接線方式。
RS232 除了 TX 與 RX 兩條資料線外,還有其他訊號線如 CTS、RTS、DTR、DSR 等,這些是用來作為傳送資料前的溝通,以免漏接資料。這個確認的動作叫做「交握 handshake」,主要用來做「流量控制 flow control」。
然而,handshake 的功能都不在晶片的 UART 模組中,因為 UART 只有 TX/RX 兩條線,其他 flow control 就需要用晶片內其他的 pin 來實作(全部做完會很花功夫,因此不難理解若只是要 debug 用,一般人不會想搞得那麼複雜)。
雖然現在已經沒人使用 PSTN modem 上網了,但這些技術仍然留在各種通訊協定裡,為了向過往的通訊技術致敬,這邊簡述一些 RS232 flow control 的 pin 腳。
- RTS(Request to send;output)資料請求
- CTS(Clear to send;input)準備發送資料
雙方的 RTS 與另一頭的 CTS 彼此是接在一起的,RTS 發送後,CTS 同時收到訊號,方便將資料送出。
下面這兩個 control pin,是存在於 PC 與 PSTN Modem 之間,主要用來確認 PC 或 Modem 是撥號還是斷線。要撥號之前,PC 先發 DTR 出去給 Modem,讓 Modem 知道 PC 準備好了;反過來說, PC 如果把 DTR 斷了,就表示通知 modem 要斷線了。
- DTR(Data terminal ready;output)
- DSR(Data set ready;input)
- 【實作實驗室】分配器效能測試 - 2024/12/30
- 【實作實驗室】頻道功率怎麼測?有線電視頻譜長這樣! - 2024/12/12
- 【實作實驗室】無線滑鼠游標定格,電源開關更換 DIY - 2024/11/12
訂閱MakerPRO知識充電報
與40000位開發者一同掌握科技創新的技術資訊!
2020/01/28
貴平台裡 https ://makerpro.cc/2020/01/uart-part2/ 文中提到 『 UART 的 0 是 3.3 V,1 是 0 V;但是在 5 V 的邏輯電路中,UART 的 0 是 5 V …….』。
一般使用示波器來量測UART訊號 好像不是這樣的,這之間差異為何?煩請撥空為我解惑,感恩!!