问题描述
我正在尝试使用 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
,即C
和2
的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 将允许使用它。