最近用Modbus-ASCII用到了,py简单实现一下仅作了解,实际工程中用c写
# LRC校验
#s = "0103000A0001" #测试1 结果0xAA
#s2 = "1234567890" #测试2 结果0xF3
def LRC_Cal(s):
n = 0
LRC = 0
for i in range(0, len(s)):
n += ord(s[i]) #ascii值之和
n = (~(n%256))+1 #取模忽略进位(0x100 = 256) 取反加一
LRC = hex(n&0xFF) #转无符号十六进制
return LRC
if __name__ == "__main__":
while True:
print("Please input:")
s = input()
print("Output: " + LRC_Cal(s))
print("-----------------------")
LRC计算的实现方法也可为
def LRC_Cal(s):
n = 0
LRC = 0
for i in range(0, len(s)):
n += ord(s[i]) #ascii值之和
LRC = hex(-n&0xFF) #转无符号十六进制
return LRC
(注:负数求补码的方法即为 原码取反加一,此时忽略符号位即为所求结果)
在线LRC计算 http://www.ip33.com/lrc.html
LRC校验原理参考 https://wenku.baidu.com/view/c9e03958312b3169a451a438.html
C语言实现(注:返回值为十六进制数值,要与源字符串相比较需要进行数值到ASCII的转换
uint8_t LRC_Cal(const uint8_t* buf, uint8_t len)
{
uint8_t LRC = 0;
while(len--)
{
LRC += *buf++;
}
LRC = (uint8_t)(-LRC);
return LRC;
}
其中uint8_t
定义为typedef unsigned char uint8_t;