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

開發單晶片程式的時候,通常都用 RS232 介面接到PC來做debug,簡單好用又穩定,只是通常晶片本身沒有 RS232 ,只有 UART ,這樣要怎麼接? 好像哪裡怪怪的。明明都是接到電腦的RS232 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有定義RS232要為公頭,而且自身的TX要在第3pin之外,其它產品簡直亂無章法,有些做公頭、有些作母頭,有些TX在pin2、有些在pin3,讓工程師們很困擾,所以才有2、3對調這種名詞出現。

UART 序列埠

UART(Universal Asynchronous Receiver/Transmitter)只是IC收發資料的對外管道,訊號的電壓最高就是chip自身的邏輯電壓,通常是5V或3.3V。由於電壓低、速度慢,通常它用在裝置內部電路板的對外溝通,也就是debug的工作,這種資訊量通常很小。例如你想讓程式印出變數的值,通常會呼叫printf( )函式,這時字串就會從UART的TXD跑出來。

UART只是晶片內序列傳輸模組的通稱,第一個字母U的Universal表示是泛用型,你可以config它成為各種形式的序列埠,例如要不要parity check,bit rate要多少之類的。由於UART是通訊協定裡的Layer2,也就是Data Link Layer,它只定義傳送一個byte時,頭尾應該要有那些0與1護送,因此沒有定義接頭形狀,接頭的形狀與訊號準位則是定義在RS232,它是Layer1或說實體層Physical Layer。因此UART底層的實體要接哪種介面,完全看個人需求而定,你可以接RS232也可以直接導線對接。

另外有人會問,UART裡的非同步Asynchronous是甚麼意思? 不知您有無發現RS232/UART只用一條線來傳資料,所以它沒有額外的clock,沒有clock輔助資料取樣表示接收端即便知道發射端的bit rate,自身的資料取樣速度也無法完全與發射端相同,因此稱為非同步,它只能盡量跟對方速度一樣,畢竟是用自己的Clock來取樣;若是像I2C/SPI等傳輸介面是包含clock訊號的,取樣頻率就可以完全和對方相同,因為自身的取樣頻率可以鎖定在對方的clock上,就稱為同步傳輸。

Protocol通訊協定

簡單講,我們可以將 RS232 視為 UART 的高電壓版本,下圖的MAX232就是做轉電壓。用有學問一點的說法來講, RS232 定義了實體層,而裝置內的處理器裡面的 UART 模組,則是鏈路層Data Link Layer,負責資料收送的功能。

UART 與 RS232 的接線方塊圖
UART 與 RS232 的接線方塊圖

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

由於UART不見得要搭配RS232來用,你也可以用導線直接將兩個晶片的UART TX與RX對接,所以使用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是負邏輯喔! 這個錯誤很多人都掉進去過。I2C就沒這個困擾,它是D7先送,所以波形從左到右可以很順的解讀。

Stop

資料送完後,要變成Stop狀態。Stop bit很妙,我遇過Stop bit太短導致接收端會誤判,最短一個bit,最長其實可以很長,看你高興,通常有1bit、1.5bit、2bit的選項,個人建議隔開一點比較安全,倒不是硬體來不及收,而是可能你程式會來不及處理,尤其是在慢速的MCU上。

實際上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功能都是RS232要負責,晶片的UART模組不負責這些,UART 只有兩條線TX/RX而已。如果你需要RS232的flow control,則需要自己用晶片內其他pin來實作,大部分單晶片都沒有flow control的硬體,若真的全部做完了還真花功夫,因此不難理解若只是要debug用,一般人不會想搞這麼複雜,早期的電話撥接網路用的就是RS232,就有用到這些flow control。

雖然現在已經沒人使用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)

23 Comments

  1. 你好在別處閱讀到你得文章並連結到此寶地,想再這裡詢問一下關於(https://makerpro.cc/2020/01/uart-part2)文章提到的文中提到 『 UART 的 0 是 3.3 V,1 是 0 V;但是在 5 V 的邏輯電路中,UART 的 0 是 5 V …….』似乎和多年工作經驗裡的是不同的,請問是否有另外一種解釋!?
    感謝播空回覆。

    • 我想,他應該是寫錯了. UART是正邏輯, RS232是負邏輯, 一直都是這樣的

    • UART 與 RS-232C
      在開發 MCU 程式時,常常要把 MCU 的 UART 連接到 PC 來燒錄程式或 debug,但 MCU 上的串列通訊界面是 UART,PC 上的串列通訊界面是 RS-232C,這兩者到底有什麼關係,它們又有什麼不同呢?

      如同上一次說明的,UART 是邏輯電路上的概念,它會隨著邏輯電路的電壓位準不同而改變。在 3.3 V 的邏輯電路上,UART 的 1 是 3.3 V,0 是 0 V;但是在 5 V 的邏輯電路中,UART 的 1 是 5 V,0 是 0 V。

      邏輯電路的訊號是設計用在短距離、小尺寸的電路板上的,它其實無法跑太長的纜線。爲了解決這個問題,美國的電子工業聯盟 EIA 指定了一系列可以讓 UART 的訊號傳送較長距離的通訊規格標準,而這其中最爲人熟知的就是 RS-232C 這個標準。
      https://makerpro.cc/2020/01/uart-part2/

  2. 發射端 ±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.

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

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

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

  4. 這個教授看到會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上看到的資料居多。

  5. 電壓問題 建議可以研究一下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.


*