STM32HAL 快速入门(十六):UART 协议 —— 异步串行通信的底层逻辑
大家好,这里是 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 继续带你从协议原理到硬件实战,掌握嵌入式通信的核心技能,敬请期待~