赞
踩
最近在用广州大彩的串口屏做项目,自定义协议用的的是Lua编程脚本,但是里面的校验是crc16,好不巧是我用到的主机协议是固定死的,所以尝试改成crc8校验,同时符合多项式 x8+x5+x4+1。下面的校验部分亲测可用,同时遇到的bug,修复过程也同样展示。
x8+x5+x4+1 (0x131)
function add_crc8(start, n, data) local carry_flag, a = 0 local result = 0x00 local i = start while(true) do result = result ~ data[i] print("data=",data[i]) for j =8, 1,-1 do if((result & 0x80)~=0) then result = (result<<1) ~ 0x131 --这里注意是0x131,不同于c语言是 0x31 print("result[i] if=",result) else result=(result<<1) print("result[i] else=",result) end end print("result[i]=",result) i = i + 1 if i == start + n then break end end print("result2=",result) return result end
result = (result<<1) ~ 0x131 --这里注意是0x131,不同于c语言是 0x31
这个问题找到好久,我之前调试过同样的多项式的C语言的crc8校验,然后把算法移植到Lua上,就是不行。大家也可以看到,上面的代码加了很多的打印信息,我就是通过打印信息,从第一个数据开始关注打印信息,再利用crc校验小工具,一个一个进行比较,最终得到正确答案!
crc校验在线工具:
http://www.ip33.com/crc.html
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。