UART串口通信協(xié)議有哪些?
雖然 USB 幾乎完全取代那些舊電纜和連接器,但 UART 絕對(duì)不會(huì)成為過(guò)去。您會(huì)發(fā)現(xiàn)許多 DIY 電子項(xiàng)目都使用 UART。
將 GPS 模塊、藍(lán)牙模塊和 RFID 讀卡器模塊連接到您的 Raspberry Pi、Arduino、ESP32 或其他微控制器 MCU。
UART 是通用異步接收器/發(fā)送器。它不同于 SPI、I2C 那樣的通信協(xié)議,而是微控制器中的物理電路,或者說(shuō)是獨(dú)立的 IC。UART 的主要用途是傳輸和接收串行數(shù)據(jù)。
UART 的優(yōu)點(diǎn)之一是它只使用兩條線在設(shè)備之間傳輸數(shù)據(jù)。UART 背后的原理很容易理解。
UART 通信簡(jiǎn)介
在 UART 通信中,兩個(gè) UART 直接相互通信。發(fā)送端 UART 將來(lái)自微控制器設(shè)備的并行數(shù)據(jù)轉(zhuǎn)換為串行形式,將其串行數(shù)據(jù)傳輸?shù)浇邮斩? UART。
然后接收端 UART 將串行數(shù)據(jù)轉(zhuǎn)換回并行數(shù)據(jù)。在兩個(gè) UART 之間傳輸數(shù)據(jù)只需要兩根線。數(shù)據(jù)從發(fā)送端 UART 的 Tx 引腳流向接收端 UART 的 Rx 引腳。
串口RS232
通用異步收發(fā)傳輸器(Universal Asynchronous Receiver/Transmitter),通常稱(chēng)作UART。UART是一種通用的數(shù)據(jù)通信協(xié)議,也是異步串行通信口(串口)的總稱(chēng),它在發(fā)送數(shù)據(jù)時(shí)將并行數(shù)據(jù)轉(zhuǎn)換成串行數(shù)據(jù)來(lái)傳輸,在接收數(shù)據(jù)時(shí)將接收到的串行數(shù)據(jù)轉(zhuǎn)換成并行數(shù)據(jù)。它包括了RS 232、RS499、RS423、RS422和RS485等接口標(biāo)準(zhǔn)規(guī)范和總線標(biāo)準(zhǔn)規(guī)范。
串口簡(jiǎn)介
串口作為常用的三大低速總線(UART、SPI、IIC)之一,在設(shè)計(jì)眾多通信接口和調(diào)試時(shí)占有重要地位。但UART和SPI、IIC不同的是,它是異步通信接口,異步通信中的接收方并不知道數(shù)據(jù)什么時(shí)候會(huì)到達(dá),所以雙方收發(fā)端都要有各自的時(shí)鐘,在數(shù)據(jù)傳輸過(guò)程中是不需要時(shí)鐘的,發(fā)送方發(fā)送的時(shí)間間隔可以不均勻,接受方是在數(shù)據(jù)的起始位和停止位的幫助下實(shí)現(xiàn)信息同步的。而SPI、IIC是同步通信接口,同步通信中雙方使用頻率一致的時(shí)鐘,在數(shù)據(jù)傳輸過(guò)程中時(shí)鐘伴隨著數(shù)據(jù)一起傳輸,發(fā)送方和接收方使用的時(shí)鐘都是由主機(jī)提供的。
UART通信只有兩根信號(hào)線,一根是發(fā)送數(shù)據(jù)端口線叫tx(Transmitter),一根是接收數(shù)據(jù)端口線叫rx(Receiver),如圖所示,對(duì)于PC來(lái)說(shuō)它的tx要和對(duì)于FPGA來(lái)說(shuō)的rx連接,同樣PC的rx要和FPGA的tx連接,如果是兩個(gè)tx或者兩個(gè)rx連接那數(shù)據(jù)就不能正常被發(fā)送出去和接收到,rx和tx都是相對(duì)自身主體來(lái)講的。UART可以實(shí)現(xiàn)全雙工,即可以同時(shí)進(jìn)行發(fā)送數(shù)據(jù)和接收數(shù)據(jù)。通信協(xié)議的分類(lèi)
按照消息傳送的方向與時(shí)間關(guān)系,通信協(xié)議可分為以下3種。
單工通信
單工通信(Simplex Communication)是指消息只能單方向傳輸?shù)耐ㄐ欧绞健?
在單工通信中,發(fā)送端與接收端是固定的,即發(fā)送端只能發(fā)送信息,不能接收信息;接收端只能接收信息,不能發(fā)送信息。
例如:遙控器與電視、廣播站與收音機(jī)。
半雙工通信
半雙工通信(Half-duplex Communication)中的“雙工”表示通信的雙方都可以發(fā)送信息,而“半”表示雙方不能同時(shí)發(fā)送或同時(shí)接收信息,即對(duì)于同一個(gè)設(shè)備,同一時(shí)刻只能發(fā)信息或者收信息,不能在發(fā)信息的時(shí)候又收信息。
在這種工作方式下,發(fā)送端可以轉(zhuǎn)變?yōu)榻邮斩?接收端也可以轉(zhuǎn)變?yōu)榘l(fā)送端。但是在同一個(gè)時(shí)刻,信息只能在一個(gè)方向上傳輸。因此,也可以將半雙工通信理解為一種可以切換方向的單工通信。
例如:對(duì)講機(jī)。
全雙工通信
全雙工通信(Full duplex Communication):通信的雙方可以同時(shí)發(fā)送和接收數(shù)據(jù)。
UART是“Universal Asynchronous Receiver/Transmitter”,通用異步收發(fā)器的縮寫(xiě)。在19世紀(jì)60年代,為了解決計(jì)算機(jī)和電傳打字機(jī)通信,Bell發(fā)明了 UART協(xié)議,將并行輸入信號(hào)轉(zhuǎn)換成串行輸出信號(hào)。因?yàn)閁ART簡(jiǎn)單實(shí)用的特性,其已經(jīng)成為一種使用非常廣泛的通訊協(xié)議。我們?nèi)粘=佑|到的串口,RS232,RS485等總線,內(nèi)部使用的基本都是 UART協(xié)議 。
為了更好的理解和分析協(xié)議與總線的關(guān)系,我們通常把一個(gè)完整的通訊規(guī)范劃分成物理層,協(xié)議層以及應(yīng)用層。物理層只定義真實(shí)的信號(hào)特性(比如電壓,電流,驅(qū)動(dòng)能力等),以及電信號(hào)與邏輯信號(hào)0和1的對(duì)應(yīng)關(guān)系;協(xié)議層不關(guān)心底層的0和1具體怎么實(shí)現(xiàn),只規(guī)定邏輯信號(hào)的協(xié)議規(guī)范以及通訊過(guò)程(例如起始,數(shù)據(jù)以及結(jié)束等);應(yīng)用層不關(guān)心數(shù)據(jù)是怎么獲取的,只定義數(shù)據(jù)表示的意義,以及如何實(shí)現(xiàn)具體的業(yè)務(wù)邏輯。
圖 1?1 通訊協(xié)議的分層實(shí)現(xiàn)
最簡(jiǎn)單的UART協(xié)議應(yīng)用,通常物理層只需要兩根傳輸線,一根用于發(fā)送,一根用于接收,從而實(shí)現(xiàn)全雙工通訊。對(duì)于單向傳輸,也可以只使用一根傳輸線。此類(lèi)應(yīng)用最典型的實(shí)例就是單片機(jī)的RX/TX端口互相連接,從而實(shí)現(xiàn)基于TTL電平的UART通訊。對(duì)于不同的傳輸距離以及可靠性的要求,替換不同的物理層實(shí)現(xiàn)既可以得到我們常見(jiàn)的RS232、RS485等通訊總線。
1.2. 不同的物理層實(shí)現(xiàn)
由于UART協(xié)議層的輸入是邏輯0/1信號(hào),而邏輯0/1信號(hào)在物理層可以通過(guò)不同的電平標(biāo)準(zhǔn)來(lái)區(qū)分。針對(duì)不同的通訊需求,便可以使用不同的物理層實(shí)現(xiàn)。例如簡(jiǎn)單的板內(nèi)通訊,或者常見(jiàn)的設(shè)備調(diào)試場(chǎng)景,使用簡(jiǎn)單的LVTTL/TTL電平即可在兩個(gè)設(shè)備間進(jìn)行UART協(xié)議通訊。
圖 1?2 不同的物理層電平標(biāo)準(zhǔn)
通用的串口則使用的是RS232電平,可以增加傳輸距離,并且抵抗一定程度的信號(hào)干擾。付出的成本則是在物理層需要對(duì)應(yīng)的電平轉(zhuǎn)換芯片來(lái)實(shí)現(xiàn),發(fā)送端需要將內(nèi)部的高低電平信號(hào)轉(zhuǎn)換成電壓更高的+/-電壓信號(hào),接收端需要將+/-電壓信號(hào)轉(zhuǎn)換成內(nèi)部的高低電平信號(hào)。
在工業(yè)通訊的場(chǎng)景下,為了進(jìn)一步提高傳輸距離,以及增強(qiáng)信號(hào)的可靠性,一般會(huì)采用RS485的電平標(biāo)準(zhǔn)。在發(fā)送端將普通的高低電平信號(hào)轉(zhuǎn)換成一對(duì)差分信號(hào),在接收端將差分信號(hào)再轉(zhuǎn)換成普通的高低電平信號(hào)。另外,RS485允許總線上連接多達(dá)128收發(fā)器,而TTL或者RS232則是點(diǎn)對(duì)點(diǎn)的連接。
1.2.1.基于TTL的UART通訊
基于TTL的UART通訊,是UART協(xié)議應(yīng)用最簡(jiǎn)單的使用場(chǎng)景。即直接把數(shù)字I/O輸出的高低電平作為實(shí)際的物理信號(hào)進(jìn)行傳輸。在物理連接上,只需要設(shè)備共地,通過(guò)一根信號(hào)線即可完成單向的設(shè)備通訊。如果需要雙向全雙工,使用兩根信號(hào)線即可。
圖 1?3 基于TTL的UART通訊
為了對(duì)比不同物理層實(shí)現(xiàn)的差別,我們可以觀察發(fā)送相同數(shù)據(jù)時(shí),不同物理層的實(shí)際信號(hào)有何不同。這里以發(fā)送字符‘D‘為例,通過(guò)璞石示波器,直接觀察TTL實(shí)現(xiàn)傳輸?shù)男盘?hào)(探頭接地端連接設(shè)備共地端,探頭信號(hào)端連接上圖藍(lán)色信號(hào)線),可以獲得如圖1?4所示的信號(hào)波形。從波形可以看出,當(dāng)沒(méi)有數(shù)據(jù)傳輸時(shí),UART信號(hào)會(huì)一直保持在高電平(具體信號(hào)幅度由I/O的供電電壓決定),數(shù)據(jù)傳輸時(shí)信號(hào)發(fā)生跳變,傳輸完成后信號(hào)重新回到空閑的高電平狀態(tài)。
圖 1?4 TTL的UART信號(hào)波形
1.2.2.基于RS232的UART通訊
為了增強(qiáng)驅(qū)動(dòng)能力,以增加傳輸距離和可靠性,RS232總線采用了雙極性電壓信號(hào)來(lái)進(jìn)行物理傳輸。信號(hào)在發(fā)送/接收之前,通過(guò)電平轉(zhuǎn)換芯片實(shí)現(xiàn)內(nèi)部信號(hào)和總線信號(hào)的互相轉(zhuǎn)換。連接方式和TTL電平完全相同,整個(gè)物理層只是多了一層電平轉(zhuǎn)換。
圖 1?5 基于RS232的UART通訊
同樣以發(fā)送字符‘D‘為例,璞石示波器的探頭連接到信號(hào)端,可以采集到如圖1?6所示的實(shí)際波形??梢钥闯?,RS232波形在空閑時(shí)為負(fù)電壓,當(dāng)有數(shù)據(jù)傳輸時(shí),信號(hào)開(kāi)始在正負(fù)電壓之間跳變,傳輸完成后重新回到空閑的負(fù)電壓狀態(tài)。
圖 1?6 RS232的UART波形
1.2.3.基于RS485的UART通訊
RS485為復(fù)雜的工業(yè)環(huán)境而設(shè)計(jì),和其它UART協(xié)議的物理層相比,RS485總線最大的特點(diǎn)就是使用了差分信號(hào)傳輸。信號(hào)在發(fā)送之前,通過(guò)RS485的收發(fā)器把單端信號(hào)轉(zhuǎn)換成差分信號(hào),再發(fā)送到總線上進(jìn)行傳輸;同樣在接收之前,總線上的差分信號(hào)通過(guò)收發(fā)器的轉(zhuǎn)換變成單端信號(hào)再送給UART控制器進(jìn)行接收。在RS485總線上,如果希望進(jìn)行全雙工的雙向通訊,需要兩對(duì)差分信號(hào)線(即4根信號(hào)線)。如果只進(jìn)行半雙工的雙向通訊,則僅需要一對(duì)差分信號(hào)即可。