第2章:UART总线详解:协议原理、波特率与帧格式、飞控中的典型应用
大家好,我是你们的飞控架构讲师。今天我们来聊聊UART——这个在飞控系统里最基础、也最常用的通信总线。
说实话,UART这玩意儿看起来简单,但坑不少。我见过不少新手,甚至一些老工程师,都在UART上栽过跟头。今天我就把UART的底裤扒干净,从原理到实战,一次讲透。
2.1 UART协议原理:说白了就是两根线的事
UART的全称是Universal Asynchronous Receiver/Transmitter,通用异步收发器。名字挺长,但原理很简单。
它只需要两根数据线:
- TXD:发送数据线
- RXD:接收数据线
注意,是交叉连接的。你的TXD接对方的RXD,你的RXD接对方的TXD。这个我当年第一次焊板子时就搞反过,结果调了半天,最后发现是线接错了。嗯,这种低级错误,犯过一次就不会再犯了。
UART是异步通信,什么意思?就是没有单独的时钟线。收发双方靠什么同步?靠约定的波特率。这个我们后面细说。
它的通信方式是全双工的,可以同时收发。这一点在飞控里很重要,比如一边接收GPS数据,一边发送数传数据,互不干扰。
2.2 波特率与帧格式:别小看这个参数
波特率,说白了就是每秒传输多少个比特位。单位是bps(bits per second)。
飞控里常用的波特率有:
| 波特率 | 典型应用 | 备注 |
|---|---|---|
| 9600 | 旧款GPS模块、某些数传 | 速度慢,但抗干扰强 |
| 38400 | Pixhawk默认数传 | 平衡速度和稳定性 |
| 57600 | GPS模块、遥控器接收机 | 我常用的速率 |
| 115200 | 高速数传、调试串口 | 速度快,但线长时容易丢包 |
| 921600 | 内部调试、高速传感器 | 慎用,对硬件要求高 |
帧格式是什么样的?
一个标准的UART数据帧包含:
- 起始位:1位,逻辑0,表示开始传输
- 数据位:通常5-8位,飞控里几乎都用8位
- 校验位:可选,奇校验或偶校验。我一般不用,因为数据包层面已经有校验了
- 停止位:1位或2位,逻辑1,表示帧结束
最常见的配置是:8N1——8位数据、无校验、1位停止位。这个配置在飞控里占了90%以上的场景。
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的。
2.4 知识体系总览
下面这张图,是我画的UART在飞控中的知识体系。你可以把它当作一个快速索引。
2.5 实战中的一些碎碎念
最后,分享几个我这些年积累的小经验:
- 中断优先级:UART中断不要设得太低,否则在高负载下容易丢数据。我一般把UART中断优先级设到中等偏上。
- DMA是个好东西:如果MCU支持,尽量用DMA+环形缓冲区的方式处理UART数据。CPU不用一个个字节去读,效率高很多。
- 流控:飞控里很少用硬件流控(RTS/CTS),因为线多了容易出错。但如果你接的是高速数传,可以考虑加上。
- 接地:UART通信,GND一定要连。不连GND,信号参考点不一致,数据全是乱码。这个坑我踩过,真的。
好了,UART的内容就讲到这里。记住一句话:UART不难,但细节决定成败。波特率、电平、帧格式,这三个参数对了,你的UART通信就稳了八成。
公众号:蓝海资料掘金营,微信deep3321