虽然 USB 几乎完全取代那些旧电缆和连接器,但 UART 绝对不会成为过去。您会发现许多 DIY 电子项目都使用 UART。

将 GPS 模块、蓝牙模块和 RFID 读卡器模块连接到您的 Raspberry Pi、Arduino、ESP32 或其他微控制器 MCU。

UART 是通用异步接收器/发送器。它不同于 SPI、I2C 那样的通信协议,而是微控制器中的物理电路,或者说是独立的 IC。UART 的主要用途是传输和接收串行数据。

UART 的优点之一是它只使用两条线在设备之间传输数据。UART 背后的原理很容易理解。

UART 通信简介

在 UART 通信中,两个 UART 直接相互通信。发送端 UART 将来自微控制器设备的并行数据转换为串行形式,将其串行数据传输到接收端 UART。

然后接收端 UART 将串行数据转换回并行数据。在两个 UART 之间传输数据只需要两根线。数据从发送端 UART 的 Tx 引脚流向接收端 UART 的 Rx 引脚。

UART 接线方式

UART 使用异步传输数据,这意味着它们没有时钟信号同步发送端 UART 的输出位,到接收端的 UART 采样位。

发送端 UART 数据帧之间添加开始位和停止位标识数据开始和结束,所以接收端的知道什么开始或者停止读取数据帧的位。

波特率是衡量数据的传输速度,你可能听说一个单位 bps,也就是每秒传输的比特位,要准确的传输数据,两端的 UART 必须在同样的波特率下工作。

发送端UART 和接收端 UART 之间的波特率只能相差约 10%,否则位的时序会相差太远,数据传输会发生错误。两端的 UART 还必须配置相同的数据包结构,才能发送和接收。

UART 工作原理

UART 从 MCU 数据总线接收将要传输的数据。数据总线可以通过 MCU 发送数据到UART。

数据以并行形式从数据总线传输到发送端 UART。发送端 UART 从数据总线获取并行数据后,添加一个起始位、一个奇偶校验位和一个停止位,创建数据包。

接下来,数据包在 Tx 引脚逐位串行输出。接收端 UART 在其 Rx 引脚上逐位读取数据包。

然后将数据转换回并行形式并删除起始位、奇偶校验位和停止位。最后,接收 端UART 将数据包并行传输到MCU的数据总线。

UART 数据传输

UART 传输的数据被组织成数据包。每个数据包包含 1 个起始位、5 到 9 个数据位、一个可选的奇偶校验位和 1 到 2 个停止位。

UART 数据帧

起始位

UART 数据传输线在不传输数据时通常保持在高电平。当开始进行数据传输,发送端 UART 将传输线从高电平拉至低电平。

当接收端 UART 检测到从高电平到低电平的转换时,它开始以波特率的频率读取数据帧(Data Frame)的比特位。

数据帧

数据帧包含正在传输的实际数据。如果使用奇偶校验位,它可以是 5 位到 8 位长。如果不使用奇偶校验位,数据帧可以是 9 位长。在大多数情况下,数据首先以最低有效位发送。

奇偶校验位

奇偶性描述了数字的偶数或奇数。奇偶校验位是接收端 UART 判断数据在传输过程中是否发生变化的一种方式。

电磁辐射、不匹配的波特率或长距离数据传输可能会导致数据位的翻转。接收端UART 读取数据帧后。统计值为 1 的位数,判断总数是偶数还是奇数。

如果奇偶校验位为 0(偶校验),则数据帧中的 1 总和应为偶数。如果奇偶校验位为 1(奇校验),则数据帧中的 1 总和应为奇数。

当奇偶校验位与数据匹配时,UART 知道传输没有错误。但如果校验位为 0,则 1 的总数为奇数。或者奇偶校验位为 1,且 1 的总数为偶数,UART 知道数据帧中的位发生了变化。

停止位

为了发出数据包结束的信号,发送 UART 将数据传输线从低电压驱动到高电压至少两位持续时间。

UART 传输步骤

1. 发送端 UART 从数据总线并行接收数据:

微控制器的数据总线传输数据到发送端 UART

2. 发送端 UART 向数据帧添加起始位、奇偶校验位和停止位:

发送端 UART 添加开始位,数据帧,奇偶校验,停止位

3. 整个数据包从发送端 UART 串​​行发送到接收端 UART。接收端 UART 以程序预先配置的波特率对数据线进行采样:

发送端 UART 开始发送数据到接收端 UART 

4. 接收端 UART 从数据帧中丢弃起始位、奇偶校验位和停止位:

接收端 UART 移除开始位,奇偶校验,停止位

5.  接收端 UART 将串行数据转回并行传输到 MCU 的数据总线上:

接收端 UART 发送数据到 MCU 数据总线

UART 优点和缺点

没有一种通信协议是完美的,但 UART 非常擅长它们的工作。以下是一些优缺点,可帮助您确定它们是否适合您的项目需求:

优点

  • 只用两根线
  • 不需要时钟信号
  • 有一个奇偶校验位以允许错误检查
  • 数据包的结构是可以改变的,只要两边都设置好即可
  • 有据可查和广泛使用的方法

缺点

  • 数据帧的大小限制为最大 9 位
  • 不支持多从或多主系统
  • 每个 UART 的波特率必须在彼此的 10% 以内