開發單晶片程式的時候,通常都用 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 有規範兩種接頭形狀,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,負責資料收送的功能。
要提醒各位的是,兩個獨立裝置相連時電壓準位要相同,千萬別將 甲地的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比較保險。
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,又可以寫另一篇專文了,希望各位都能順利解讀訊號喔。
接頭定義與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)
你好在別處閱讀到你得文章並連結到此寶地,想再這裡詢問一下關於(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/
實用得資訊!收藏~
感謝分享,很詳細
感謝您的肯定, 歡迎分享
http://wiki.csie.ncku.edu.tw/embedded/USART
成大資工Wiki也有整理豐富的資料
供大家參考
感謝您的資料, 寫得很詳細
兩個串列傳輸埠接腳邏輯電壓準位不同,要怎麼處理?
https://makeryan.files.wordpress.com/2017/06/i2c-level-shift-mosfet.png
給你參考這是i2c的level shift
我看人家有實際用過
我自己倒是沒用過
如果你的serial bus是UART應該也可以比照辦理
電晶體要選一下適合的就是
發射端 ±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.
感謝HY WANG大大, 好樣的
我會找時間把您給的資訊更新到文章內
你好
上面UART跟RS232的圖
RS232不是負邏輯嗎?
所以是0在正電壓,1在負電壓
但RS232的圖似乎是正電壓?還是我理解錯誤呢
謝謝
你說的是正確的
回想起來, 當時是想表達用正邏輯來解釋 UART and RS232的波形
但現在看來,這樣確實會讓人誤解
感謝你的指正, 我會想想如何處理, 並在這兩天做修正
這個教授看到會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上看到的資料居多。
電壓問題 建議可以研究一下MAX232 的 charge pump 電路喔, 規範是 +- 3-15V 因為早期是設計長距離使用有一定因為線材使用時的壓降考慮
請問RS232使用的電壓是±7.5V嗎?不是±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功能而已
我量過 CNC控制器的 Rs232是12V
wow, 感謝你的資訊
我會再更新內容
謝謝您的回覆!
照您回覆的資訊去查詢了隨便一顆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”
謝謝您!
您是對的, 電壓準位在3v~15v就代表是邏輯0,-3v~-15v代表是邏輯1