
USART 串口详解
1. 什么是 UART?

UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器) 是一种把并行数据与串行数据互相转换的硬件外设,也是一套异步串行通信约定。
- 串行:数据在一根线上一位一位地传,用时间换引脚数量。对比并行总线(8 根数据线同时传),串口只需 TX/RX 两根线,成本低、线缆少、抗干扰相对好。

- 异步:收发双方没有共享时钟线,各自用自己的时钟,靠事先约定的波特率对齐每一位的时长。

- 全双工:TX、RX 独立,可同时收发。

- 点对点:一个发送端对一个接收端(多机需走地址模式或 RS-485 总线)。
- 物理层 + 数据链路层的混合体:UART 既规定了"电平怎么表示 0/1"(物理层),又规定了"一帧怎么打包"(数据链路层),但没有规定上层协议(帧头、校验、重传要自己做)。
一句话:
串口 = 把一个字节拆成一位一位,按约定的节奏(波特率)和格式(帧格式)在两根线上送出去、再拼回来。
2. 初步理解 UART 定义
2.1 内部结构
┌────────────── USART 外设 ──────────────┐
CPU 总线 ◄──► │ 发送数据寄存器 TDR(并行,1 字节) │
│ │ 自动搬运 │
│ ▼ │
│ 发送移位寄存器 ──逐位──► TX 引脚 │
│ │
│ RX 引脚 ──逐位──► 接收移位寄存器 │
│ │ 自动拼装 │
│ ▼ │
│ 接收数据寄存器 RDR(并行,1 字节)──► CPU│
│ │
│ 波特率发生器(BRR + 分频) │
│ 控制寄存器 CR1/CR2/CR3 │
│ 状态寄存器 ISR(TXE/TC/RXNE/ORE…) │
└────────────────────────────────────────┘
双缓冲:
发送/接收各有"数据寄存器 + 移位寄存器"两层。
数据寄存器对接 CPU(并行),移位寄存器对接引脚(串行)。
这样在移位输出当前字节的同时,CPU 就能准备下一个字节,效率更高。
2.2 发送一个字节的完整过程(以 0x41 = 'A' 为例)
2.3 接收端如何"对准"每一位——过采样
没有时钟线,接收端靠**过采样(oversampling)**自己对表:
- STM32 默认 16 倍过采样:一个数据位期间有 16 个采样时钟。
- 检测到起始位下降沿后开始计时,在每位的第 8、9、10 个采样点(位中心附近)采 3 次,3 选 2 多数表决确定该位。
- 作用:抗毛刺、抗抖动,并容忍一定波特率误差。
2.4 通信成立的四个前提
波特率、数据位数、校验方式、停止位数——收发两端必须完全一致,否则乱码或收不到。
3. MCU 和串口
3.1 串口属于 MCU 片上外设
串口不是软件模拟出来的(虽然也能软件模拟),而是 MCU 芯片内部集成的一块独立硬件(片上外设/IP 核),和 GPIO、定时器、ADC 一样挂在总线上:
- 独立硬件工作:一旦配置好,移位、采样、帧打包/解包、波特率计时全部由硬件自动完成,不需要 CPU 逐位参与。CPU 只需"写一个字节进去 / 读一个字节出来"。
- 挂在 APB 总线上:以 STM32 为例,USART1 挂 APB2,USART2/3 等挂 APB1,波特率时钟就来自对应总线时钟(fCK)。
- 有自己的寄存器组:数据寄存器(TDR/RDR)、波特率寄存器(BRR)、控制寄存器(CR1/CR2/CR3)、状态/中断寄存器(ISR)。
- 三种工作方式:轮询、中断、DMA(3.4 节展开)。
- 引脚是复用关系:USART 外设的 TX/RX 信号要通过 GPIO 复用功能(AF) 引到芯片外部引脚上,引脚不配置 AF,外设是"接不到线"的。
理解这一点很关键:串口通信 = 片上 USART 硬件自动干活,CPU 只负责配置和搬运数据。
3.2 UART 和 USART

| 全称 | Universal Asynchronous Receiver/Transmitter | Universal Synchronous/Asynchronous Receiver/Transmitter |
| 异步模式 | 支持 | 支持(就是 UART 模式) |
| 同步模式 | 不支持 | 支持(多一根 SCLK 时钟线,主机给时钟) |
| 扩展协议 | 无 | 部分型号支持 LIN、SmartCard、IrDA |
| 日常用途 | 异步串口 | 99% 场景用它的异步模式,即"串口" |
STM32 等芯片标注的都是 USART,因为它是 UART 的"超集";我们说的串口通信,实际用的是 USART 的异步模式。
3.3 4 方关系
一次串口通信涉及四个角色,数据必须依次穿过它们,这就是"4 方关系":
① CPU 内核 ② USART 外设 ③ GPIO 引脚 ④ 外部设备
┌────────┐ 读写寄存器 ┌──────────┐ 内部连线 ┌────────┐ 板级连线 ┌────────┐
│ 程序 │ ───────────► │ TDR/移位 │ ──────────► │ TX(AF) │ ────────► │ 对方 RX │
│ 内存 │ │ 寄存器 │ │ RX(AF) │ ◄──────── │ 对方 TX │
│ │ ◄─────────── │ RDR/移位 │ ◄────────── │ │ │ │
└────────┘ AHB/APB └──────────┘ 复用功能 └────────┘ TTL电平 └────────┘
| ① CPU 内核 | 数据源头/终点,执行收发代码 | 通过总线读写 TDR/RDR |
| ② USART 外设 | 并串转换、波特率生成、帧打包解包、过采样 | 开外设时钟、配 BRR/CR 寄存器、使能 TE/RE |
| ③ GPIO 引脚 | 把外设信号引到芯片外部 | 开 GPIO 时钟、配复用功能 AF、对应引脚号 |
| ④ 外部设备 | 通信对端(USB-TTL 模块、另一 MCU、蓝牙/GPS 模块) | 接线 TX↔RX、共地、电平匹配 |
发送数据流:
CPU → 总线 → TDR → 发送移位寄存器 → TX 引脚(AF)→ 外部设备 RX。
接收数据流:
外部设备 TX → RX 引脚(AF)→ 接收移位寄存器 → RDR → 总线 → CPU。
为什么要强调 4 方关系:
初学者常以为"串口就是两根线",实际上数据要穿过 CPU → 外设 → 引脚 → 对端 四层,任何一层没配好都不通——没开外设时钟、没配 AF、没使能 TE/RE、接线错误,现象都是"串口没反应",排查时要逐层定位。
3.4 MCU 和 USART 设备通信的宏观过程和问题
宏观发送过程:
CPU 写 TDR → 硬件自动按帧格式、波特率逐位移出 → 完成置标志。
宏观接收过程:
RX 引脚检测到起始位下降沿 → 16 倍过采样收齐一帧 → 数据进 RDR 并置 RXNE → CPU 必须及时读走。
由此产生几个核心问题,也是工程设计的出发点:
1. 速度严重不匹配:CPU 是 ns 级,串口是 µs 级(115200 下一字节 86.8µs)。CPU 不能傻等,于是有三种处理方式:
|
轮询 |
while 死等 TXE/RXNE 标志 |
简单 | 阻塞、占满 CPU、易丢数据 | 数据量极小 |
|
中断 |
RXNE/TXE 触发中断,在 ISR 里搬运 |
实时、不阻塞主程序 | 高频中断有开销 | 常规收发 |
|
DMA |
外设与内存间硬件直搬,CPU 不参与 |
几乎零 CPU 占用、最适合连续流 | 配置稍复杂 | 高速/大批量 |
2. 数据会丢(ORE):RDR 只有一字节缓冲,新字节到了旧字节还没读走 → 过载错误、数据被覆盖。解决:中断/DMA + 软件环形缓冲区(FIFO)。
3. 不定长数据怎么收:UART 是字节流,没有"包"的概念。常用方案:DMA + IDLE 空闲中断(总线空闲即一包结束,用 DMA 剩余计数差值算包长)、帧头+长度字段、超时判断。
错误处理:FE(帧错误)、PE(校验错误)、NE(噪声)、ORE(过载),需要在中断里读状态、清标志、丢弃坏帧。
4. 双端一致性:波特率/帧格式必须一致;电平要匹配(TTL↔RS-232/USB/RS-485 需转换芯片)。
5. 可靠性要在协议层补:UART 只保证"位"的传输,不保证内容正确,需自定帧头帧尾 + 长度 + CRC + 应答重传
4. 比特率 vs 波特率
| 比特率 | Bit Rate | 单位时间内传输的二进制比特总数 | bit/s(bps) |
| 波特率 | Baud Rate | 单位时间内传输的码元(符号)总数 | Baud |
4.1.1 比特率(Bit Rate)
- 定义:每秒传输的二进制比特(bit)数量,衡量的是信息传输速度。
- 单位:bps(bit per second,比特/秒),也写作 bit/s、b/s。
- 公式:比特率 = 每秒传输的比特总数。
- 例子:1 秒传 115200 个 0/1,比特率就是 115200 bps。
- 关注点:它描述"有效信息传多快",与编码方式无关,只数实际比特。
4.1.2 波特率(Baud Rate)

- 定义:每秒信号状态(符号 Symbol)变化的次数,衡量的是信号波形变化速度。
- 单位:Baud(波特)。
- 符号:一个符号可以是一个电平、一个相位、一个载波状态。
- 二者关系:
比特率 = 波特率 × 每个符号携带的比特数
= 波特率 × log₂(M),M = 符号状态数
- 二进制 NRZ(普通串口):只有高/低两个状态,M=2,一个符号 = 1 比特,所以:
115200 Baud = 115200 bps ← 串口场景数值相等
- 多电平调制(说明二者不等的场景):
| NRZ(串口) | 2 | 1 | 10 kbps |
| QPSK | 4 | 2 | 20 kbps |
| 16QAM | 16 | 4 | 40 kbps |
- 常见误区:
- "波特率就是比特率"——只在 1 比特/符号时数值相等,概念不同。
- "115200 波特 = 每秒 115200 字节"——错,8N1 下一字节占 10 位(见第 7 节)。
- 在通信/射频领域:波特率决定占用带宽,比特率决定实际吞吐。
5. USART 速度与波特率
5.1 波特率由时钟分频产生
USART 没有独立振荡器,波特率来自外设总线时钟 fCK 分频:
异步、16 倍过采样(OVER8=0):波特率 = fCK / (16 × USARTDIV)
异步、8 倍过采样(OVER8=1):波特率 = fCK / (8 × USARTDIV)
同步模式: 波特率 = fCK / (2 × USARTDIV)
5.2 BRR 寄存器结构
BRR:[15:4] = DIV_Mantissa(整数部分)
[ 3:0] = DIV_Fraction(小数部分 × 16)
USARTDIV = fCK / (16 × 目标波特率)
Mantissa = USARTDIV 的整数部分
Fraction = USARTDIV 小数部分 × 16(四舍五入)
BRR = (Mantissa << 4) | Fraction
5.3 算例
例 1:fCK = 72 MHz,目标 115200(精确)
USARTDIV = 72e6/(16×115200) = 39.0625
Mantissa = 39,Fraction = 0.0625×16 = 1
BRR = (39<<4)|1 = 0x271
实际波特率 = 72e6/(16×39.0625) = 115200 ✅
例 2:fCK = 8 MHz,目标 9600(有量化误差)
USARTDIV = 8e6/(16×9600) = 52.0833
Mantissa = 52,Fraction = 0.0833×16 ≈ 1.33 → 取 1
实际波特率 = 8e6/(16×52.0625) ≈ 9603.8
误差 ≈ +0.04% ✅
5.4 误差分析与常见速率
- 分频小数位只有 4 位(8 倍过采样时 3 位),必然有量化误差。工程上要求收发两端总误差控制在 ±2%~3% 内;帧越长、连续字节越多,对误差越敏感(详见第 7 节)。
- 8 倍过采样可在相同时钟下支持更高波特率,但采样次数少、抗噪能力略降。
| 9600 | ≈1.04 ms | ≈960 B/s | 老设备/长线 |
| 38400 | ≈260 µs | ≈3.8 KB/s | 一般模块 |
| 115200 | ≈86.8 µs | ≈11.5 KB/s | 调试黄金速率 |
| 460800 | ≈21.7 µs | ≈46 KB/s | 高速 |
| 921600 | ≈10.9 µs | ≈92 KB/s | 高速(需高精度时钟) |
5.5 自动波特率检测(ABR)
部分 MCU 支持自动波特率:接收端根据主机发来的已知特征字节(如 0x7F、0x55)测量边沿间隔,自动算出波特率并写回 BRR,用于主机速率未知或可变的场景。
6. USART 帧格式
一帧的完整结构:
| 空闲态 | 任意长度 | 高电平 | 总线无数据时保持,代表线路空闲 |
| 起始位 | 固定 1 位 | 低电平 | 从高到低的跳变,通知接收方 “一帧数据开始” |
| 数据位 | 5/6/7/8/9 位 | 0/1 | 有效载荷,低位 (LSB) 在前,高位 (MSB) 在后;最常用 8 位(1 字节) |
| 校验位 | 0/1 位 | 0/1 | 可选,奇校验 / 偶校验,用于检测传输错误 |
| 停止位 | 0.5/1/1.5/2 位 | 高电平 | 表示一帧结束,给接收方准备时间;最常用 1 位 |
6.1.1 空闲状态(Idle State)
- 定义:线上没有数据传输时,保持高电平(逻辑 1)。
- 为什么是高而不是低:高电平作为"静止基准",起始位用低电平才能产生明确的下降沿;同时持续高电平可让接收端区分"总线空闲"和"一直被拉低(断线/异常)"。
- IDLE 事件:当总线在收到数据后重新回到一帧以上的高电平,硬件置 IDLE 空闲标志。这是"DMA + IDLE 收不定长数据"的关键——一包数据发完、总线空闲,就触发中断,软件据此判定一包结束。
- 空闲帧:一整帧时长的高电平,区别于后面的断开帧。
6.1.2 起始位(Start Bit)
- 长度:固定 1 位,低电平。
- 作用:
- 帧同步起点:从空闲高到起始低的下降沿,通知接收端"一帧开始了",接收端从这一刻开始按波特率计时。
- 对表:异步通信没有时钟,全靠这个边沿重新对齐,消除累积误差。
- 防误触发:接收端在下降沿后还要连续多次采样确认确实为低(防止一个毛刺被误判成起始位),确认后才在后续位中心采样。
- 起始位不携带数据,是纯开销。
6.1.3 数据位(Data Bits)
- 长度可配 5~9 位,最常用 8 位(正好一个字节)。
- 发送顺序:数据 LSB ( Least Significant Bit :最低有效位 ) 最先发送,然后是次低位,依此类推,最后发送 MSB ( Most Significant Bit :最⾼有效位 )。

- 每位由接收端在位中心用 16 倍过采样 + 3 次多数表决还原。
- 字长配置细节(STM32):
- 无校验 + 8 数据位 → 字长 M 位设 8。
- 带校验时,校验位占字长中的一位:要发 8 数据 + 1 校验,字长要设成 9(M=1),这是常见配置坑。
- 9 数据位用于多机地址模式(第 9 位标记地址帧/数据帧)。
- 数据位是帧里唯一携带有效信息的部分,其余都是开销。
6.1.4 校验位(Parity Bit)
- 位置:紧跟数据位之后、停止位之前,1 位,可选。
- 三种方式:
| 无校验 None | 不发校验位 | 8N1 |
| 偶校验 Even | 数据位+校验位中 1 的个数为偶数 | 已有 2 个 1(偶),校验位=0 |
| 奇校验 Odd | 1 的个数为奇数 | 已有 2 个 1,校验位=1 凑成 3 |
- 接收端重新计算并比对,不符则置 PE(Parity Error)。
- 局限:
- 只能检错,不能纠错(不知道哪一位错)。
- 只能检出奇数个位翻转;偶数个位同时翻转会漏检。
- 可靠传输仍需上层 CRC/校验和 + 重传。
- 代价:多 1 位开销(约 10% 时间),所以多数场景用 8N1。
6.1.5 停止位(Stop Bits)
- 电平:高电平(回到空闲态)。
- 长度可配:0.5、1、1.5、2 位,最常用 1 位(8N1);2 位用于部分老式设备。
- 作用:
- 标志一帧结束,给接收端整理、准备下一帧的时间。
- 保证下一帧起始位之前线上一定是高电平,从而下一帧起始位的下降沿一定存在。
- 帧错误检测:接收端预期停止位时刻采样,如果采到的是低电平(没有正常高电平停止位),判定 FE(Framing Error)——最常见原因是波特率不匹配或干扰。
- 停止位也是开销:2 位停止比 1 位慢约 10%。
7. USART 帧格式与波特率(综合)
7.1 核心公式
单帧时长 = (1 起始位 + 数据位数 + 校验位 + 停止位数) / 波特率
有效数据率 = 波特率 × 数据位数 / 每帧总位数
7.2 算例对照(115200)
| 8N1 | 10 | 86.8 µs | 92.16 kbps ≈ 11.5 KB/s |
| 8E1/8O1 | 11 | 95.5 µs | 83.8 kbps ≈ 10.2 KB/s |
| 8N2 | 11 | 95.5 µs | 83.8 kbps ≈ 10.2 KB/s |
115200 波特 ≠ 115200 字节/秒:
8N1 每字节实际占 10 位,真实上限 115200/10 ≈ 11520 B/s。
7.3 波特率容差(为什么高速更易乱码)
收发时钟偏差 δ 沿整帧累积,第 N 位采样点偏移约 N×δ 个位周期,超过约半个位周期就采错:
单帧理论容忍 ≈ 0.5 / 帧位数
8N1(10 位)≈ 5%;考虑过采样表决和噪声,工程上取 ±2%~3% 更稳
帧越长、连续字节越多,误差累积越大;
低速(9600)比高速(115200+)对晶振误差宽容。
内部 RC 振荡器温漂大,高速串口建议用外部晶振。
7.4 工程选型
- 速率:稳定优先 9600~38400;均衡 115200;高速 460800+(短线、低干扰、高精度时钟)。
- 帧格式:默认 8N1;需检错用 8E1/8O1;多机用 9 位地址模式或 RS-485。
- 收发方式:小数据轮询,常规中断 + 环形缓冲,连续大数据 DMA + IDLE。
- 可靠性:协议层做帧头帧尾 + 长度 + CRC + 应答重传。
8. 常见错误与排查
| 完全乱码,全是不可打印字符 | ①波特率不匹配;②数据位 / 校验位 / 停止位不一致;③TX/RX 接反 |
| 个别字符错误、丢包 | ①波特率误差过大;②没有共地;③电磁干扰;④接收溢出 ORE |
| 只能发不能收 | ①RE 接收使能没开;②RX 引脚配置错误;③波特率误差大 |
| 只能收不能发 | ①TE 发送使能没开;②TX 引脚配置错误;③TXE 没等待 |
| 前几个字节正常,后面乱码 | 接收溢出错误 ORE,CPU 读太慢,新数据覆盖旧数据 |
| 偶发错误,干扰时出错 | ①线路太长;②没有屏蔽;③电平不匹配 |
9. 面试题库(含解析)
A. 基础概念
1. UART 全称和作用?
通用异步收发器。把并行数据转串行按位发送、把串行数据拼回并行,实现两设备异步串行通信。
2. UART 和 USART 的区别?
USART 是同步/异步收发器,比 UART 多同步模式(SCLK 时钟线)及LIN/SmartCard/IrDA 等扩展;日常串口用的是 USART 的异步模式。
3. 为什么叫异步?没有时钟线怎么同步?
双方不共享时钟,靠约定波特率 + 起始位下降沿对表,接收端用 16 倍过采样在每位中心采样还原数据。
4. 串口最少几根线?为什么共地?
TX、RX、GND 三根(单向可两根)。GND 是电平参考,不共地则双方高低电平基准不一致,会乱码甚至损坏接口。
5. 串口属于 MCU 的什么?为什么说它是片上外设?
是集成在芯片内部的独立硬件外设(IP 核),挂在 APB 总线上,配置好后移位、采样、帧打包全部硬件自动完成,CPU 只需读写数据寄存器,不必逐位参与。
B. 结构与过程
6. 串口通信的"4 方关系"是什么?
CPU 内核(数据源/终点)、USART 外设(并串转换+波特率+帧处理)、GPIO 引脚(AF 复用把信号引出)、外部设备(对端)。数据依次穿过四层,任一层配置缺失都不通。
7. 数据从程序到对方设备经过哪些环节?
CPU 写 TDR → 发送移位寄存器逐位移出 → TX 引脚(AF)→ 板级连线 → 对方 RX;接收反向。
8. 轮询、中断、DMA 三种收发方式怎么选?
数据量极小用轮询(简单但阻塞);
常规突发用中断(实时但高频中断有开销);
高速连续流用 DMA(硬件直搬、CPU 零占用,常配 IDLE 中断收不定长)。
9. 什么是 ORE?怎么避免丢数据?
过载错误:RDR 里旧字节未读走、新字节又到,旧数据被覆盖。
避免方法:及时开 RXNE 中断/DMA 取走数据,并用环形缓冲区缓存。
10. 怎么用串口接收不定长数据包?
DMA 把字节直搬到内存 + IDLE 空闲中断判定一包结束,用 DMA 剩余计数(CNDTR 前后差值)算出本次实际字节数;也可用帧头+长度字段或超时判断。
C. 帧格式与原理
11. 8N1 一帧多少位?由什么组成?
10 位 = 1 起始位 + 8 数据位 + 无校验 + 1 停止位。
12. 空闲状态为什么是高电平?
作为静止基准,使起始位能产生明确下降沿;同时区分"空闲"与"线被持续拉低"的断线/异常状态。
13. 起始位为什么是低电平、几位?
固定 1 位低电平,用高→低的下降沿标记帧起点并给接收端对表;
接收端还会连续采样确认,防毛刺误触发。
14. 数据位先发高位还是低位?可配几位?
低位在前(LSB first);可配 5~9 位,常用 8 位。
15. 带校验时 STM32 字长怎么配?为什么?
校验位占用字长一位,8 数据 + 1 校验要把字长设为 9 位(M=1),否则会出现数据错位。
16. 奇偶校验怎么算?能纠错吗?
偶校验保证数据+校验中 1 的个数为偶,奇校验为奇。
只能检错不能纠错,且偶数位同时翻转会漏检;可靠传输靠上层 CRC。
17. 停止位几位、什么电平、有什么用?
高电平,可配 0.5/1/1.5/2 位,常用 1 位。
标志帧结束、给接收端准备时间,并保证下一帧起始位下降沿存在。
18. FE 帧错误是什么原因?
预期停止位时刻采到低电平,常见于波特率不匹配或线路干扰。
D. 波特率与计算
19. 波特率和比特率的区别?何时相等?
波特率是每秒符号变化次数(Baud),比特率是每秒比特数(bps),关系为 比特率=波特率×log₂(状态数)。二进制串口 1 符号=1 比特,数值相等;QPSK/QAM 等多电平调制下不等。
20. BRR 寄存器怎么算?
举例。 USARTDIV=fCK/(16×波特率),BRR=(整数部分<<4)|(小数部分×16)。72MHz 配 115200:USARTDIV=39.0625,BRR=0x271,实际恰好 115200。
21. 115200 波特每秒最多传多少字节?
8N1 每字节 10 位:115200/10≈11520 B/s≈11.5 KB/s,不是 115200 字节。
22. 波特率误差多少能接受?为什么高速更容易乱码?
工程上两端总误差控制在 ±2%~3%。
误差沿帧逐位累积,帧越长、速率越高,采样点越容易偏移到位边界,所以高速更敏感。
23. 什么是 16 倍过采样?作用?
每位用 16 个采样时钟,在位中心采 3 次多数表决,抗毛刺抖动、容忍波特率误差;
8 倍过采样可支持更高速率但抗噪略差。
E. 综合与工程
24. TXE 和 TC 的区别?RS-485 为什么用 TC 切方向?
TXE 表示 TDR 已空(可写下一字节);TC 表示整帧(含停止位)已完全移出。
RS-485 半双工,必须等数据真正发完才能把 DE 切回接收,所以用 TC。
25. 3.3V MCU 和 5V MCU 串口能直连吗?
3.3V 发 5V 收一般可识别但余量小;
5V 发 3.3V 收可能损坏引脚,应加电平转换芯片、开漏上拉或分压。
26. 为什么工业现场用 RS-485 而不是 TTL 串口?
TTL 单端电平易受共模干扰、传不远;
RS-485 差分传输抗干扰强、可传 1200m+、支持多节点总线。
27. 串口乱码排查顺序?
① 波特率与帧格式两端一致;
② TX/RX 是否接反、是否共地;
③ 电平是否匹配;
④ 外设/GPIO 时钟和 AF 复用是否配置;
⑤ 晶振精度与干扰;
⑥ 错误标志(FE/PE/ORE)。
28. UART 本身可靠吗?怎么做可靠传输?
UART 只保证位传输,不保证内容正确。
协议层需加帧头帧尾、长度、CRC/校验和、序号、应答与超时重传。

