使用lua语言编写的CRC16-MODBUS校验函数:
function calc_crc(string)
if string.len(string) % 2 ~= 0 then
string = '0' .. string
end
data = {}
i = 1
while i <= string.len(string) do
byte = string.sub(string, i, i + 1)
table.insert(data, tonumber(byte, 16))
i = i + 2
end
crc = 0xFFFF
for _, pos in ipairs(data) do
crc = bit.bxor(crc, pos)
for i = 1, 8 do
if bit.band(crc, 1) ~= 0 then
crc = bit.rshift(crc, 1)
crc = bit.bxor(crc, 0xA001)
else
crc = bit.rshift(crc, 1)
end
end
end
-- 修改格式化字符串将低8位放在前面
hex_crc = string.format("%04X", crc):sub(3, 4) .. string.format("%04X", crc):sub(1, 2)
return hex_crc -- 返回CRC校验码
end
使用案例:
local str = "01032000218DD800013875010C63080000005A000003E80000005900000CCB00001388"
local crc = calc_crc(str)
print(crc)
输出结果:

比对显示无误(注意校验结果的高低位)
该文章展示了一个用Lua编写的CRC16-MODBUS校验函数,函数通过处理输入字符串,进行位操作计算CRC值,并返回校验码。在给定的示例中,函数正确计算了字符串的CRC值并输出。



4589

被折叠的 条评论
为什么被折叠?



