3.18. UART 基础

UART(通用异步收发器,Universal Asynchronous Receiver-Transmitter)是在两个微控制器之间,或在微控制器与主机 PC 之间传输字节的最古老、最简单的方式。两根线承载数据——每个方向一根——并由共用的地线返回信号。两端都不运行共享时钟;它们事先约定一个 波特率,并从数据线本身恢复出每个比特的时序。

3.18.1.

线上的每个字符都被封装在一个帧里:一个起始位、若干数据位、一个可选的奇偶校验位,以及一个或两个停止位。

A UART frame waveform. The signal sits idle high on the left, falls low for one bit time (the start bit), then carries eight data bits in sequence, then returns high for one bit time (the stop bit) before returning to idle.

一个 UART 帧:一个起始位、八个数据位和一个停止位,每一位宽度为一个比特周期(1 / baudrate 秒)。

线路空闲时为高电平。接收器监视下降沿,它标志着一个新帧的开始。然后接收器每个比特周期采样数据线一次——通常在每个比特的中间——并将这些比特重新组装成一个字符。停止位使线路返回空闲状态,以便能够检测到下一个起始位。

3.18.2. 波特率

比特周期——以及链路的速度——由 波特率 决定,即每秒的比特数。9600192003840057600115200230400460800921600 是标准取值;115200 是最常用的默认值。两端必须在百分之几的误差范围内约定相同的波特率,否则接收器会在错误的位置采样比特,返回的数据会出现乱码。

更高的波特率每秒传输更多数据,但对线缆长度、电容以及两端时钟的精度更敏感。对于同一工作台上两块板子之间的短链路,115200921600 都能轻松工作。

3.18.3. 接线

一条 UART 链路使用三根线:

Two boards labelled A and B, connected by three wires. Board A's TX pin connects to board B's RX pin; board B's TX pin connects to board A's RX pin; and both boards' ground pins are tied together.

UART 接线:一块板子上的 TX 连到另一块板子的 RX,两块板子的地连接在一起。

  • TX → RX,双向均如此。 每块板子的发送引脚是另一块板子的接收引脚。新手常犯的一个错误是将 TX → TX 接线——两个输出相互对抗,结果两个接收端都收不到数据。

  • 共用地。 信号电平是以地为参考的,因此两块板子必须有共同的地,否则接收器会在线路上看到错误的电压。

3.18.4. 电压电平与物理层

摄像头 UART 引脚上的信号电平为 3.3 V CMOS:逻辑零为地电平,逻辑一为 3.3 V。任何使用 3.3 V CMOS UART 通信的设备——另一个微控制器、设置为 3.3 V 的 USB 转串口适配器、3.3 V 的 GPS 模块——都可以直接连接。

备注

5 V CMOS UART 设备(较旧的微控制器、某些 GPS 模块、一些较旧的传感器扩展板)使用相同的 UART 帧格式,但工作在 5 V 逻辑电平。将它们直接连到摄像头是不安全的:5 V 的 TX 驱动摄像头的 RX,会超过不耐 5 V 的摄像头的绝对最大输入电压;而摄像头的 3.3 V TX 也可能达不到 5 V 设备所需的高电平阈值,无法产生干净的逻辑一。

在这两种电压之间转换需要一个 有源线路驱动器——一个专用的双向电平转换 IC,它在每条线路的两侧都有自己的驱动晶体管。来自 电平转换 的无源 MOSFET 加上拉电阻式电平转换器在这里是不够的:它们的上升沿依赖于通过电阻给线路充电,这在开关速度下没问题,但对 UART 来说太慢了。在 115200 波特率下每个比特持续约 8 µs,而无源转换器的 RC 压摆会把一个比特拖糊到下一个比特里。

有源线路驱动器能在全速 UART 速率下双向产生干净的边沿。选择一个额定支持链路运行波特率的器件,将摄像头的 TX 和 RX 接到转换器的 3.3 V 侧,并将 5 V 设备的 TX 和 RX 接到转换器的 5 V 侧。

另外三种较旧的物理层使用相同的帧格式但电压不同,它们与 3.3 V 微控制器之间需要一个电平转换器:

  • RS-232。 用于台式 PC 的串口和一些工业设备。线路电压大致在 ±5 V±15 V 之间摆动,空闲时位于负电平。与 CMOS 相比,它极性反转且电压较高;MAX232 / MAX3232 系列(或类似)的芯片可以处理这种转换。

  • RS-422。 一种用于点对点链路(一个驱动器,最多十个接收器)的差分信号标准。驱动器在一对平衡线上发送信号;接收器看到的是两者之间的 差值,从而忽略沿途的共模噪声。全双工链路使用两对线——每个方向一对。根据波特率不同,RS-422 的传输距离可达数十米到一千米,RS-422 收发器芯片位于摄像头的 TX / RX 与平衡线对之间。

  • RS-485。 RS-422 的多点同族标准——同样的差分信号,但设计为可在一条总线上接入多达 32 个驱动器和接收器。大多数链路是单对线上的半双工,每个节点的驱动器和接收器共用同样的线,由软件仲裁谁来发送。它用于工业自动化总线(Modbus、DMX512、Profibus),这些场合线缆走线很远且噪声很大;RS-485 收发器芯片位于摄像头的 TX / RX 与差分线对之间。

两者在底层比特层面上仍然发送 UART 帧。无论收发器另一侧由哪种物理层承载信号,摄像头的 machine.UART 配置(波特率、数据位、奇偶校验、停止位)都是一样的。