如何在蓝牙串口的自定义协议中连接字节

我想创建一个自定义协议来通过蓝牙连接发送一些数据。思路是通过起始字节来结束帧,并用校验和来校验。数据包含有符号和无符号的8、16和32位整数。

从这个网站和互联网的各个角落找到的各种代码片段中,我已经组合了以下内容,并使用了一些虚拟数据来验证结果:

local function checksum(val)
    c = 0
    for i = 0, 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) -- 起始字节,仅是一个随机值
    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)
    println(frame)
end

sendFrame()

当我在Lua _5.2_中运行此代码时,我遇到了以下错误:

$lua main.lua
lua: main.lua:45: attempt to call a nil value (global 'println')
stack traceback:
    main.lua:45: in local 'sendFrame'
    main.lua:48: in main chunk
    [C]: in ?

显然,我的字符串连接结果是nil值,但我无法找出原因。

原文链接 https://stackoverflow.com/questions/69622647

点赞
stackoverflow用户10915018
stackoverflow用户10915018

这是因为在第45行使用了println()。在Lua中,println()不是一个命令,你应该使用传统的print()。如果你不想在末尾有一个换行符,可以使用io.write()

2021-10-19 05:39:31