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 地面站与单机建立通信链路:从零到一
好了,理论讲完,咱们动手连一架飞机。
链路建立流程:
- 硬件连接: 数传模块一端接飞控(串口),一端接地面站电脑(USB 或网口)。
- 参数配置: 确保两端波特率、信道、网络 ID 一致。我建议用默认值,除非有干扰。
- 心跳检测: 地面站发送心跳包,等待无人机回复。如果 3 秒内没收到,说明链路不通。
- 数据流启动: 地面站请求遥测数据流(如 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 是扩展。多动手,多踩坑,自然就熟了。