通信协议基础:MAVLink协议简介、消息类型与心跳包、串口与UDP通信原理
做地面站开发,说白了就是跟飞控「对话」。你得知道它说什么语言,用什么方式把话说清楚。这个语言就是 MAVLink。我最早接触它的时候,觉得不就是个通信协议嘛,后来踩了几个坑才明白——不懂协议细节,地面站就是个摆设。
MAVLink 协议是什么?
MAVLink 全称 Micro Air Vehicle Link,是无人机领域的事实标准。它由苏黎世联邦理工学院的 Lorenz Meier 在 2009 年提出,现在由 Dronecode 基金会维护。
它的核心思想很简单:用最少的字节,传最多的信息。你想想看,飞控的算力和带宽都有限,不可能像 HTTP 那样动不动就发几百个字节的 JSON。MAVLink 的报文结构非常紧凑,v1 版本最小只有 8 字节,v2 版本也才 12 字节起步。
MAVLink 的两个版本
| 特性 | MAVLink v1 | MAVLink v2 |
|---|---|---|
| 最小报文长度 | 8 字节 | 12 字节 |
| 消息 ID 范围 | 0–255 | 0–16777215 |
| 签名支持 | 无 | 可选(防止篡改) |
| 兼容性 | 基础 | 向下兼容 v1 |
我个人习惯用 v2 版本。为什么?因为 v2 支持消息签名,这在做商业级地面站时是刚需。有一次我在项目中调试,发现地面站收到了「幽灵数据」——后来查出来是有人在同一个频段发了伪造的 MAVLink 包。加了签名之后,这种问题再没出现过。
消息类型与心跳包
MAVLink 定义了上百种消息类型。但别慌,你真正需要关心的其实就几类。
核心消息类型
- HEARTBEAT(心跳包):每秒 1 次,告诉地面站「我还活着」
- SYS_STATUS:系统状态,电池电压、传感器健康度等
- GPS_RAW_INT:GPS 原始数据,经纬度、海拔、卫星数
- ATTITUDE:姿态数据,横滚、俯仰、偏航
- GLOBAL_POSITION_INT:全局位置,融合了 GPS 和 IMU
- RC_CHANNELS:遥控器通道值
这里面最特殊的就是心跳包。它就像人的脉搏,一旦断了,地面站就得报警。
心跳包的结构(v2 版本)
字节偏移 字段 说明
0 STX 起始标志 0xFD
1 LEN 载荷长度
2 SEQ 序列号
3 SYS_ID 系统 ID(飞控通常是 1)
4 COMP_ID 组件 ID(飞控是 1,地面站是 240)
5–8 MSG_ID 消息 ID(HEARTBEAT 是 0)
9+ 载荷 类型、飞控版本、自定义模式等
最后 校验和 CRC16
我曾经遇到过一个坑:地面站收不到心跳包,但飞控明明在正常工作。排查了半天,发现是串口波特率没对上。飞控设的是 115200,地面站配的是 57600。嗯,这种低级错误,犯过一次就再也不会忘了。
串口通信原理
串口是地面站和飞控之间最常用的物理连接方式。它简单、可靠,而且几乎所有飞控都支持。
串口的关键参数
- 波特率:每秒传输的符号数,常见的有 57600、115200
- 数据位:通常是 8 位
- 停止位:1 位或 2 位
- 校验位:无校验、奇校验、偶校验
说白了,串口就是一根线发数据,一根线收数据,再加一根地线。没有时钟线,所以收发双方得约定好波特率。这就像两个人打电话,得说同一种语言,还得用同一个语速。
串口通信的常见问题
- 波特率不匹配:收不到数据,或者收到乱码
- USB 转串口芯片驱动没装:CH340、CP2102、FT232 各有各的驱动
- 串口号被占用:Windows 下经常出现 COM 口冲突
- 电平不匹配:3.3V 的飞控接 5V 的串口模块,可能烧芯片
我记得有一次在野外测试,地面站突然连不上飞控了。检查了所有设置都没问题,最后发现是 USB 线接触不良。从那以后,我包里永远备着三根不同的 USB 线。
UDP 通信原理
串口适合近距离、有线连接。但如果你要做远程地面站,或者同时连接多台设备,就得用 UDP。
UDP 是 User Datagram Protocol 的缩写。它和 TCP 最大的区别是:UDP 只管发,不管收没收到。这听起来不太靠谱,但在无人机场景下反而更合适。
为什么用 UDP 而不是 TCP?
- UDP 没有重传机制,延迟更低
- UDP 支持广播和多播,一台地面站可以同时接收多架飞机的数据
- UDP 丢包了不会阻塞后续数据,适合实时性要求高的场景
你想想看,飞控每秒发 50 个姿态数据包,如果其中一个丢了,下一个马上就到。用 TCP 的话,丢一个包就得等重传,反而把后面的数据都堵住了。
UDP 地面站的典型配置
本地端口:14550(地面站监听端口)
远程端口:14550(飞控发送端口)
远程地址:192.168.1.100(飞控的 IP 地址)
协议:UDP
我做过一个项目,需要在地面站上同时监控 4 架无人机。用串口的话得接 4 根线,布线乱成一团。换成 UDP 之后,一台电脑、一个交换机、4 个 IP 地址,干干净净。每架飞机发自己的心跳包,地面站根据系统 ID 区分它们。
串口 vs UDP:怎么选?
| 场景 | 推荐方式 | 原因 |
|---|---|---|
| 开发调试 | 串口 | 简单直接,不需要网络配置 |
| 室内测试 | 串口或 UDP | 看距离,10 米以内串口也行 |
| 野外飞行 | UDP + 数传电台 | 距离远,支持无线传输 |
| 多机编队 | UDP | 支持广播,一台地面站管多架飞机 |
| 高可靠性场景 | 串口 | 有线连接,不受无线干扰 |
我个人习惯是:开发阶段用串口,方便看日志;正式测试用 UDP,灵活性强。但不管用哪种,都得先确认飞控那边配好了对应的协议和端口。
MAVLink 通信的整体流程
下面这张图展示了地面站和飞控之间通过 MAVLink 通信的完整链路。从飞控的传感器数据采集,到 MAVLink 封装,再到串口或 UDP 传输,最后地面站解析显示——每一步都环环相扣。
从这张图可以看得很清楚:飞控端采集传感器数据,封装成 MAVLink 报文,然后通过串口或 UDP 发送出去。地面站收到后,解析报文,提取出姿态、位置、电池等信息,最后显示在界面上。
这里面最容易出问题的地方,就是传输层。串口的波特率、UDP 的端口号、IP 地址,任何一个配错了,地面站就收不到数据。我建议你在写代码之前,先用串口助手或者 UDP 调试工具验证一下链路通不通。
本章核心要点
- MAVLink v2 是当前推荐版本,支持消息签名
- 心跳包是飞控的「生命信号」,每秒发送一次
- 串口通信需要匹配波特率、数据位、停止位
- UDP 适合远程和多机场景,延迟低但可能丢包
- 开发调试用串口,正式部署用 UDP