EdgeTX Lua脚本开发:制作Payload并通过ELRS遥测发送至Betaflight飞控
理解EdgeTX Lua中
crossfireTelemetryPush的Payload制作与MSP通信逻辑 核心参数拆解
crossfireTelemetryPush就两个关键参数:
- 第一个参数:帧类型:告诉接收机/飞控这帧数据的用途,比如Betaflight用的是CRSF的Display Port帧,对应值是
0x2D(示例里的CONST.frameType.displayPort就是这个常量的别名)。 - 第二个参数:Payload数组:这是你要发给飞控的实际指令数据,必须严格遵循CRSF和MSP协议的格式。
Betaflight通信的Payload固定格式
和Betaflight飞控通信时,Payload的前3个字节是固定的:
- 目标地址:
0x08(对应CONST.address.betaflight),指定数据发给飞控。 - 源地址:
0xEE(对应CONST.address.transmitter),说明数据来自遥控器。 - MSP指令码:比如要获取飞控版本用
0x30(MSP_GET_VERSION),要设置参数就用对应的指令码,这部分查Betaflight的MSP文档就能找到。
如果你的MSP指令需要参数,把参数按字节顺序追加到Payload数组后面就行。
极简可运行示例:获取飞控版本
这个脚本绑定了长按Menu键触发请求,注释里写清每一步:
-- 定义常用常量(如果EdgeTX环境没自带的话) local CONST = { address = { betaflight = 0x08, transmitter = 0xEE }, frameType = { displayPort = 0x2D }, msp = { GET_VERSION = 0x30 -- MSP获取版本的指令码 } } -- 发送MSP版本请求的函数 local function sendMspVersionRequest() -- 构建Payload:目标地址 + 源地址 + MSP指令码 local payload = { CONST.address.betaflight, CONST.address.transmitter, CONST.msp.GET_VERSION } -- 调用函数发送,返回值是发送成功与否 local sendSuccess = crossfireTelemetryPush(CONST.frameType.displayPort, payload) -- EdgeTX调试用:打印结果到遥控器屏幕 if sendSuccess then print("已发送版本请求") else print("发送失败,检查接收机连接") end end -- 绑定遥控器按键事件:长按Menu键触发 function run(event) if event == EVT_LONG_PRESS_MENU then sendMspVersionRequest() end return 0 end
带参数的示例:设置LED亮度
如果要发送带参数的MSP指令(比如设置LED亮度),只需要把参数追加到Payload里:
local CONST = { -- 省略重复的常量定义 msp = { SET_LED_BRIGHTNESS = 0x19 -- 替换为Betaflight实际的MSP指令码 } } -- 设置LED亮度的函数,参数范围0-255 local function setLedBrightness(brightness) -- 先做范围校验,避免非法值 brightness = math.max(0, math.min(255, brightness)) -- Payload:固定3字节 + 亮度参数(单字节) local payload = { CONST.address.betaflight, CONST.address.transmitter, CONST.msp.SET_LED_BRIGHTNESS, brightness } crossfireTelemetryPush(CONST.frameType.displayPort, payload) end -- 绑定短按+键,设置亮度为200 function run(event) if event == EVT_PLUS_BREAK then setLedBrightness(200) end return 0 end
字节级逻辑的关键细节
- 单字节限制:Payload里的每个元素都是0-255的单字节值,如果要发送多字节数据(比如16位的PID值),得拆成高低字节(MSP用小端序,比如
0x1234要拆成0x34, 0x12)。 - 自动计算长度:CRSF协议会自动计算Payload的长度,你不用手动加长度字节。
- 地址不能错:目标地址必须是
0x08(飞控),源地址是0xEE(遥控器),否则飞控会直接忽略这帧数据。
内容的提问来源于stack exchange,提问作者captain-yossarian from Ukraine
相关产品推荐
相关产品推荐

