You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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个字节是固定的:

  1. 目标地址:0x08(对应CONST.address.betaflight),指定数据发给飞控。
  2. 源地址:0xEE(对应CONST.address.transmitter),说明数据来自遥控器。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 15:49:52