簡體   English   中英

為 modbus 計算 Python 中的 CRC16

[英]Calculating CRC16 in Python for modbus

首先,對不起。 我是初學者...

我在 modbus 上得到了以下字節序列:“01 04 08 00 00 00 09 00 00 00 00 f8 0c ”。 此字節序列上粗體的 CRC 校驗是正確的。 但是,要檢查/創建 CRC,我必須遵循聲明的設備規范:

錯誤檢查必須使用作為兩個 8 位字節實現的 16 位 CRC 來完成。 CRC 作為最后一個字段附加到幀。 首先附加 CRC 的低位字節,然后是高位字節。 因此,CRC 高位字節是幀中要發送的最后一個字節。 用於生成 CRC 的多項式值必須是 0xA001。

現在,如何使用 crcmod 檢查 CRC? 我的代碼是:

import crcmod
crc16 = crcmod.mkCrcFun(0x1A001, rev=True, initCrc=0xFFFF, xorOut=0x0000)
print crc16("0104080000000900000000".decode("hex"))

我嘗試了所有方法,但無法獲得字節序列正確的“f8 0C”...

使用0x18005而不是0x1A001

Modbus 快捷方式,如果不深入了解 CRC 細節

from pymodbus.utilities import computeCRC

MODBUS CRC 的簡單實現,無需任何額外的庫:

def modbusCrc(msg:str) -> int:
    crc = 0xFFFF
    for n in range(len(msg)):
        crc ^= msg[n]
        for i in range(8):
            if crc & 1:
                crc >>= 1
                crc ^= 0xA001
            else:
                crc >>= 1
    return crc

msg = bytes.fromhex("0104080000000900000000")
crc = modbusCrc(msg)
print("0x%04X"%(crc))            

ba = crc.to_bytes(2, byteorder='little')
print("%02X %02X"%(ba[0], ba[1]))

output 是:

0x0CF8
F8 0C

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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