簡體   English   中英

計算包含整數的消息的 CRC

[英]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 ,它們是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)

這樣我的所有整數都轉換為字節 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM