4. UART通信基础
UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)是无人机飞控、GPS、数传、光流、避障等外设最常用的低速串行接口之一。它不像CAN那样具备总线仲裁与差分抗扰能力,却以“点对点、无时钟线、协议简单、几乎每颗MCU都自带”的特点,成为调试口、参数配置口和传感器数据口的首选。理解UART,关键不是记住“波特率9600”,而是理解异步串行通信如何在没有共享时钟的情况下,靠起始位、数据位、校验位和停止位把一个个字节可靠地“对齐”并还原出来。
一、异步串行通信原理:没有时钟线,如何对齐每一位
UART通信双方只连接TX、RX和GND三根线(交叉连接:A的TX接B的RX,A的RX接B的TX)。发送方在空闲时保持高电平;当要发送一个字节时,先拉低一个位时间作为起始位,接收方检测到下降沿后启动内部采样时钟,按约定波特率在每个位时间的中间点采样,依次读取数据位、校验位和停止位。停止位恢复高电平,表示一帧结束,线路回到空闲态,等待下一帧。
由于没有时钟线,双方必须事先约定相同的波特率。若波特率偏差过大,采样点会逐渐漂移到相邻位,导致误码。工程上通常要求双方波特率误差控制在2%以内,长帧或高波特率时要求更严。接收方一般对每个位进行3次采样(如16倍过采样中的第7、8、9个时钟),取多数值,以抑制毛刺。
二、波特率、数据位、停止位与校验位:一帧到底由什么组成
UART的一帧由起始位、数据位、可选校验位和停止位组成。常见配置写作“波特率-数据位-校验-停止位”,例如“115200 8N1”表示波特率115200、8位数据、无校验、1位停止位。波特率表示每秒传输的码元数,对UART而言一位就是一个码元,因此波特率等于位速率。发送一个字节实际占用的位数是1+数据位+校验位+停止位,8N1时共10位,所以115200波特率下理论字节吞吐约为11520字节/秒。
| 参数 | 常见取值 | 作用与影响 |
|---|---|---|
| 波特率 | 9600、19200、57600、115200、460800、921600 | 决定位时间;双方必须一致,误差通常需小于2% |
| 数据位 | 7、8、9 | 一个字符的有效位数;多数传感器用8位,部分协议用9位做地址/数据区分 |
| 校验位 | None、Even、Odd、Mark、Space | 简单检错,不能纠错;无人机高速链路常关闭以降低开销 |
| 停止位 | 1、1.5、2 | 给接收方留出帧间恢复时间;长线或低质量链路可用2位提高容错 |
| 流控 | 无、RTS/CTS、XON/XOFF | 防止接收缓冲区溢出;高速大数据量场景建议硬件流控 |
三、流控与常见电气标准:从TTL到RS-232、RS-485
当接收方处理不过来时,若发送方仍持续发送,就会丢数据。硬件流控使用RTS/CTS两根额外信号线:接收方准备好时拉低RTS(请求发送)或释放CTS(清除发送),发送方据此暂停。软件流控则用XON/XOFF特殊字符控制,简单但会占用数据通道,不适合二进制数据。无人机中,飞控与数传、图传之间若波特率较高且数据突发,建议启用硬件流控或增大DMA环形缓冲区。
电气标准决定“0”和“1”用什么电压表示。TTL UART常见0V/3.3V或0V/5V,只能板内短距离连接;RS-232使用正负电压(如-12V表示1,+12V表示0),抗扰和距离优于TTL,但仍是单端;RS-485/RS-422使用差分双绞线,共模抑制强,适合几十米到上千米的工业与无人机地面链路。连接不同标准时必须使用电平转换芯片,否则可能损坏MCU引脚。
# Linux 下查看与配置 UART 的常用命令
stty -F /dev/ttyS1 -a # 查看当前串口参数
stty -F /dev/ttyS1 115200 cs8 -cstopb -parenb # 115200 8N1
stty -F /dev/ttyS1 crtscts # 启用 RTS/CTS 硬件流控
# 飞控中常见的 UART 配置片段(以 ArduPilot 参数为例)
SERIAL1_BAUD = 115 # 115200
SERIAL1_PROTOCOL = 2 # MAVLink2
BRD_SER1_RTSCTS = 1 # 自动检测/启用硬件流控
四、案例与排障:无人机UART链路常见问题
某无人机使用GPS模块接飞控UART,地面站偶尔出现定位跳变。排查发现GPS波特率被误设为9600,而飞控端为115200,双方帧完全错位。将两端统一为115200后恢复。另一案例中,数传在高波特率下频繁丢包,原因是未启用硬件流控且接收任务被高优先级中断长时间抢占。启用RTS/CTS并改用DMA接收后,丢包率显著下降。
常见误区:①只改一端波特率;②TTL与RS-232直接对接;③忽略GND共地;④用软件流控传输二进制固件;⑤长距离仍用TTL电平。以上都会导致通信不稳定甚至损坏接口。
调试建议:先用示波器或逻辑分析仪抓TX波形,确认起始位下降沿和位宽;再用已知字符串(如“AT\r\n”)回环测试;最后逐步提高波特率并观察误码。对无人机链路,优先保证共地、电平匹配和缓冲区充足,再考虑校验与流控策略。
掌握UART的帧结构、参数匹配和电气标准,是后续在无人机上编写CAN/UART设备驱动、解析传感器协议和设计可靠通信链路的基础。只有把“位”对齐了,上层协议才有意义。