2. 无人机通信总线概述
无人机不是单一处理器加几个传感器的简单系统,而是一个由飞控、电调、云台、GPS/RTK、激光雷达、避障雷达、数传电台、图传模块、电池管理单元(BMS)等组成的分布式嵌入式系统。这些部件之间必须持续交换姿态、控制、状态与配置数据,因此通信总线的选型直接决定了系统的实时性、可靠性与可扩展性。在中小型无人机中,最常用的两类总线是 UART(异步串行总线)与 CAN(控制器局域网总线)。理解它们的作用边界,是后续编写设备驱动的基础。
一、两类总线在无人机中的角色定位
UART 是一种点对点、异步、全双工的串行通信接口。它没有时钟线,收发双方依靠预先约定的波特率进行采样,因此硬件成本极低,几乎所有 MCU 都自带多路 UART。在无人机中,UART 通常承担“处理器与外设模块之间的私有链路”:飞控与 GPS 模块、飞控与数传电台、飞控与光流模块、机载计算机与图传模块之间,绝大多数都是 UART 连接。它适合传输配置命令、NMEA 定位语句、MAVLink 遥测帧等中低速数据。
CAN 是一种多主、差分、带仲裁的广播式总线。它使用 CAN_H/CAN_L 双绞线传输差分信号,天然具备抗共模干扰能力,并内置 CRC 校验、应答机制与自动重发。在无人机中,CAN 主要承担“多节点实时控制网络”的角色:飞控与多个电调之间的油门/转速指令、电池管理单元上报的电压电流温度、云台与雷达的状态广播,都适合挂在同一条 CAN 总线上。CAN 的报文 ID 同时决定优先级,ID 越小优先级越高,这使得高优先级的控制帧在总线拥塞时仍能优先发送。
二、典型拓扑结构
UART 的典型拓扑是点对点星型:每个外设独占一路 UART,飞控通过 TX/RX/GND 三根线与模块相连。若飞控需要连接 6 个 UART 外设,就需要 6 路 UART 控制器,引脚和 PCB 走线都会迅速增加。这也是为什么飞控上常见“UART1 接 GPS、UART2 接数传、UART3 接光流”的固定分配方式。
CAN 的典型拓扑是总线型:所有节点并联在 CAN_H 与 CAN_L 之间,两端各接一个 120Ω 终端电阻,形成阻抗匹配,抑制信号反射。节点以短支线方式接入主干,支线长度应尽量短。这种拓扑让新增一个电调或 BMS 只需并入总线,不必占用飞控的额外串口,扩展性明显更好。
三、带宽与实时性对比
带宽方面,UART 常见波特率为 9600、57600、115200、460800、921600 bps,高波特率下有效吞吐约几十到几百 KB/s,且每帧通常只有 1 字节有效载荷加起止位,协议开销比例较高。CAN 经典帧在 1 Mbps 速率下单帧最多携带 8 字节数据,CAN FD 可扩展到 64 字节并提升数据段速率,但单节点可用带宽仍受总线仲裁与帧开销限制。
实时性方面,UART 是点对点独占链路,只要双方不丢字节,延迟基本可预测;但它没有优先级概念,一旦某路串口被大量日志占满,控制指令就会被排队延迟。CAN 依靠非破坏性仲裁实现优先级抢占,高优先级控制帧可以“插队”发送,且硬件自动重发保证不丢帧,因此在多电调同步控制场景中实时性更优。代价是 CAN 总线利用率过高时,低优先级帧可能被长时间推迟,需要合理规划报文 ID 与发送周期。
| 对比维度 | UART | CAN |
|---|---|---|
| 拓扑 | 点对点星型 | 总线型多主 |
| 物理层 | 单端 TTL/RS232/RS485 | 差分 CAN_H/CAN_L |
| 典型速率 | 115200 ~ 921600 bps | 500 kbps ~ 1 Mbps(FD 更高) |
| 单帧载荷 | 通常 1 字节起,按协议打包 | 经典 8 字节,FD 最多 64 字节 |
| 优先级机制 | 无 | ID 仲裁,越小越优先 |
| 错误检测 | 依赖上层校验 | CRC + ACK + 自动重发 |
| 抗干扰 | 较弱(单端) | 较强(差分) |
| 扩展成本 | 每设备占一路串口 | 并入总线即可 |
四、应用场景分析与选型建议
UART 适合“模块化、协议成熟、速率要求不高”的场景:GPS/RTK 输出 NMEA 或 UBX 语句、数传电台透传 MAVLink、光流模块上报速度、机载计算机与飞控之间的 MAVLink 链路。这些场景的共同点是设备数量少、协议固定、对布线复杂度敏感。
CAN 适合“多节点、强实时、强可靠”的场景:四轴/六轴的多路电调控制、电池管理单元的多节电芯数据上报、云台与避障雷达的状态广播、以及需要冗余总线的工业级无人机。当电调数量超过 4 个、或需要毫秒级同步更新转速时,CAN 的优势非常明显。
五、常见误区与复盘
- 误区一:波特率越高越好。高波特率对时钟误差和线缆质量更敏感,长距离或干扰环境下反而容易误码。应根据线长与噪声环境选择合适速率。
- 误区二:CAN 挂上就能通。缺少 120Ω 终端电阻、支线过长、共地不良都会导致通信失败,必须用示波器或 CAN 分析仪确认波形与错误帧计数。
- 误区三:UART 不需要协议。裸串口没有帧边界,必须依赖固定帧头、长度字段与校验,否则一旦丢字节就会解析错位。
- 误区四:忽略总线负载。CAN 总线利用率长期超过 70% 时,低优先级帧延迟会急剧上升,需要重新分配 ID 与发送周期。
# Linux 下查看 CAN 接口状态与错误计数
ip -details link show can0
candump can0
ip -s -d link show can0
# 配置 CAN 波特率 1Mbps 并启动
ip link set can0 type can bitrate 1000000
ip link set can0 up
# 查看 UART 设备与波特率
ls -l /dev/ttyS* /dev/ttyUSB*
stty -F /dev/ttyS1 115200 cs8 -cstopb -parenb