具有产生 nACK 响应的校验和函数的函数

Function with Checksum Function Producing nACK Responses

对于我当前的应用程序,我正在编写一个允许设备与从属设备通信的插件。从设备有两个校验和,一个 header 和一个数据校验和。 header 校验和产生了一些不稳定的结果,这里的成员对其进行了微调和更正:

现在我不确定我的数据校验和是否正确。我相信这是因为我在这里创建了一个线程来帮助理解和构建它,我在这里做了:

现在,我不认为它是数据校验和功能。但我相信这是我尝试实现它的方式。我现在正试图复制示例代码并将其发送到我的从属设备,希望我能收到适当的响应。问题是我在 return 中收到 nACK。我已经尝试了我能想到的每一种排列和组合,但我没有收到可接受的值。 input 表示我需要发送到下面的 function databuild(str) 函数的字符串。

input = "010032380000000000000000000000000000000000000000"  -- title must be a specific length so it is filled with NUL's to meet that criteria

function CRC(data, length)
    sum = 65535
    local d
    for i = 1, length do
        d = string.byte(data, i)
        sum = ByteCRC(sum, d)
    end
    return sum
end

function ByteCRC(sum, data)
    sum = sum ~ data
    for i = 0, 7 do
        if ((sum & 1) == 0) then
            sum = sum >> 1
        else
            sum = (sum >> 1) ~ 0xA001
        end
    end
    return sum
end

function databuild(str) -- I know I should not be doing what's inside here but don't fully understand why not to and better ways of approaching it.
    local dataSum = ""
    local dataSumReslt = ""
    local dataConv = ""
    for char in str:gmatch("..") do
        dataConv = dataConv..string.char("0x"..char)
    end
    dataSum = string.format("%04X", CRC(dataConv, #dataConv))
    for char in dataSum:gmatch("..") do
        dataSumReslt = dataSumReslt..string.char("0x"..char)
    end
    return dataConv..dataSumReslt
end

print(databuild(input))

我应该根据打印语句中的那些字节值获取数据校验和。我将整个字符串发送到 function databuild(str) 函数。从那里我将结果转换为十六进制格式,然后连接该结果(在通过 string.char 将 two-byte 值转换为十六进制之后),然后连接 return 整个十六进制字符串。

现在,我得到了结果 170B。不幸的是,我的编程水平还不够高,无法正确调试或测试我收到的信息是否真实。

由于我对一般编程还很陌生,所以大多数时候我并不想在这个 low-level(位操作)上工作。我在我的任何 类 中都没有达到这一点,因为它一直都是 higher-level 编程(Java 和 self-taught 我在 Lua 中知道的)。这是我的第一个工作项目,它真正 "baptism by fire" 涉及字节、十六进制转换等。不用说,我在这里勉强保持头脑清醒。所以我得到的所有建设性批评都是绝对需要的。

你可以替换

for char in str:gmatch("..") do
    dataConv = dataConv..string.char("0x"..char)
end

dataConv = str:gsub("..",function (x) return string.char(tonumber(x,16)) end)

您可以将其简化为

dataConv = str:gsub("..",HEX)

做完后

HEX={}
for c=0,255 do
    HEX[string.format("%02x",c)] = string.char(c)
end

这将避免串联。

您好,您遇到了 MarkemImaje 打印机的问题。

你这里有误:

sum = (sum >> 1) ~ 0xA001 --> sum = (sum >> 1) ^ 0xA001