通信协议基础:MAVLink协议简介、消息类型与心跳包、串口与UDP通信原理

做地面站开发,说白了就是跟飞控「对话」。你得知道它说什么语言,用什么方式把话说清楚。这个语言就是 MAVLink。我最早接触它的时候,觉得不就是个通信协议嘛,后来踩了几个坑才明白——不懂协议细节,地面站就是个摆设。

MAVLink 协议是什么?

MAVLink 全称 Micro Air Vehicle Link,是无人机领域的事实标准。它由苏黎世联邦理工学院的 Lorenz Meier 在 2009 年提出,现在由 Dronecode 基金会维护。

它的核心思想很简单:用最少的字节,传最多的信息。你想想看,飞控的算力和带宽都有限,不可能像 HTTP 那样动不动就发几百个字节的 JSON。MAVLink 的报文结构非常紧凑,v1 版本最小只有 8 字节,v2 版本也才 12 字节起步。

MAVLink 的两个版本

特性MAVLink v1MAVLink v2
最小报文长度8 字节12 字节
消息 ID 范围0–2550–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 通信流程 MAVLink 通信流程 传感器数据采集 MAVLink 封装 串口 / UDP 发送 物理链路 物理链路 串口 / UDP 接收 MAVLink 解析 地面站显示 说明: 飞控采集传感器数据 → 封装为 MAVLink 报文 → 通过串口或 UDP 发送 → 地面站接收并解析 → 显示在界面上。 心跳包每秒发送一次,其他消息按需发送。串口适合近距离有线连接,UDP 适合远程无线连接。

从这张图可以看得很清楚:飞控端采集传感器数据,封装成 MAVLink 报文,然后通过串口或 UDP 发送出去。地面站收到后,解析报文,提取出姿态、位置、电池等信息,最后显示在界面上。

这里面最容易出问题的地方,就是传输层。串口的波特率、UDP 的端口号、IP 地址,任何一个配错了,地面站就收不到数据。我建议你在写代码之前,先用串口助手或者 UDP 调试工具验证一下链路通不通。

本章核心要点

  • MAVLink v2 是当前推荐版本,支持消息签名
  • 心跳包是飞控的「生命信号」,每秒发送一次
  • 串口通信需要匹配波特率、数据位、停止位
  • UDP 适合远程和多机场景,延迟低但可能丢包
  • 开发调试用串口,正式部署用 UDP