1. 程式人生 > 其它 >python 實現modBus協議的crc校驗演算法

python 實現modBus協議的crc校驗演算法

技術標籤:Python運用例項pythoncrcmodcrc校驗串列埠通訊modbus

CRC校驗

迴圈冗餘校驗碼(cyclic redundancy check)簡稱CRC(迴圈碼),是一種能力相當強的檢錯、糾錯碼,並且實現編碼和檢碼的電路比較簡單,常用於序列傳送(二進位制位串沿一條訊號線逐位傳送)的輔助儲存器與主機的資料通訊和計算機網路中。

演算法介紹

迴圈冗餘校驗碼由資訊碼n位和校驗碼k位構成。k位校驗位拼接在n位資料位後面,n+k為迴圈冗餘校驗碼的字長,又稱這個校驗碼(n+k,n)碼。
n位資訊位可以表示成為一個報文多項式M(x),最高冪次是xn-1。約定的生成多項式G(x)是一個k+1位的二進位制數,最高冪次是xk。將M(x)乘以xk,即左移k位後,除以G(x),得到的k位餘數就是校驗位。這裡的除法運算是模2除法,即當部分餘數首位是1時商取1,反之商取0。然後每一位的減法運算是按位減,不產生借位。

程式碼實現

python有一個專門用於crc校驗的庫(crcmod),下面程式碼需要此庫的支援。
安裝:pip install crcmod
以下例項程式碼是計算16位的crc校驗,如需其他crc校驗可以檢視庫案例說明。

def crc16Add(read):
    crc16 = crcmod.mkCrcFun(0x18005, rev=True, initCrc=0xFFFF, xorOut=0x0000)
    data = read.replace(" ", "")
    readcrcout = hex(crc16(unhexlify(data))).upper(
) print(readcrcout) str_list = list(readcrcout) print(str_list) if len(str_list) == 5: str_list.insert(2, '0') crc_data = "".join(str_list) print(crc_data) print('CRC16校驗: %s' % (crc_data[4:] + ' ' + crc_data[2:4])) read = data + crc_data[4:] + crc_data[
2:4] print('增加Modbus_CRC16校驗:>>> %s' % read) return read if __name__ == '__main__': crc16Add("0141FD0300")

執行結果

在這裡插入圖片描述