第2章:UART总线详解:协议原理、波特率与帧格式、飞控中的典型应用

大家好,我是你们的飞控架构讲师。今天我们来聊聊UART——这个在飞控系统里最基础、也最常用的通信总线。

说实话,UART这玩意儿看起来简单,但坑不少。我见过不少新手,甚至一些老工程师,都在UART上栽过跟头。今天我就把UART的底裤扒干净,从原理到实战,一次讲透。

2.1 UART协议原理:说白了就是两根线的事

UART的全称是Universal Asynchronous Receiver/Transmitter,通用异步收发器。名字挺长,但原理很简单。

它只需要两根数据线:

  • TXD:发送数据线
  • RXD:接收数据线

注意,是交叉连接的。你的TXD接对方的RXD,你的RXD接对方的TXD。这个我当年第一次焊板子时就搞反过,结果调了半天,最后发现是线接错了。嗯,这种低级错误,犯过一次就不会再犯了。

UART是异步通信,什么意思?就是没有单独的时钟线。收发双方靠什么同步?靠约定的波特率。这个我们后面细说。

它的通信方式是全双工的,可以同时收发。这一点在飞控里很重要,比如一边接收GPS数据,一边发送数传数据,互不干扰。

核心要点:UART是异步、全双工、点对点的串行通信协议。硬件简单,成本低,但通信距离有限(通常几米内)。

2.2 波特率与帧格式:别小看这个参数

波特率,说白了就是每秒传输多少个比特位。单位是bps(bits per second)。

飞控里常用的波特率有:

波特率 典型应用 备注
9600 旧款GPS模块、某些数传 速度慢,但抗干扰强
38400 Pixhawk默认数传 平衡速度和稳定性
57600 GPS模块、遥控器接收机 我常用的速率
115200 高速数传、调试串口 速度快,但线长时容易丢包
921600 内部调试、高速传感器 慎用,对硬件要求高

帧格式是什么样的?

一个标准的UART数据帧包含:

  1. 起始位:1位,逻辑0,表示开始传输
  2. 数据位:通常5-8位,飞控里几乎都用8位
  3. 校验位:可选,奇校验或偶校验。我一般不用,因为数据包层面已经有校验了
  4. 停止位:1位或2位,逻辑1,表示帧结束

最常见的配置是:8N1——8位数据、无校验、1位停止位。这个配置在飞控里占了90%以上的场景。

我的习惯:调试阶段先用115200 8N1,稳定后再根据实际需求调整。别一上来就搞921600,万一硬件不支持,你查错查到怀疑人生。

2.3 飞控中UART的典型应用

飞控上的UART口,少则三五个,多则十几个。每个口都有它的使命。我按实际项目经验,给你捋一捋。

2.3.1 GPS模块

GPS模块是UART的典型用户。它不断往外吐NMEA协议的数据,或者更高效的UBX协议数据。

波特率通常是38400或57600。我建议用57600,数据更新率能到10Hz以上。

避坑指南:我曾经遇到过GPS模块和飞控的波特率不匹配,导致定位数据时有时无。排查了半天,最后发现是GPS模块默认是9600,而飞控配置的是38400。所以,拿到新模块,第一件事就是确认波特率。

2.3.2 数传电台

数传是飞控和地面站之间的桥梁。常用的有433MHz、915MHz、2.4GHz等频段。

数传的波特率设置很讲究。地面端和空中端必须一致,否则连不上。

我个人的经验是:数传波特率不要超过115200。因为数传是无线链路,受干扰影响大。你设得太高,丢包率会急剧上升。我曾经在某个项目中,为了追求速度设了230400,结果飞出去500米就开始频繁断连。降到57600后,稳如老狗。

2.3.3 遥控器接收机

现在的遥控器接收机,很多都用SBUS协议,但SBUS的物理层其实也是UART。它用的是反相UART,波特率100000,8E2格式。

嗯,这里要注意:SBUS的波特率是100000,不是标准的9600、115200这些。很多新手在这里翻车。

另外,有些老款接收机还用PPM或PWM,但UART接口的接收机越来越多了。比如CRSF协议,也是基于UART的。

重要提醒:飞控的UART口电平可能是3.3V或5V。GPS模块通常是3.3V,数传模块可能是5V。连接前一定要确认电平匹配,否则烧芯片是分分钟的事。我见过不止一次,有人把5V的数传直接怼到3.3V的飞控串口上,然后...就没有然后了。

2.4 知识体系总览

下面这张图,是我画的UART在飞控中的知识体系。你可以把它当作一个快速索引。

UART总线知识体系 UART总线 协议原理 • 异步通信,无时钟线 • 全双工,TXD/RXD • 点对点连接 • 电平匹配很重要 波特率与帧格式 • 常用:9600~921600 • 帧格式:8N1最常见 • 起始位+数据位+停止位 • 收发双方必须一致 典型应用 • GPS模块:NMEA/UBX • 数传电台:MavLink • 遥控器接收机:SBUS • 调试串口:控制台 核心原则 波特率匹配 + 电平匹配 + 帧格式一致 这三点对了,UART就通了

2.5 实战中的一些碎碎念

最后,分享几个我这些年积累的小经验:

  • 中断优先级:UART中断不要设得太低,否则在高负载下容易丢数据。我一般把UART中断优先级设到中等偏上。
  • DMA是个好东西:如果MCU支持,尽量用DMA+环形缓冲区的方式处理UART数据。CPU不用一个个字节去读,效率高很多。
  • 流控:飞控里很少用硬件流控(RTS/CTS),因为线多了容易出错。但如果你接的是高速数传,可以考虑加上。
  • 接地:UART通信,GND一定要连。不连GND,信号参考点不一致,数据全是乱码。这个坑我踩过,真的。

好了,UART的内容就讲到这里。记住一句话:UART不难,但细节决定成败。波特率、电平、帧格式,这三个参数对了,你的UART通信就稳了八成。


公众号:蓝海资料掘金营,微信deep3321