4. 点对点通信:串口通信原理、UDP/TCP通信、地面站与单机建立通信链路

各位同学,今天咱们聊点实在的。

地面站和无人机之间怎么说话?说白了,就是建立一条通信链路。我做了这么多年飞控系统,见过太多因为通信链路没搭好,导致飞机在天上“失联”的案例。嗯,这节课咱们就把这个基础打牢。

4.1 串口通信:最朴素的“面对面”对话

串口通信,我习惯叫它“老黄牛”。虽然速度不快,但胜在稳定、简单。很多飞控的调试口、数传模块的配置口,都是串口。

串口通信的核心三要素:

  • 波特率(Baud Rate): 说白了就是每秒传多少位。9600、115200 是常见值。两边必须一致,否则就是鸡同鸭讲。
  • 数据位、停止位、校验位: 8N1(8数据位,无校验,1停止位)是默认配置。我建议新手直接用这个,省心。
  • 电平标准: TTL(3.3V/5V)和 RS232(±12V)不一样。飞控上大多是 TTL,接 USB 转串口模块时别搞错。

避坑指南: 我曾经在项目里,因为用了根劣质的 USB 转串口线,地面站收到的数据全是乱码。折腾了两天才发现是线材屏蔽差,干扰大。所以,通信线材别省钱。

实战代码:Python 串口收发

import serial
import time

# 初始化串口
ser = serial.Serial(
    port='COM3',        # Windows 下端口号
    baudrate=115200,
    bytesize=8,
    parity='N',
    stopbits=1,
    timeout=0.5
)

# 发送 AT 指令(常用于配置数传模块)
ser.write(b'AT\r\n')
time.sleep(0.1)

# 读取响应
response = ser.read_all()
print(f"收到: {response}")

# 关闭串口
ser.close()

这段代码,我每次调试新数传模块都会用。先发个 AT 指令,看看模块有没有反应。没反应?检查接线和波特率。

4.2 UDP/TCP 通信:从“点对点”到“网络化”

串口适合近距离、一对一。但地面站和无人机之间,往往隔着几百米甚至几公里。这时候,就得靠网络协议了。

UDP vs TCP:怎么选?

特性 UDP TCP
连接方式 无连接(发就完事) 面向连接(先握手)
可靠性 不可靠(可能丢包) 可靠(重传机制)
实时性 高(延迟低) 较低(重传导致延迟)
典型应用 视频流、遥测数据 文件传输、指令下发

我个人习惯:遥测数据用 UDP,关键指令用 TCP。为什么?遥测数据丢一帧没关系,下一帧马上来;但“返航”指令丢了,飞机可能就飞丢了。

小技巧: 你想想看,地面站和无人机之间,通常用 UDP 传 MAVLink 协议。MAVLink 本身有心跳包和序列号,能检测丢包。所以 UDP 的“不可靠”其实没那么可怕。

实战代码:UDP 地面站接收端

import socket

# 创建 UDP Socket
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 绑定本地端口(地面站监听)
local_addr = ('0.0.0.0', 14550)  # MAVLink 默认端口
udp_socket.bind(local_addr)

print("地面站 UDP 监听中...")

while True:
    data, client_addr = udp_socket.recvfrom(1024)  # 接收 1024 字节
    print(f"收到来自 {client_addr} 的数据: {data.hex()}")

这段代码,我经常用来抓包分析。看看无人机发过来的 MAVLink 报文对不对。

4.3 地面站与单机建立通信链路:从零到一

好了,理论讲完,咱们动手连一架飞机。

链路建立流程:

  1. 硬件连接: 数传模块一端接飞控(串口),一端接地面站电脑(USB 或网口)。
  2. 参数配置: 确保两端波特率、信道、网络 ID 一致。我建议用默认值,除非有干扰。
  3. 心跳检测: 地面站发送心跳包,等待无人机回复。如果 3 秒内没收到,说明链路不通。
  4. 数据流启动: 地面站请求遥测数据流(如 ATTITUDE、GPS_RAW_INT)。

注意: 我曾经在野外测试时,发现地面站连不上飞机。检查了半天,结果是数传模块的电源线松了。嗯,这种低级错误,大家别犯。上电前,先检查所有接头。

核心逻辑流程图:

地面站启动 配置串口/网络参数 发送心跳包 收到回复? 链路建立 重试

这个流程,说白了就是“你喊一声,对方答应一声”。不答应?检查参数、检查硬件。

4.4 实战中的“坑”与“解”

做通信链路,最怕什么?怕不稳定。我总结几个常见问题:

  • 串口乱码: 波特率不匹配,或者地线没共地。解决办法:用示波器看波形,或者换根线。
  • UDP 丢包严重: 无线干扰,或者缓冲区太小。我建议把 socket 接收缓冲区设大一点:udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 65536)
  • TCP 连接断开: 网络波动导致。加个心跳保活机制,每 5 秒发一次空包。

我的经验: 有一次在山区测试,地面站和无人机之间隔了个小山包。UDP 丢包率高达 30%。后来我换了个 900MHz 的数传模块,穿透力强,问题就解决了。所以,通信链路不行,有时候是物理层的问题,别光在软件上找原因。

好了,这节课的内容就到这里。记住:通信链路是地面站和无人机之间的“生命线”。串口是基础,UDP/TCP 是扩展。多动手,多踩坑,自然就熟了。

专注资料整理