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 倍过采样示意图