遥控空口与机内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伏,也不能替代具体硬件手册。
标准帧¶
概念结构为:
关键边界:
- 完整帧最长64字节;
Length允许值为2至62;Length从Type开始计数,并包含末尾CRC;- CRC采用多项式
0xD5的CRC8; - CRC覆盖
Type和Payload,不覆盖同步/地址、长度和CRC自身; - 多字节数字按规范采用高字节在前的网络顺序;
- 解析器不能仅凭第一个字节称它为固定“同步字节”,因为该位置也承担设备地址语义。
扩展帧在Type之后增加目标地址与来源地址:
目标和来源属于CRC覆盖的数据区域。
通道帧¶
RC_CHANNELS_PACKED把16个通道按每通道11位打包为22字节载荷。位字段连续排列,不能按16个普通16位整数直接读取。
当前规范给出的通道中心值为992,换算示例为:
该消息完整普通帧为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; - 覆盖
Type、Destination、Origin、Command 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转义还原后计算:
- 16位累加器初值为0;
- 从
Length开始,逐字节累加Length + Type + Payload; - 每当累加值超过
0xFF,把高位进位折回低8位,直到不超过0xFF; - 发送端写入
0xFF - 折叠和作为校验字节; - 接收端把
Length + Type + Payload + Checksum一起累加和折叠,最终值必须为0xFF; 0x7E边界不进入校验,转义字节按还原后的原始值计算。
一个最小遥测请求测试向量采用7字节全零SmartPort载荷:
把F6改成F7应得到校验失败,并且不得触发遥测响应。测试向量只用于离线解析器和隔离链路,不代表这组空载荷具有业务意义。
F.Port 2.0、FBUS和厂商后续协议不能按名称视为Classic F.Port的线兼容升级。它们不在本篇的帧级接入验证范围。使用这些协议时,必须另行固定接收机固件、正式规范、飞控驱动和板级电气路径;只看到平台菜单项不得套用上面的Classic F.Port参数。
Classic F.Port最小测试包括:
- 边界标记分片;
- 载荷内出现
0x7E或0x7D后的转义; - 正确与错误折叠加法校验;
- 控制帧长度和类型;
- 遥测请求末尾
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节,并按抓包、解码、一致性与版本迁移保存原始证据。前置不满足时只允许被动观察。
- 拆除螺旋桨并固定机体;
- 保存发射机、接收机和飞控版本与配置;
- 被动捕获正常通道帧;
- 逐一移动输入,核对位字段和飞控逻辑通道;
- 保存链路统计、帧率和错误计数;
- 用受控方式中断空中链路,观察接收机输出;
- 断电后断开机内信号,重新上电观察飞控超时;
- 恢复链路,验证连续有效帧和重新解锁阻止;
- 恢复原配置并保存差异。
禁止在装桨或已解锁状态下用协议注入验证通道、失联或恢复。
常见误判¶
- 把ExpressLRS写成接收机到飞控的帧格式;
- 把UART写成遥控协议;
- 把CRSF的遥测请求或设备消息当成通道帧;
- 把CRC正确等同于空中链路健康;
- 只解码SBUS通道,不读取帧丢失和失联位;
- 假设所有SBUS尾字节完全相同;
- 把Fast SBUS只作为飞控侧配置;
- 把F.Port当作普通全双工UART;
- 链路恢复一帧后立即允许重新解锁。
检查理解¶
- 空中协议、机内协议和UART分别位于哪一层?
- CRSF的
Length包含哪些部分? - 为什么16个11位CRSF通道恰好占22字节?
- SBUS通道值正常时为什么仍可能处于失联?
- Classic F.Port为什么必须检查总线换向,且不能把其参数套用于F.Port 2.0或FBUS?