UART 与 USART 中的波特率、停止位、数据位、起始位、CK 作用详解
嵌入式 裸机&RTOS开发杂谈系列 第六章
UART 与 USART 中的波特率、停止位、数据位、起始位、CK 作用详解
UART 和 USART 都用于串行通信,但它们对齐数据帧的方式不同:UART 只支持异步模式,USART 既支持异步模式,也支持同步模式。
- 异步模式:通信靠起始位、波特率、数据位、停止位来对齐;
- 同步模式:通信靠CK 时钟线来对齐。
1. 波特率:异步模式下每一位的“节拍”
波特率表示每秒传输多少个码元。在常见 UART/USART 异步串口里,一个码元通常对应一位,所以波特率可以理解为“每秒传输多少位”。
常见波特率有:
- 9600
- 19200
- 38400
- 57600
- 115200
- 230400
- 460800
- 921600
波特率的作用是规定每一位持续多长时间。例如 115200 bps 时,一位大约持续:
1 / 115200 ≈ 8.68 μs异步模式下没有共享时钟线,收发双方必须预先约定相同的波特率。如果两端波特率偏差过大,接收端采样位置会逐渐偏离位中心,导致乱码或帧错误。通常要求累计误差控制在较小范围内,工程上常以 ±2%~3% 作为较稳妥目标。
2. 起始位:异步帧的“帧头”
起始位用来告诉接收端:一帧数据开始了。
UART/USART 异步模式下,总线空闲时通常保持高电平。发送端要发送一帧数据时,会先把数据线拉低,这个下降沿就是起始位。
接收端会持续检测数据线是否出现下降沿。检测到后,再通过内部过采样确认这不是噪声。确认起始位后,接收端就以它为基准,按波特率依次采样后面的数据位、校验位和停止位。
所以起始位的作用是:
- 标记帧开始;
- 让接收端重新对齐采样位置;
- 补偿异步通信没有共享时钟带来的时序漂移。
3. 数据位:真正传输的数据内容
数据位是一帧中承载实际数据的部分。
常见数据位长度为:
- 7 位
- 8 位
- 9 位
最常用的是 8 位数据,因为正好对应一个字节。数据位通常低位先发,高位后发。
数据位长度必须收发一致。如果一端配置 8 位,另一端配置 9 位,接收端会把停止位或校验位误认为数据位,导致解析错误。
需要注意的是,UART/USART 的数据位只负责传输原始位流。更上层的帧头、长度、命令字、校验和、帧尾,都需要应用层协议自己定义。
4. 停止位:异步帧的“帧尾”
停止位用来标记一帧结束,并使总线恢复到空闲高电平状态。
常见停止位有:
- 1 位
- 1.5 位
- 2 位
最常用的是 1 位停止位。
停止位的作用包括:
- 告诉接收端当前帧已经结束;
- 让总线回到高电平,便于检测下一帧的起始位下降沿;
- 给接收端留出恢复时间;
- 在一定程度上吸收波特率误差。
停止位越长,抗误差能力通常越强,但传输效率会下降。
5. CK:同步模式下的共享时钟线
CK 是 USART 同步模式下使用的时钟信号线,也可以称为 SCK、CLK 或 SCLK。
同步模式下,硬件连接通常包括:
- TX:主机发送数据线;
- RX:主机接收数据线;
- CK/SCK:主机输出的时钟线;
- GND:共地线。
CK 的作用是:由主设备产生时钟,从设备按照时钟边沿采样数据。
也就是说,接收端不再需要猜测“这一位什么时候开始、这一位什么时候结束”,而是直接看 CK 边沿。
同步模式下通常还会配置:
- CPOL:时钟空闲电平是高还是低;
- CPHA:在第几个时钟边沿采样数据;
- Last Bit Clock:最后一个数据位是否输出时钟脉冲。
6. 为什么 CK 能在同步模式下替代起始位和波特率?
这是 UART/USART 最关键的区别。
异步模式为什么需要起始位和波特率?
异步模式没有共享时钟线,接收端不知道发送端什么时候开始发数据,也不知道每一位持续多久。所以它必须依赖三件事:
- 起始位:提供帧头,让接收端知道“现在开始采样了”。
- 波特率:让接收端按约定节奏推算每一位的位置。
- 停止位:标记帧结束,并让总线恢复高电平,便于检测下一帧起始位。
但这种方式有一个问题:接收端只在起始位处对齐一次,后面每一位都靠本地时钟推算。如果两端时钟有偏差,采样点会逐渐漂移,帧越长越容易出错。
同步模式为什么不需要起始位和波特率?
同步模式下,CK 时钟线把发送端和接收端的采样节奏直接绑在一起。
发送端每输出一个数据位,CK 就会给出一个对应的时钟边沿;
接收端不需要猜测位边界,只需要在指定时钟边沿采样;
每一位的起止位置都由 CK 明确给出,而不是由波特率推算;
数据可以连续传输,不需要每字节都插入起始位和停止位。
因此,CK 能替代起始位和波特率,是因为它把“时间基准”从 各自本地时钟 + 约定波特率 变成了 共享时钟边沿。
更直白地说:
- 起始位解决的是“什么时候开始采”的问题;
- 波特率解决的是“每隔多久采一次”的问题;
- CK则同时解决了这两个问题:时钟边沿既告诉接收端现在采,也规定了下一次采的时间点。
所以同步模式下,数据帧不再依赖起始位和停止位做逐位对齐,传输效率更高,时序也更严格。
7. 异步模式与同步模式对比
对比项 UART / USART 异步模式 USART 同步模式
时钟线 无 有 CK/SCK
同步方式 起始位 + 波特率 CK 时钟边沿
起始位 必须有 通常不需要
停止位 必须有 通常不需要
波特率 必须一致且误差小 不依赖波特率对齐
传输效率 每字节有起始位/停止位开销 数据可连续传输,效率更高
典型场景 调试串口、蓝牙、GPS、WiFi 模块 高速外设、芯片间同步通信
8. 工程上如何理解这五个参数
可以这样记:
- 波特率:异步模式下,规定每一位有多长。
- 起始位:异步模式下,告诉接收端帧从哪里开始。
- 数据位:承载实际数据。
- 停止位:异步模式下,告诉接收端帧到哪里结束。
- CK:同步模式下,用共享时钟边沿直接规定每一位的采样时刻。
9. 一句话总结
UART/USART 异步模式靠起始位找帧头、靠波特率推算每一位、靠停止位结束帧;USART 同步模式则用 CK 时钟线提供共享采样节拍,接收端直接沿时钟边沿采样,因此不再依赖起始位和波特率来完成位级对齐。