1. 课程导入

无人机飞控系统并不是一块孤立的电路板,而是由飞控主控、电调、云台、GPS/RTK、光流、激光测距、电池管理、遥控接收机等多个子系统通过总线与串行链路协同工作的嵌入式网络。CAN 与 UART 是其中最常见的两类物理层通信方式:CAN 具备差分抗扰、多主仲裁、错误检测与非破坏性重发能力,适合电机转速指令、电池状态、舵机控制等实时性要求高的场景;UART 结构简单、成本低、生态成熟,广泛用于 GPS 定位数据、数传电台、光流模块、调试串口等点对点通信。本课程的目标,是让学习者从“会调用串口读写函数”进阶到“能独立设计并调试一套稳定可靠的无人机设备驱动”。

一、学习目标:从接口认知到驱动落地

完成本课程后,学习者应达到以下四个层次的能力:

  • 接口层:理解 CAN 的帧格式、位定时、终端电阻、ID 过滤与 UART 的波特率、数据位、校验位、流控等基础参数,能根据器件手册正确配置外设。
  • 驱动层:掌握 Linux 下 SocketCAN、TTY 子系统的设备模型,能编写字符设备或网络设备驱动,完成中断/DMA 收发、环形缓冲区管理、阻塞与非阻塞读写。
  • 协议层:能设计面向无人机的轻量应用层协议,包括帧头、长度、命令字、负载、CRC 校验、序号与超时重传机制。
  • 系统层:具备多设备并发、错误恢复、日志追踪与性能评估能力,能定位丢帧、乱序、总线关闭、串口粘包等典型问题。

二、核心概念:CAN 与 UART 的本质差异

CAN 是总线型、多主、基于报文 ID 的广播网络,节点通过“线与”机制进行位仲裁,ID 越小优先级越高;它自带 CRC、应答位、错误计数器与总线关闭状态机,可靠性由控制器硬件保障。UART 是异步、点对点、无地址的字节流通道,本身不提供帧边界、校验与重传,所有可靠性机制必须由驱动或应用层补齐。理解这一差异,是后续所有设计决策的起点:CAN 驱动更关注过滤器、邮箱、总线负载与错误状态;UART 驱动更关注缓冲区、帧解析、超时与流控。

一句话记忆:CAN 是“带仲裁和校验的广播总线”,UART 是“需要自己定义帧边界的字节管道”。

三、整体知识框架与实战路线图

本课程按“硬件—内核—协议—应用—调优”的主线展开,下图给出整体知识框架与学习路径,帮助你在进入各章节前建立全局地图。

无人机 CAN / UART 设备驱动开发 · 知识框架与实战路线 CAN 设备驱动主线 CAN 控制器与收发器 位定时 / 终端电阻 / 差分 SocketCAN 设备模型 netdev / 邮箱 / 过滤器 报文收发与仲裁 标准帧 / 扩展帧 / 优先级 错误处理与总线恢复 错误计数 / Bus-Off 恢复 UART 设备驱动主线 UART 控制器与电平 TTL / RS232 / RS485 TTY 子系统与线路规程 tty_driver / ldisc 中断 / DMA 收发 环形缓冲 / 流控 帧解析与粘包处理 帧头 / 长度 / CRC 统一应用层协议与设备抽象 命令字 · 负载编码 · 序号 · CRC · 超时重传 · 状态机 · 设备注册与发现 CAN 与 UART 共用同一套上层接口,屏蔽底层差异 实战路线图:五步递进 ① 硬件与总线 接线 / 电平 / 终端 ② 内核驱动 注册 / 收发 / 中断 ③ 协议设计 帧格式 / 校验 / 重传 ④ 应用集成 设备抽象 / 状态机 ⑤ 调优与排障 负载 / 丢帧 / 日志

四、典型场景:从需求到驱动选型

假设你要为一架四旋翼无人机接入电池管理模块与 RTK 定位模块。电池模块需要以 100 Hz 上报电压、电流、温度与剩余电量,并要求飞控在异常时快速下发断电指令;RTK 模块以 5 Hz 输出 NMEA 语句与原始观测数据,数据量大但实时性要求相对宽松。此时合理的选型是:电池模块走 CAN,利用其优先级仲裁保证断电指令优先发送;RTK 模块走 UART,利用其高吞吐与成熟解析生态。驱动设计上,CAN 侧重点在过滤器配置与 Bus-Off 恢复,UART 侧重点在 DMA 接收与 NMEA 帧解析。

对比维度 CAN UART
拓扑结构 总线型,多主多从 点对点,一主一从
帧边界 硬件定义,天然分帧 字节流,需软件分帧
校验与重传 CRC + 应答 + 自动重发 需应用层实现 CRC 与重传
优先级 ID 仲裁,硬件保证 无,需软件调度
典型速率 125 kbps ~ 1 Mbps 9.6 kbps ~ 921.6 kbps
无人机典型用途 电调、电池、舵机 GPS、数传、光流、调试

五、常见误区与复盘建议

误区一:把 UART 当可靠通道。UART 没有应答与重传,长线缆或电磁干扰下会出现位翻转。必须在应用层加入 CRC 与序号,否则飞控可能执行错误指令。

误区二:忽略 CAN 终端电阻。总线两端各需 120 Ω 终端电阻,缺失会导致反射与通信不稳定,表现为随机丢帧或 Bus-Off。

误区三:在中断中做耗时解析。无论 CAN 还是 UART,中断服务程序应只做数据搬运,解析与业务处理放到工作队列或用户态线程,避免阻塞系统。

建议在学习过程中建立“问题—现象—根因—验证”的复盘习惯。例如遇到 UART 粘包,先确认帧头与长度字段设计是否唯一,再用示波器或逻辑分析仪抓取原始波形,最后在驱动日志中打印接收缓冲区快照。遇到 CAN 丢帧,先读取 /proc/net/can/stats 与错误计数器,再检查总线负载与终端电阻。只有把现象与底层机制对应起来,驱动开发能力才会真正沉淀。

# 常用排查命令示例
ip -details link show can0          # 查看 CAN 位定时与状态
candump can0                        # 抓取 CAN 报文
cat /proc/net/can/stats             # 查看 CAN 统计与错误
stty -F /dev/ttyS3 -a               # 查看 UART 当前参数
cat /sys/class/tty/ttyS3/uartclk    # 查看 UART 时钟