LRC校验(纵向冗余校验)

文章介绍了如何使用Python和C语言实现Modbus-ASCII协议中的LRC(纵向冗余校验)计算。提供了两种不同的Python函数实现,并解释了负数求补码的方法。同时给出了C语言的函数实现,强调返回值是无符号十六进制数值,需要进一步转换与源字符串比较。
摘要由CSDN通过智能技术生成

最近用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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值