UART 协议层
UART 协议层
UART 是异步协议:没有时钟线,收发双方各自用本地时钟按约定波特率对数据采样。协议层解决的核心问题就是:在没有时钟的情况下,接收方如何知道”数据从哪里开始、到哪里结束”。
帧格式
UART 把数据打包成帧(Frame)传输,一帧的结构:
空闲 ── 起始位 ── 数据位(LSB→MSB) ── 校验位(可选) ── 停止位 ── 空闲
| 组成部分 | 位宽 | 说明 |
|---|---|---|
| 起始位(Start) | 1 bit | 固定逻辑 0,把空闲态的高电平拉低,告诉接收方”帧开始了” |
| 数据位(Data) | 5~9 bit,常用 8 | LSB first,先发最低位 |
| 校验位(Parity) | 0~1 bit | 可选,奇校验 / 偶校验 |
| 停止位(Stop) | 1 / 1.5 / 2 bit | 固定逻辑 1,帧结束,回到空闲态 |
一帧 8N1 数据(0x55,LSB first)
0x55 = 0101_0101,LSB first 发送序列即 1 0 1 0 1 0 1 0,与起始位/停止位拼起来波形规律、便于示波器观察:
{
signal: [
{ name: "TX", wave: "10333333331", data: "start d0=1 d1=0 d2=1 d3=0 d4=1 d5=0 d6=1 d7=0 stop" }
]
}
空闲态与起始位检测
- 空闲态:总线保持高电平(逻辑 1);
- 起始位:发送方拉低总线 1 bit 时间,接收方检测到这个下降沿即认为一帧开始;
- 接收方从起始位的下降沿起,延迟 0.5 bit 时间采样一次确认是起始位,之后每隔 1 bit 时间采样数据位——即”中点采样”,抗抖动能力最好。
校验位
校验位是发送方对数据位的简单检错:
| 类型 | 规则 |
|---|---|
| 无校验(N) | 不发送校验位 |
| 偶校验(E) | 校验位取值使”数据位 + 校验位”中 1 的个数为偶数 |
| 奇校验(O) | 校验位取值使”数据位 + 校验位”中 1 的个数为奇数 |
接收方按同样规则计算,若不一致说明传输出错(UART 没有重传机制,是否处理由上层决定)。
常见帧格式写法
帧格式通常用 数据位-校验-停止位 简写:
- 8N1:8 数据位、无校验、1 停止位(最常用,PC 串口默认)
- 8E1:8 数据位、偶校验、1 停止位
- 8O1:8 数据位、奇校验、1 停止位
接收方采样原理
接收方本地时钟与发送方不可能完全同频,为减小累计误差,接收逻辑一般以波特率的 16 倍过采样:
- 检测到起始位下降沿后,计数 8 个采样周期(即 0.5 bit)到达数据位中点;
- 此后每 16 个采样周期采一个数据位,始终落在每一位的正中;
- 双方波特率误差通常在 ±3% 以内可稳定通信(一位的中点偏移不会跨出该位)。
📌 待补图:UART 接收方 16 倍过采样示意图