跳转至

遥控空口与机内CRSF、SBUS、Classic F.Port

遥控系统至少包含空中链路和机内链路。空中链路负责射频发送、接收、纠错和重传;机内链路负责接收机与飞控之间的通道、状态和遥测交换。

遥控链路分层

不要把三层混成一个名称

以常见串行接收机为例:

发射机控制输入
→ 空中协议
→ 机载接收机
→ UART电气接口
→ CRSF、SBUS或Classic F.Port机内帧
→ 飞控接收机驱动
→ 通道、链路状态和失联状态

因此:

  • ExpressLRS等名称通常描述空中系统;
  • CRSF、SBUS或Classic F.Port描述接收机与飞控之间的数据协议;
  • UART描述硬件串行接口;
  • 飞控中的通道值和失联状态是解析后的应用数据。

空中协议相同的接收机可能支持不同机内输出;机内协议相同也不代表空中链路相同。

CRSF

交叉火力串行协议(CRSF,Crossfire Serial Protocol)被多种遥控系统用作机内双向协议。当前开放规范应绑定其仓库提交,不应只引用第三方表格。

电气和字符格式

飞行端常用双线全双工、非反相UART:

  • 标准速率为416666波特;
  • 字符格式为8N1;
  • 常见逻辑电平为3.0至3.3伏;
  • 接收机TX连接飞控RX,飞控TX连接接收机RX;
  • 规范支持在设备能力和实现允许时协商更高串行速率。

遥控器与外置发射模块之间则常见单线半双工、默认400000波特,并允许反相或非反相。两段接口不能互相套用。部分飞控为兼容既有设备采用420000波特,当前TBS规范的飞行端默认值仍是416666,不能把常见实现值写成规范唯一值。

这些条件不能推导任意接收机焊盘均容忍5伏,也不能替代具体硬件手册。

标准帧

概念结构为:

[Sync/Device Address][Length][Type][Payload][CRC]

关键边界:

  • 完整帧最长64字节;
  • Length允许值为2至62;
  • LengthType开始计数,并包含末尾CRC;
  • CRC采用多项式0xD5的CRC8;
  • CRC覆盖TypePayload,不覆盖同步/地址、长度和CRC自身;
  • 多字节数字按规范采用高字节在前的网络顺序;
  • 解析器不能仅凭第一个字节称它为固定“同步字节”,因为该位置也承担设备地址语义。

扩展帧在Type之后增加目标地址与来源地址:

[Address][Length][Extended Type][Destination][Origin][Payload][CRC]

目标和来源属于CRC覆盖的数据区域。

通道帧

RC_CHANNELS_PACKED把16个通道按每通道11位打包为22字节载荷。位字段连续排列,不能按16个普通16位整数直接读取。

当前规范给出的通道中心值为992,换算示例为:

微秒值 = (ticks - 992) × 5 ÷ 8 + 1500

该消息完整普通帧为26字节,Length字段为24。使用这一换算前仍应确认接收机输出模式和飞控内部归一化方式。

通道解码还需要核对:

  • 原始范围与飞控内部范围的映射;
  • 端序和位序;
  • 帧更新率;
  • 帧间隔和超时;
  • 接收机报告的链路状态;
  • 失联后是否继续输出缓存值。

单个通道帧CRC正确,只能证明该帧在当前校验下完整,不能证明空中链路健康或数据仍然新鲜。

遥测和设备管理

CRSF还可承载:

  • 链路统计;
  • 电池、姿态、位置等遥测;
  • 设备发现与信息;
  • 参数读写;
  • 命令;
  • 扩展目标寻址。

设备参数或命令具有比只读通道更高的风险。实现必须区分消息方向、目标设备、分片、超时和权限,不能把所有合法CRSF帧直接交给任意设备功能。

Direct Command的第二层CRC

类型0x32 Direct Command除了普通CRSF外层CRC,还在命令内容末尾带有第二个命令CRC:

外层:Address | Length | Type 0x32 | Destination | Origin
内层:Command ID | Payload | Command CRC
末尾:Outer CRC
  • Command CRC采用生成多项式0xBA的CRC-8;
  • 覆盖TypeDestinationOriginCommand ID和命令载荷;
  • 普通外层CRC仍采用多项式0xD5
  • 两层都通过后,才能把命令交给状态与权限检查。

必须单独测试“外层CRC正确、命令CRC错误”的帧会被拒绝。不能因普通CRSF帧校验通过就执行Direct Command。

SBUS

SBUS是常见的接收机到飞控单向通道协议。固定版本飞控实现中常见:

  • 100000波特;
  • 8个数据位;
  • 偶校验;
  • 2个停止位,即8E2;
  • 反相信号;
  • 25字节固定帧;
  • 帧头通常为0x0F
  • 16个模拟通道按每通道11位打包;
  • 状态字节位0、位1对应数字通道17、18;
  • 状态字节位2表示帧丢失,位3表示接收机失联。

部分实现支持200000波特的Fast SBUS。发送端、接收端、反相路径和固定版本驱动必须同时支持,不能只修改一端速率。

固定长度不等于无需同步

SBUS一帧固定25字节,但解析器仍要处理:

  • 上电时从帧中间开始接收;
  • 字节丢失后重新寻找帧头;
  • 不同发送实现的结束字节;
  • 合理的帧间隔;
  • 状态位;
  • 连续有效帧确认。

仅检查第一个字节和长度,可能把载荷中的0x0F误认成新帧。Betaflight固定版本不强制末字节恒为0x00,因为部分SBUS2接收机可能在末字节携带遥测槽信息;不能用单一尾字节常量概括所有实现。

状态位比通道值更重要

接收机可能在失联时:

  • 设置帧丢失标志;
  • 设置失联标志;
  • 停止发送;
  • 继续发送某组预设值;
  • 保持最后值。

Betaflight固定版本把位3报告为完整帧加失联,把位2报告为完整帧加丢帧;这表示驱动仍可能拿到接收机重复的通道数据,而不是“没有通道字节”。飞控必须按照协议状态和新鲜度判断,不得只看油门或通道是否位于正常数值区间。完整失联测试见遥控输入与失联验证

Classic F.Port与后续协议边界

Classic F.Port把遥控通道和SmartPort遥测复用到一条串行会话中。Betaflight 2026.6.2固定实现提供以下可测试基线:

  • 115200波特、8N1;
  • 帧边界标记为0x7E
  • 转义字节为0x7D,被转义字节与0x20异或;
  • 解码后结构为长度、类型、数据和FrSky折叠加法校验;
  • 类型0x00为控制,0x01为遥测请求,0x81为遥测响应;
  • 控制载荷复用SBUS通道与状态结构,并增加接收信号强度;
  • 飞控只在有效遥测请求后进入发送路径;
  • 接收机发往飞控的控制帧和遥测请求帧由前后0x7E定界;
  • 飞控遥测响应直接发送长度、类型0x81、SmartPort载荷和校验,不再发送0x7E边界;
  • 固定实现从收到请求的末尾0x7E时刻起至少等待500微秒,并在2000微秒窗口内发送响应;
  • 错误长度、校验、类型或超时帧不得触发遥测发送。

端口可按硬件能力配置反相和半双工。若使用单线半双工,必须确认输出释放、回显和引脚驱动方式;若板级存在外部反相器,还要确认实际焊盘路径。

Classic F.Port校验

校验在去掉0x7E边界并完成0x7D转义还原后计算:

  1. 16位累加器初值为0;
  2. Length开始,逐字节累加Length + Type + Payload
  3. 每当累加值超过0xFF,把高位进位折回低8位,直到不超过0xFF
  4. 发送端写入0xFF - 折叠和作为校验字节;
  5. 接收端把Length + Type + Payload + Checksum一起累加和折叠,最终值必须为0xFF
  6. 0x7E边界不进入校验,转义字节按还原后的原始值计算。

一个最小遥测请求测试向量采用7字节全零SmartPort载荷:

线上未转义字节:
7E 08 01 00 00 00 00 00 00 00 F6 7E

Length = 08
Type = 01
Payload = 7个00
Checksum = F6

F6改成F7应得到校验失败,并且不得触发遥测响应。测试向量只用于离线解析器和隔离链路,不代表这组空载荷具有业务意义。

F.Port 2.0、FBUS和厂商后续协议不能按名称视为Classic F.Port的线兼容升级。它们不在本篇的帧级接入验证范围。使用这些协议时,必须另行固定接收机固件、正式规范、飞控驱动和板级电气路径;只看到平台菜单项不得套用上面的Classic F.Port参数。

Classic F.Port最小测试包括:

  • 边界标记分片;
  • 载荷内出现0x7E0x7D后的转义;
  • 正确与错误折叠加法校验;
  • 控制帧长度和类型;
  • 遥测请求末尾0x7E后500至2000微秒响应;
  • 响应不带0x7E边界;
  • 请求校验错误时保持静默;
  • 接收机断线后的通道新鲜度和失联状态;
  • 单线方向切换和本机回显。

三类机内协议对比

项目 CRSF SBUS Classic F.Port
常见方向 双向 接收机到飞控 单线半双工
常见字符格式 416666、8N1、非反相 100000、8E2、反相 Classic为115200、8N1
通道 支持 支持 支持
链路统计 支持消息 状态位有限 依版本
飞控到接收机遥测 支持 原生SBUS通常不承载 支持
帧边界 地址/长度/类型/CRC 25字节固定帧 Classic使用0x7E与0x7D转义
主要风险 扩展、速率、地址和实现版本 反相、8E2和失联状态 换向、反相、时隙;不含F.Port 2.0/FBUS

这张表只用于选择核验方向,不代替具体设备资料。

更新率和端到端时延

接收机串口帧率只是端到端链路的一部分:

操纵输入采样
→ 空中链路调度
→ 接收机解码
→ 机内帧等待和发送
→ 飞控串口接收
→ 接收机任务解析
→ 控制任务使用

应测量:

  • 正常帧间隔分布;
  • 最大帧间隔;
  • 丢帧和失联标志;
  • 串口错误;
  • 飞控解析更新时间;
  • 控制任务实际读取时间;
  • 链路模式或速率切换时的瞬态。

只看标称“包率”不能证明端到端时延。

失联语义

飞控侧至少区分:

  • 最近收到任意字节;
  • 最近收到格式正确帧;
  • 最近收到有效通道帧;
  • 帧丢失标志;
  • 接收机声明失联;
  • 飞控新鲜度超时;
  • 恢复后连续有效帧。

收到设备信息或遥测帧不等于收到新控制通道。恢复也不应只依赖一帧偶然有效数据。

兼容性记录

发射机与射频模块:
空中协议与版本:
接收机硬件与固件:
接收机机内输出模式:
飞控平台、版本和目标:
实体UART及反相路径:
速率、字符格式和单双工:
协议驱动:
通道映射与范围:
帧丢失/失联行为:
遥测方向与消息:
正常帧率、最大间隔和错误计数:

安全测试

执行任何断链、信号线断开或主动发送前,必须先完成协议审查与测试卡第0节,并按抓包、解码、一致性与版本迁移保存原始证据。前置不满足时只允许被动观察。

  1. 拆除螺旋桨并固定机体;
  2. 保存发射机、接收机和飞控版本与配置;
  3. 被动捕获正常通道帧;
  4. 逐一移动输入,核对位字段和飞控逻辑通道;
  5. 保存链路统计、帧率和错误计数;
  6. 用受控方式中断空中链路,观察接收机输出;
  7. 断电后断开机内信号,重新上电观察飞控超时;
  8. 恢复链路,验证连续有效帧和重新解锁阻止;
  9. 恢复原配置并保存差异。

禁止在装桨或已解锁状态下用协议注入验证通道、失联或恢复。

常见误判

  • 把ExpressLRS写成接收机到飞控的帧格式;
  • 把UART写成遥控协议;
  • 把CRSF的遥测请求或设备消息当成通道帧;
  • 把CRC正确等同于空中链路健康;
  • 只解码SBUS通道,不读取帧丢失和失联位;
  • 假设所有SBUS尾字节完全相同;
  • 把Fast SBUS只作为飞控侧配置;
  • 把F.Port当作普通全双工UART;
  • 链路恢复一帧后立即允许重新解锁。

检查理解

  1. 空中协议、机内协议和UART分别位于哪一层?
  2. CRSF的Length包含哪些部分?
  3. 为什么16个11位CRSF通道恰好占22字节?
  4. SBUS通道值正常时为什么仍可能处于失联?
  5. Classic F.Port为什么必须检查总线换向,且不能把其参数套用于F.Port 2.0或FBUS?

主要参考