【Modbus】CRC16校验计算的python实现---亲测可用

934 阅读1分钟

本次使用CRC校验的场景是在Modbus RTU通信中,CRC校验通常分为查表法和直接计算,本章节为直接计算。在工业通信中传输的数据一般是先传输数据字节的低位。由于数据是颠倒的所以生成项也是需要反转,CRC16-Modbus校验算法的多项式公式为:

image.png

宽度为:16,多项式为:0x8005,初始值为:0xFFFF,结果亦或值为:0x0000,输入反转:True,输出反转:True。在此次实现中作为进行校验的数据以string形式入参,原多项式为0x8005,反置得到0xA001,CRC16-Modbus初值为0xFFFF,初始值先于data[0]异或,判断最低位是否为1,是则CRC右移一位,再与多项式值异或,否则仅右移一位。

代码如下:

import crcmod
from binascii import unhexlify


# def run_breaker(port=6):
def crc16Add(read):
    crc16 = crcmod.mkCrcFun(0x18005, rev=True, initCrc=0xFFFF, xorOut=0x0000)
    data = read.replace(" ", "") #消除空格
    readcrcout = hex(crc16(unhexlify(data))).upper()
    str_list = list(readcrcout)
    # print(str_list)
    if len(str_list) == 5:
        str_list.insert(2, '0')  # 位数不足补0,因为一般最少是5个
    crc_data = "".join(str_list) #用""把数组的每一位结合起来  组成新的字符串
    # print(crc_data)
    read = read.strip() + ' ' + crc_data[4:] + ' ' + crc_data[2:4] #把源代码和crc校验码连接起来
    # print('CRC16校验:', crc_data[4:] + ' ' + crc_data[2:4])
    print(read)
    return read


原文链接:blog.csdn.net/qq_33475105…