蓝牙串口自定义协议字节拼接方法及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
相关产品推荐
相关产品推荐

