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...