python 實現modBus協議的crc校驗演算法
阿新 • • 發佈:2021-02-13
技術標籤: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")