计算包含整数的消息的 CRC

问题描述

我正在尝试使用 python 创建一个 CRC 计算器,用于通过 RS485 电缆发送特定消息;消息的框架如下:

address | param0 | param1 | ... | param6 | CRC_L | CRC_H

所有参数和地址都是 8 位整数类型,这是我尝试初始化参数然后将其发送到 CRC 计算函数方法

SendData = 82
param0 = 20
param1 = 3
param2 = 7
param3 = 12
param4 = 2
param5 = 5
param6 = 2

message = Send(SendData,param0,param1,param2,param3,param4,param5,param6)


def Send(address,param6):

    SendStatus = False
    ReceiveStatus = False

    SendData=""
    SendData= SendData + hex(address)[2:].zfill(2)
    SendData= SendData + hex(param0)[2:].zfill(2)
    SendData= SendData + hex(param1)[2:].zfill(2)
    SendData= SendData + hex(param2)[2:].zfill(2)
    SendData= SendData + hex(param3)[2:].zfill(2)
    SendData= SendData + hex(param4)[2:].zfill(2)
    SendData= SendData + hex(param5)[2:].zfill(2)
    SendData= SendData + hex(param6)[2:].zfill(2)

    print(SendData)

    return SendData

为了固定长度的参数,我使用了 zfill(2) 以保持所有十六进制为 2 位数。

例如:3 作为整数将变成 0x03 而不是 0x3(这会对消息的结构产生影响)。

最后,这是我用来计算 CRC 的内容

crc16 = crcmod.predefined.Crc('crc-16-mcrf4xx')
crc16.update(message)
crc = crc16.hexdigest()
print(crc)

因此这不起作用,因为 message 未“编码”。

我想避免的是我的字符串被转换为 ASCII 值。下面是一个例子:

0xC2被翻译成43 32,即C2的ASCII字符代码。我希望 crcmod 计算 0xC2 而不是 0x43 0x32 的 crc。希望这能让我的问题更清楚。

编辑:试图更清楚地解释我的问题。我确实找到了我在下面发布的解决方案。

解决方法

我通过反复试验找到了解决我的问题的方法:

crcmod 只接受编码字符串。所以现在我所有的参数都是这样初始化的:

    SendData = bytes([82])
    param0 = bytes([20])
    param1 = bytes([3])
    param2 = bytes([7])
    param3 = bytes([12])
    param4 = bytes([2])
    param5 = bytes([5])
    param6 = bytes([2])

message = Send(SendData,param0,param1,param2,param3,param4,param5,param6)

这样我的所有整数都被转换为字节对象,然后我将它们连接在一起以创建我的消息:

def Send(address,param6):

    SendStatus = False
    ReceiveStatus = False

    SendData=""
    SendData= address
    SendData= SendData + param0
    SendData= SendData + param1
    SendData= SendData + param2
    SendData= SendData + param3
    SendData= SendData + param4
    SendData= SendData + param5
    SendData= SendData + param6

    return SendData

现在返回的 SendData 是一个字节字符串,并且 crcmod 将允许使用它。