[英]Calculating a CRC of a message containing integers
我正在嘗試使用 python 創建一個 CRC 計算器,以便通過 RS485 電纜發送特定消息; 消息的框架如下:
address | param0 | param1 |... | param6 | CRC_L | CRC_H
address | param0 | param1 |... | param6 | CRC_L | CRC_H
。
所有參數和地址都是 8 位 integer 類型,這是我嘗試做的初始化參數然后將其發送到 CRC 計算 function:
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, param0, param1, param2, param3, param4, param5, 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
作為 integer 將變為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)
這樣我的所有整數都轉換為字節 object 然后我將它們連接在一起以創建我的消息:
def Send(address, param0, param1, param2, param3, param4, param5, 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 將允許使用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.