自從國慶長假被密密麻麻的紅色炸彈擊中之后,酒也沒少喝,最終喝到斷片進(jìn)了醫(yī)院,身體恢復(fù)后終于更新了一篇基礎(chǔ)的 UART,獻(xiàn)給剛好需要的您;
目錄
1 UART 發(fā)展歷史
2 預(yù)備知識(shí)
3 協(xié)議層
4 傳輸過程
5 物理層
6 優(yōu)缺點(diǎn)
?
1、 UART 發(fā)展歷史
1.1 早期的串行通訊設(shè)備
早期的電報(bào)機(jī)器使用長度可變的脈沖信號(hào)進(jìn)行數(shù)據(jù)傳輸,比如摩斯電碼;
摩斯電碼
后來電傳打印機(jī)(teleprinters
)普遍使用 5、6、7 或 8 個(gè)數(shù)據(jù)位來表示各種字符編碼,最終成為計(jì)算機(jī)外圍設(shè)備。電傳打字機(jī)( teletypewriter
簡稱 tty
)成為小型計(jì)算機(jī)十分出色的通用I/O
設(shè)備。
Teletypewritter
由于歷史的發(fā)展原因,早期在 Unix 終端是一個(gè)名字為 ASR33 的電傳打字機(jī),而電傳打字機(jī)的英文單詞為Teletype
(或Teletypewritter
),縮寫為tty
。因此,終端設(shè)備也被稱為tty
設(shè)備。這就是 TTY 這個(gè)名稱的來源。
?
1.2 早期的芯片級(jí) UART
DEC(Digital Equipment Corporation
)公司的 Gordon Bell 為該公司的 PDP 系列計(jì)算機(jī)設(shè)計(jì)了第一個(gè) UART,不過體積龐大,UART 的線路占據(jù)了整個(gè)電路板;
后來 DEC 將串行線路單元的設(shè)計(jì)濃縮為早期的 UART 單芯片,以方便自己使用。
DEC 公司 Logo
DEC 是美國一家計(jì)算機(jī)公司;
西部數(shù)據(jù)(Western Digital
)公司在 1971 年左右將其開發(fā)為第一個(gè)廣泛可用的UART
單芯片 WD1402A
。這是中型集成電路的早期產(chǎn)品。
Western Digital
是美國計(jì)算機(jī)硬盤驅(qū)動(dòng)器制造商和數(shù)據(jù)存儲(chǔ)公司。
?
1.3 現(xiàn)代 UART 的發(fā)展
2000 年代開始,大多數(shù) IBM 或者相關(guān)的計(jì)算機(jī)都刪除了其外部 RS232 的 COM 端口,將其替換為帶寬性能更加出色的 USB 端口;
早期帶 RS232 的 PC
對(duì)于仍然需要 RS-232 串行 COM 端口的用戶,現(xiàn)在通常使用外部 USB 轉(zhuǎn) UART 轉(zhuǎn)換器,常見的有 CH340,Silicon Labs 210x 的驅(qū)動(dòng)程序,現(xiàn)在很多處理器和芯片都內(nèi)置了 UART。
?
2 、預(yù)備知識(shí)
通用異步收發(fā)傳輸器(Universal Asynchronous Receiver/Transmitter
,通常稱為 UART),在 UART 通信中,兩個(gè) UART 直接通信。
發(fā)送端的UART
將來自控制設(shè)備(如 CPU)的并行數(shù)據(jù)轉(zhuǎn)換為串行數(shù)據(jù),以串行方式將其發(fā)送到接收端的UART
,然后由接收端的 UART 將串行數(shù)據(jù)轉(zhuǎn)換為并行數(shù)據(jù)以用于接收設(shè)備的正常處理。
?
這里只需要兩條線 RX/TX 即可在兩個(gè) UART 之間傳輸數(shù)據(jù)。具體如下圖所示;
?
3、 協(xié)議層
UART 傳輸?shù)臄?shù)據(jù)被封裝成數(shù)據(jù)包。每個(gè)數(shù)據(jù)包包含 1 個(gè)起始位,5~9 個(gè)數(shù)據(jù)位(取決于 UART 的具體設(shè)置),一個(gè)可選的奇偶校驗(yàn)位以及 1 個(gè)或 2 個(gè)停止位,具體如下圖所示;
協(xié)議格式
起始位
UART 數(shù)據(jù)傳輸線通常在不傳輸數(shù)據(jù)時(shí)保持在高電平。
為了開始數(shù)據(jù)傳輸,發(fā)送端 UART 在一個(gè)時(shí)鐘周期內(nèi)將傳輸線從高電平拉低到低電平。
當(dāng)接收端 UART 檢測到高電壓到低電壓轉(zhuǎn)換時(shí),它開始以波特率的頻率讀取數(shù)據(jù)位中的每一位數(shù)據(jù)。
?
數(shù)據(jù)
數(shù)據(jù)位包含正在傳輸?shù)膶?shí)際數(shù)據(jù)。如果使用奇偶校驗(yàn)位,則可以是 5 位,最多 8 位。如果不使用奇偶校驗(yàn)位,則數(shù)據(jù)幀的長度可以為 9 位。
在大多數(shù)情況下,數(shù)據(jù)首先以低有效位發(fā)送。
?
校驗(yàn)位
在串口通信中一種簡單的檢錯(cuò)方式。
有四種檢錯(cuò)方式:偶校驗(yàn)、奇校驗(yàn)、高校驗(yàn)和低校驗(yàn)。當(dāng)然沒有校驗(yàn)位也是可以的。
對(duì)于偶和奇校驗(yàn)的情況,串口會(huì)設(shè)置校驗(yàn)位(數(shù)據(jù)位后面的一位),用一個(gè)值確保傳輸?shù)臄?shù)據(jù)有偶個(gè)或者奇?zhèn)€邏輯高位。
舉個(gè)例子,如果數(shù)據(jù)是011
,則滿足;
偶校驗(yàn),校驗(yàn)位為 0,保證邏輯高的位數(shù)是偶數(shù)個(gè)。
奇校驗(yàn),校驗(yàn)位為 1,這樣就有 3 個(gè)邏輯高位。
具體如下圖所示;
奇校驗(yàn)和偶校驗(yàn)
高位和低位不是真正的檢查數(shù)據(jù),而是強(qiáng)行將校驗(yàn)位設(shè)置為邏輯高或者邏輯低。這樣使得接收設(shè)備能夠知道一個(gè)位的狀態(tài),有機(jī)會(huì)判斷是否有噪聲干擾了通信或者是否傳輸和接收數(shù)據(jù)是否不同步。
?
停止位
發(fā)送端 UART 將數(shù)據(jù)傳輸線從低電壓驅(qū)動(dòng)到高電壓至少持續(xù)兩位數(shù)據(jù)的時(shí)間寬度來表示整個(gè)數(shù)據(jù)包的傳輸已經(jīng)結(jié)束。
由于數(shù)據(jù)是在傳輸線上定時(shí)的,并且每一個(gè)設(shè)備有其自己的時(shí)鐘,很可能在通信中兩臺(tái)設(shè)備間出現(xiàn)了小小的不同步。因此停止位不僅僅是表示傳輸?shù)慕Y(jié)束,并且提供計(jì)算機(jī)校正時(shí)鐘同步的機(jī)會(huì)。適用于停止位的位數(shù)越多,不同時(shí)鐘同步的容錯(cuò)性越好,但是數(shù)據(jù)傳輸率同時(shí)也越慢。
?
波特率
波特率是串口數(shù)據(jù)的傳輸速度,即Bit/s
,常見的波特率有:9600,19200,38400,57600,115200,當(dāng)然還有很多波特率,不再一一給出;
假設(shè)目前 UART 的配置為,1 個(gè)起始位,8 個(gè)數(shù)據(jù)位,0 個(gè)校驗(yàn)位,1 個(gè)停止位,那么 9600 的波特率,可以計(jì)算出每一位數(shù)據(jù)的時(shí)間寬度為:
那么傳輸一個(gè)字節(jié)(也就是 10 bit 數(shù)據(jù))需要的時(shí)間為 1.04 毫秒。
下面用串口抓取了 UART 的 TX 上的信號(hào),其中一位數(shù)據(jù)的時(shí)間寬度為 26 微秒,具體如下圖所示;
則可以簡單計(jì)算得到;
因此波特率大概為 38400;
下表是各個(gè)波特率下數(shù)據(jù)位時(shí)間寬度;
Time | Baud Rate |
---|---|
3333μs (3.3ms) | 300 |
833μs | 1200 |
416μs | 2400 |
208μs | 4800 |
104μs | 9600 |
69μs | 14400 |
52μs | 19200 |
34μs | 28800 |
26μs | 38400 |
17.3μs | 57600 |
8μs | 115200 |
4.34μs | 230400 |
4 傳輸過程
發(fā)送端 UART 從數(shù)據(jù)總線轉(zhuǎn)換并行數(shù)據(jù):
發(fā)送端 UART 將起始位,奇偶校驗(yàn)位和停止位添加到數(shù)據(jù)包中:
整個(gè)數(shù)據(jù)包從發(fā)送端 UART 串行發(fā)送到接收端 UART;接收端 UART 按照預(yù)先配置好的波特率對(duì)數(shù)據(jù)線進(jìn)行采樣:
接收端 UART 解析接收的數(shù)據(jù),丟棄數(shù)據(jù)包中的起始位,奇偶校驗(yàn)位和停止位:
接收 UART 將串行數(shù)據(jù)轉(zhuǎn)換回并行數(shù)據(jù),并將其傳輸?shù)浇邮斩说臄?shù)據(jù)總線:
?
5 、物理層
UART、RS232、RS485 在串口通信中,主要區(qū)別是電平的不同,其中 UART 通常使用 TTL 電平,下面介紹這幾個(gè)存在的差異;
TTL
TTL 全名是晶體管 - 晶體管邏輯集成電路(Transistor-Transistor Logic
)
輸入高電平最小 2V,輸出高電平最小 2.4V,典型值 3.4V;
輸入低電平最大 0.8V,輸出低電平最大 0.4V,典型值 0.2V。
RS232
RS232 邏輯 1 電平(MARK)=-3V~-15V,邏輯 0 電平(SPACE)=+3~+15V;
同樣的,對(duì)于傳輸數(shù)據(jù)0x55
,即二進(jìn)制的01010101
,RS232 和 TTL 的區(qū)別如下;
RS485
邏輯 1 以兩線間的電壓差為+(2~6)V
表示;邏輯"0"以兩線間的電壓差為-(2~6)V
表示;
在工業(yè)通信中,使用 RS485 比較多,因?yàn)?RS485 是差分信號(hào),可以抑制共模干擾,因此在惡劣的環(huán)境中擁有很好的抗干擾性,比較穩(wěn)定;
?
6、 優(yōu)缺點(diǎn)
沒有任何通信協(xié)議是完美的,以下是 UART 的一些利弊,可幫助您確定它們是否適合您的項(xiàng)目需求:
優(yōu)點(diǎn)
通信只需要兩條數(shù)據(jù)線;無需時(shí)鐘信號(hào);有奇偶校驗(yàn)位,方便通信的差錯(cuò)檢查;只需要接收端和發(fā)送端設(shè)置好數(shù)據(jù)包結(jié)構(gòu),即可穩(wěn)定通信;
缺點(diǎn)
數(shù)據(jù)幀最大支持 9 位數(shù)據(jù);不支持多主機(jī)或多從機(jī)的主從系統(tǒng);