RS232 UART 的差別-最原始的通訊介面原來長這樣

開發單晶片程式的時候,通常都用 RS232 介面接到PC來做debug,簡單好用又穩定,但晶片這端卻沒有 RS232 ,只有 UART ,這樣要怎麼接? 好像哪裡怪怪的。明明都是接到電腦的COM port,電路圖內卻有人寫 UART ,也有人寫 RS232 ,這到底怎麼回事? 讓我告訴你差別在哪裡吧。

RS232 序列埠

RS232 主要用在裝置之間的長距離傳輸,使用的電壓按標準來說如下所示

  • Logic 1: 傳送端 -5V ~ -15V   /  接收端 -3V ~ -15V
  • Logic 0: 傳送端+5V ~ +15V  /  接收端 +3V ~ +15V

其餘詳細規格請參考Interface Circuits for TIA/EIA-232-F Design Note,裡面詳述了阻抗、線長計算方式、接頭各腳位訊號的動作細節。

在商用領域,從\(\pm 5V\)到\(\pm 15V\)都有,以PC來說使用的電壓是\(\pm 7.5V\),高低間的電壓差就是15V。在早期的電腦主機板上,都會有兩個COM port,當年就是用它來接滑鼠與PSTN Modem(電話線數據機)。

恩…不要懷疑,當時的滑鼠就是接COM port,用電話線撥接純文字BBS站,大夥也是用得很開心。

RS232 connector
RS232 connector

RS232 有規範兩種接頭形狀,D-sub 9(簡稱DB-9)與D-sub 25(簡稱DB-25),對於pin腳也有定義。但是時間一久,各家廠商(除了PC之外)就開始亂做一通,讓工程師們很困擾,這後面再來講。

UART 序列埠

UART(Universal Asynchronous Receiver/Transmitter)只是IC吐資料的對外管道,電壓最高就是chip自身的邏輯電壓,通常是5V或3.3V。由於電壓低、速度慢,通常用在裝置內部電路板的對外溝通,也就是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 的接線方塊圖
UART 與 RS232 的接線方塊圖

要提醒各位的是,兩個裝置相連時電壓準位要相同,千萬別將 RS232 與 UART 相接,這可能會把 UART 打壞,也就是你的chip可能會被打壞。

UART 與 RS232 差別最大的地方有兩個,看波形的時候才不會誤判。

  • RS232 的Vpp電壓較高有6V~30V,UART則是較低的3.3V或5V。
  • RS232 為負邏輯, UART 則為正邏輯,因此兩者波形是反相的。

兩者的通訊協定我已經列在下圖了(以PC為例),事實上它本來還有定義parity check bit,但因為在debug連線時,大家只是看看變數而已,我目前在Debug上還沒看過有人用過parity,但在長距離大量的連續資料傳送時,還是用一下parity比較保險。

UART 與 RS232 的資料格式
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送完,接收器馬上就會standby要收下個byte了,除非你跟我一樣遇到兩光接收器,非得每個byte都間格一段時間,不然stop bit設定為1bit應該就可以了。

實際波形

我把實際測量到的波形貼上,上方是 UART 下方是 RS232 ,大家解讀得出來是甚麼byte嗎? 這是2個byte 0x0D, 0x0A,也就是鍵盤上的Enter鍵,按下去就會送出2個byte。光是這個Enter key,有時送0x0A有時送0x0D  0x0A,又可以寫另一篇專文了,希望各位都能順利解讀訊號喔。

RS232 與 UART 的波形
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)

 

17 Comments

  1. 發射端 ±5~15 V, 接收端 ±3~15 V (考慮傳輸線上的線損電壓-2V)。 而 ±25 V應該是加了雜訊、干擾等等的最高可容忍電壓,當線之間短路時而不致燒毀(這是EIA-232-x的基本要求,x有,C,D,E,F等五種規格,各有最傳輸線長與最大slew rate的規範所因應的負載阻值與容值)。
    FYI: (出自TI Design Note:Interface Circuit for TIA/EIA-232-F)
    TIA/EIA-232-F Electrical Specification
    All 232 circuits carry voltage signals, with the voltage at the connector pins not to exceed ±25 V. All pins must be able to withstand a short circuit to any other pin without sustaining permanent damage. Each line should have a minimum load of 3 kΩ and a maximum load of 7 kΩ, which usually is part of the receiver circuit. A logic 0 is represented by a driven voltage between 5 V and 15 V and a logic 1 of between –5 V and –15 V. At the receiving end, a voltage between 3 V and 15 V represents a 0 and a voltage of between –3 V and –15 V represents a 1. Voltages between ±3 V are undefined and lie in the transition region. This effectively gives a 2-V minimum noise margin at the receiver.

  2. 你好
    上面UART跟RS232的圖
    RS232不是負邏輯嗎?
    所以是0在正電壓,1在負電壓
    但RS232的圖似乎是正電壓?還是我理解錯誤呢
    謝謝

    • 你說的是正確的
      回想起來, 當時是想表達用正邏輯來解釋 UART and RS232的波形
      但現在看來,這樣確實會讓人誤解

      感謝你的指正, 我會想想如何處理, 並在這兩天做修正

  3. 這個教授看到會QQ哦! 這些都稱作UART,但電器特性不同的通訊埠當然不能直接對接。 UART中文是通用非同步接發器,在OSI model裡算是data link layer的實作,定義了data frame,流量控制,錯誤檢測等。RS232/422/485等只是規定電器特性的PHY layer物理層的規範,所以UART是實作在PHY之上的協議。而一般市面上輸出電位在3.3V or 5V的是UART用TTL實作的介面。

    • 感謝您的指點,若您有UART與RS232的原始spec文件,也歡迎提供給我,好做修改,目前我還真的找不到這古老的文件,都是在Datasheet上看到的資料居多。

  4. 電壓問題 建議可以研究一下MAX232 的 charge pump 電路喔, 規範是 +- 3-15V 因為早期是設計長距離使用有一定因為線材使用時的壓降考慮

    • 感謝你的提問,你一定有做功課
      我一定要好好回答你

      維基百科上確實有寫過±15V
      但它是指二擇一
      either in the range of +3 to +15 volts or the range −3 to −15 volts
      這部分由於RS232年代實在太久遠
      我自己也沒看過原始的EIA-RS232文件
      到底原始文件怎麼寫 我確實沒看過
      目前都是網路上資料看來的

      實際測量PC的RS232,確實是±7.5V
      而PC是目前最通用的平台,我就拿它當標準了
      那為何是±7.5? 因為PC電源供應器最高就只到12V

      那有沒有±15V的RS232裝置呢?
      其實我不知道, 因為我沒看過
      現今RS232還存在的裝置,大概只剩下工業用的裝置了
      工業電腦、調變器、條碼機、條碼scanner等等
      但這些也都慢慢被USB or ethernet取代

      最後RS232可能真的只剩下debug功能而已

      • 謝謝您的回覆!
        照您回覆的資訊去查詢了隨便一顆RS232的chip,我查的是TI MAX323還真的是±7V,所以說其實只要電壓準位在3v~15v就代表是邏輯0,-3v~-15v代表是邏輯1這樣對嗎?謝謝您!
        另外您的這句敘述我實在有點不懂,二擇一是什麼意思呢?維基百科這段的敘述應該是指+3 to +15(邏輯0),−3 to −15(邏輯1),3 to -3(非有效準位)
        “維基百科上確實有寫過±15V
        但它是指二擇一
        either in the range of +3 to +15 volts or the range −3 to −15 volts”
        謝謝您!

Leave a Reply

Your email address will not be published.


*