大家好,這里是 Hello_Embed。在前幾篇中,我們通過環形緩沖區解決了按鍵數據丟失問題,而在嵌入式系統中,設備間的數據交互(如單片機與電腦、傳感器的通信)同樣至關重要。UART(通用異步收發傳輸器)是最常用的串行通信協議之一,廣泛應用于調試、數據傳輸等場景。本篇將從 “同步與異步傳輸的區別” 入手,詳解 UART 協議的工作原理、數據格式及關鍵概念,為下一篇 “UART 硬件結構與編程” 打基礎。
一、數據傳輸的兩種基本方式
在講解 UART 之前,我們先明確 “同步傳輸” 與 “異步傳輸” 的核心區別 —— 這是理解 UART(異步協議)的基礎。
1. 同步傳輸
- 特點:同時發送兩種信號 ——時鐘信號(用于同步)和數據信號(實際傳輸的數據)。
- 原理:發送方通過時鐘信號的上升沿 / 下降沿通知接收方 “即將傳輸數據”,雙方嚴格按照時鐘節拍同步收發。
- 類比:就像和朋友約定 “每天下午 3 點準時視頻”,到點后直接開始交流,無需額外確認 “是否準備好”。
2. 異步傳輸
- 特點:僅發送數據信號,通過信號本身的 “起始標識” 和 “時長約定” 實現同步。
- 原理:數據信號中包含起始位(標記傳輸開始)、數據位(實際數據)和停止位(標記傳輸結束),收發雙方需提前約定信號時長(如波特率)。
- 類比:就像打電話 —— 先撥號碼(起始標識),對方接起后開始說話(數據),說完掛電話(停止標識),雙方無需提前約定 “幾點開始”,但需聽懂同一種語言(約定規則)。
- 實例:紅外遙控器協議 —— 接收端檢測到 “9ms 低電平 + 4.5ms 高電平” 時,判定為傳輸開始;邏輯 1 定義為 “0.56ms 低電平 + 1.69ms 高電平”,邏輯 0 定義為 “0.56ms 低電平 + 0.56ms 高電平”。
對比項 | 同步傳輸 | 異步傳輸 |
---|---|---|
信號線 | 需時鐘線 + 數據線 | 僅需數據線 |
速率 | 由時鐘信號頻率決定(可動態調整) | 收發雙方需提前約定(固定波特率) |
抗干擾能力 | 強(時鐘同步可修正偏差) | 弱(依賴信號時長,偏差易導致錯誤) |
適用場景 | 高速、短距離(如 SPI、IIC) | 中低速、長距離(如 UART、紅外) |
二、UART 協議:異步串行通信的典型實現
UART(Universal Asynchronous Receiver/Transmitter)是異步傳輸的典型應用,通過單條數據線實現雙向通信,其核心是 “約定數據格式和傳輸速率”,示意圖如下:
1. 通信方式:全雙工
UART 支持全雙工通信,即發送數據(TX)和接收數據(RX)可同時進行,互不干擾。三種通信方式的對比如下:
要使用串口傳輸數據,則需要明白其底層工作邏輯,我們以下圖為例:
通信方式 | 核心特點 | 數據流向 | 典型場景 |
---|---|---|---|
全雙工 | 同時收發,無沖突 | 雙向并行(TX/RX 獨立) | 電話通話、視頻會議、以太網通信 |
半雙工 | 可雙向傳輸,但同一時間只能單向 | 雙向交替(共用一根線) | 對講機、RS485 半雙工模式(共用一根線) |
單工 | 只能單向傳輸(固定發送或接收) | 單向固定 | 廣播、紅外遙控器(僅發送)、打印機(僅接收) |
2. 波特率:傳輸速率的度量
波特率(Baud Rate)是 UART 的核心參數,定義為 “每秒傳輸的信號狀態數(波特)”。在多數場景中,1 個狀態對應 1 位數據,因此波特率等價于 “每秒傳輸的比特數(bit/s)”。
- 例:波特率 115200 表示 “每秒傳輸 115200 位數據”,傳輸 1 位數據的時間為
1/115200 ≈ 8.68μs
。
3. 數據傳輸格式:從起始到停止
UART 傳輸 1 字節(8 位)數據的完整格式如下(以傳輸字符‘A’為例):
- 起始位:1 位,低電平(默認狀態為高電平,拉低表示傳輸開始);
- 數據位:8 位,傳輸實際數據(‘A’的 ASCII 碼為 0x41,二進制
01000001
); - 校驗位(可選):1 位,用于簡單錯誤檢測(奇校驗 / 偶校驗);
- 停止位:1 位、1.5 位或 2 位,高電平(表示傳輸結束,給接收方緩沖時間)。
- 傳輸 1 字節的總位數:1(起始)+8(數據)+1(停止)=10 位(無校驗位時),總耗時
10/115200 ≈ 86.8μs
。
4. 接收方的采樣與同步
接收方如何準確識別每一位數據?以波特率 115200 為例:
- 檢測到 “起始位”(低電平)后,等待 1.5 個比特時間(
1.5×8.68μs ≈ 13μs
),此時處于第 1 位數據的中間位置(采樣最穩定); - 此后每間隔 1 個比特時間采樣一次,依次獲取 8 位數據;
- 最后檢測到 “停止位”(高電平),完成一次傳輸。
5. 容錯機制:抗干擾的采樣策略
為應對信號抖動,UART 接收端采用 “多次采樣” 策略(以 16 次采樣為例):
- 起始位校驗:需滿足 3 個條件 —— 前 2 次采樣為低電平、中間 3 次(8/9/10)為低電平、最后 2 次為低電平,才認定為有效起始位;
- 數據位校驗:中間 3 次采樣(8/9/10)中,若 2 次為 0 則判定為 0,2 次為 1 則判定為 1。
6. 校驗位:簡單的錯誤檢測
校驗位用于檢測數據傳輸中的偶然錯誤,分為奇校驗和偶校驗:
- 奇校驗:數據位中 “1” 的個數為奇數(包括校驗位);
- 偶校驗:數據位中 “1” 的個數為偶數(包括校驗位)。
- 例:傳輸‘A’(二進制
01000001
,含 2 個 1):- 奇校驗:校驗位需為 1(總個數 3,奇數);
- 偶校驗:校驗位需為 0(總個數 2,偶數)。
三、波特率與比特率的區別
- 波特率:每秒傳輸的 “信號狀態數”(波形變化次數);
- 比特率:每秒傳輸的 “有效數據位數”(bit/s)。
多數情況下,1 個信號狀態對應 1 位數據,因此波特率 = 比特率(如 UART)。
特殊場景:若 1 個信號狀態表示 2 位數據(如 00.7V=00,0.81.5V=01),則比特率 = 波特率 ×2(例:2ms 傳輸 2 個狀態,對應 4 位數據,波特率 = 500 波特,比特率 = 1000bit/s)。
結尾
UART 協議通過 “異步傳輸 + 約定格式” 實現了簡單可靠的串行通信,其核心是波特率同步和數據幀格式。下一篇我們將聚焦 STM32 的 UART 硬件結構,學習如何通過 CubeMX 配置 UART,并結合環形緩沖區實現高效的串口數據收發。
Hello_Embed 繼續帶你從協議原理到硬件實戰,掌握嵌入式通信的核心技能,敬請期待~