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

蓝牙串口自定义协议字节拼接方法及Lua 5.2运行报错问题咨询

报错解决与代码优化

直接报错原因

Lua标准库没有内置println全局函数,你调用了未定义的全局变量触发报错,和frame字符串拼接逻辑无关。只要把sendFrame函数末尾的println(frame)替换为print(frame)即可解决该报错。

隐藏问题修复

你当前代码还有两个会导致后续运行异常的问题:

  • checksum函数中的变量c未加local修饰,会泄漏为全局变量,存在污染全局作用域的风险。
  • Lua的字符串索引从1开始,checksum函数循环从0开始取值,string.byte(val, 0)会返回nil,传入bit32.bxor会触发新的参数类型错误,需要把循环范围调整为1, string.len(val)。

修复后完整代码

local function checksum(val)
    local c = 0
    for i = 1, string.len(val), 1 do
        c = bit32.bxor(c, string.byte(val, i))
    end
    return string.char(c)
end

local function i32(val)
    local b32HH = bit32.band(bit32.rshift(val, 24), 0xff);
    local b32HL = bit32.band(bit32.rshift(val, 16), 0xff);
    local b32LH = bit32.band(bit32.rshift(val, 8), 0xff);
    local b32LL = bit32.band(val, 0xff);
    return string.char(b32HH, b32HL, b32LH, b32LL)
end

local function i16(val)
    local b16H = bit32.band(bit32.rshift(val, 8), 0xff);
    local b16L = bit32.band(val, 0xff);
    return string.char(b16H, b16L)
end

local function i8(val)
    local b8 = bit32.band(val, 0xff);
    return string.char(b8)
end

local function sendFrame()
    local a = 2059368940    -- int32    4 bytes
    local b = -1201540427   -- int32    4 bytes
    local c = 682519180     -- int32    4 bytes
    local d = 38331         -- uint16   2 bytes
    local e = 1643          -- uint16   2 bytes
    local f = 177           -- uint8    1 byte

    local frame = string.char(0x17) -- start byte, just a random value
    frame = frame .. i32(a)
    frame = frame .. i32(b)
    frame = frame .. i32(c)
    frame = frame .. i16(d)
    frame = frame .. i16(e)
    frame = frame .. i8(f)
    frame = frame .. checksum(frame)
    print(frame)
end

sendFrame()

额外说明

你当前的整数编码采用的是大端(高位字节在前)规则,后续开发蓝牙接收端的解析逻辑时,需要对应使用大端规则解析整数,避免数值转换错误。

内容的提问来源于stack exchange,提问作者avs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 21:45:03