原始碼 Modbus協議中CRC16校驗

2021-08-28 12:44:11 字數 1224 閱讀 5823

modbus的資料校驗方法:crc-16(迴圈冗餘錯誤校驗)

crc-16錯誤校驗程式如下:報文(此處只涉及資料位,不指起始位、停止位和任選的奇偶校驗

位)被看作是乙個連續的二進位制,其最高有效位(msb)首選傳送。報文先與x↑16相乘(左移16位),然後看x↑16+x↑15+x↑2+1除x↑16+x↑15+x↑2+1可以表示為二進位制數11000000000000101。整數商位忽略不記,16位餘數加入該報文(msb先傳送),成為2個crc校驗位元組。餘數中的1全部初始化,以免所有的零成為一條報文被接收。經上述處理而含有crc位元組的報文,若無錯誤,到接收裝置後再被同一多項式(x↑16+x↑15+x↑2+1) 除,會得到乙個零餘數(接收裝置核驗這個crc位元組,並將其與被傳送的crc比較)。全部運算以2為模(無進製)。

習慣於成串傳送資料的裝置會首選送出字元的最右位(lsb-最低有效位)。而在生成crc情況下,傳送首位應是被除數的最高有效位msb。由於在運算中不用進製,為便於操作起見,計算crc時設msb 在最右位。生成多項式的位序也必須反過來,以保持一致。多項式的msb 略去不記,因其只對商有影響而不影響餘數。

生成crc-16校驗位元組的步驟如下:

① 裝如乙個16位暫存器,所有數字均為1。

② 該16位暫存器的高位位元組與開始8位位元組進行「異或」運算。運算結果放入這個16 位暫存器。

③ 把這個16暫存器向右移一位。

④ 若向右(標記位)移出的數字是1,則生成多項式1010000000000001 和這個暫存器進行「異或」運算;若向右移出的數字是0,則返回③。

⑤ 重複③和④,直至移出8位。

⑥ 另外8位與該十六位暫存器進行「異或」運算。

⑦ 重複③~⑥,直至該報文所有位元組均與16位暫存器進行「異或」運算,並移位8次。

⑧ 這個16位暫存器的內容即2位元組crc錯誤校驗,被加到報文的最高有效位。

下面將給出查表的方法,該方法也是最快、最有效的計算方法:

const byte chcrchtalbe =                                 // crc 高位位元組值表

;const byte chcrcltalbe =                                 // crc 低位位元組值表

;word crc16(byte* pchmsg, word wdatalen)

return ((chcrchi << 8) | chcrclo) ;

}

基於MODBUS 協議的CRC16程式實現

modbus 通訊協議的 crc 冗餘迴圈校驗碼含2個位元組,即 16 位二進位制數。crc 碼由傳送裝置計算,放置於所傳送資訊幀的尾部。接收資訊裝置再重新計算所接收資訊 除 crc 之外的部分 的 crc,比較計算得到的 crc 是否與接收到crc相符,如果兩者不相符,則認為資料出錯。1 預置 1...

CRC8演算法DELPHI原始碼

最近做個程式需要用到crc8校驗,網上找了一堆資料都看得頭暈腦脹的,最終還是搞不懂它的演算法,慚愧。最後找了個c原始碼請高手翻譯成delphi的才解決問題。在這感謝 老鴇。他寫的delphi程式如下 lanyus 原c程式 原c程式如下 crc校驗 8n unsigned char crc 8n u...

crc16碼表的使用 Modbus協議CRC校驗

modbus協議crc校驗 最近在開發modbus協議閘道器,使用到了crc校驗,做了一點記錄,希望對有需要的人有點幫助。crc16高位碼表 static const uint8 crc16hitable 0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x01,0x...