Modbus的CRC16和LRC計算方式

2021-10-09 10:59:20 字數 1859 閱讀 5270

迴圈冗餘校驗(crc) 域為兩個位元組,包含乙個二進位制16 位值。附加在報文後面的crc 的值

由傳送裝置計算。接收裝置在接收報文時重新計算crc 的值,並將計算結果於實際接收到的crc

值相比較。如果兩個值不相等,則為錯誤。

crc 的計算, 開始對乙個16位暫存器預裝全1. 然後將報文中的連續的8位子節對其進行後續

的計算。只有字元中的8個資料位參與生成crc 的運算,起始位,停止位和校驗位不參與crc 計

算。crc 的生成過程中, 每個 8–位字元與暫存器中的值異或。然後結果向最低有效位(lsb) 方

向移動(shift) 1位,而最高有效位(msb) 位置充零。然後提取並檢查lsb:如果lsb 為1, 則

暫存器中的值與乙個固定的預置值異或;如果lsb 為 0, 則不進行異或操作。

這個過程將重複直到執行完8 次移位。完成最後一次(第8 次)移位及相關操作後,下乙個8

位位元組與暫存器的當前值異或,然後又同上面描述過的一樣重複8 次。當所有報文中子節都運算之

後得到的暫存器中的最終值,就是crc.

將乙個16 位暫存器裝入十六進製制ffff (全1). 將之稱作crc 暫存器.

將報文的第乙個8位位元組與16 位crc 暫存器的低位元組異或,結果置於crc 暫存器.

將crc 暫存器右移1位(向lsb 方向), msb 充零. 提取並檢測lsb.

(如果lsb 為0): 重複步驟3 (另一次移位).

(如果lsb 為1): 對crc 暫存器異或多項式值0xa001 (1010 0000 0000 0001).

重複步驟3 和 4,直到完成8 次移位。當做完此操作後,將完成對8位位元組的完整操作。

對報文中的下乙個位元組重複步驟2 到5,繼續此操作直至所有報文被處理完畢。

crc 暫存器中的最終內容為crc 值.

當放置crc 值於報文時,如下面描述的那樣,高低位元組必須交換。

;}

/* 高位位元組的crc 值*/

const

static unsigned char auchcrchi=

;/* 低位位元組的crc 值*/

const

static unsigned char auchcrclo=

;

縱向冗餘校驗(lrc)為乙個位元組,含有8 位二進位制值。lrc 由傳送裝置計算,並附加lrc 到

報文。接收裝置在接收文時計算lrc, 並將計算的結果與在lrc 接收到的實際值相比較,如果兩

個值不相等,則結果為錯。

lrc 的計算, 對報文中的所有的連續8 位位元組相加,忽略任何進製,然後求出其二進位制補碼。

lrc 為乙個8 位域,那麼每個會導致值大於255新的相加只是簡單的將域的值在零」迴繞」。因為沒

有第9 位,進製被自動放棄。

1.不包括起始」冒號」和結束crlf 的報文中的所有位元組相加到乙個8位域,故此進製被丟棄。

2.從ff (全1)十六進製制中減去域的最終值,產生1 的補碼(二進位制反碼)。

3.加1 產生二進位制補碼.

unsigned char calculatelrc

(unsigned char * auchmsg, unsigned short usdatalen)

Modbus通訊CRC16校驗程式

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

基於MODBUS 協議的CRC16程式實現

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

原始碼 Modbus協議中CRC16校驗

modbus的資料校驗方法 crc 16 迴圈冗餘錯誤校驗 crc 16錯誤校驗程式如下 報文 此處只涉及資料位,不指起始位 停止位和任選的奇偶校驗 位 被看作是乙個連續的二進位制,其最高有效位 msb 首選傳送。報文先與x 16相乘 左移16位 然後看x 16 x 15 x 2 1除x 16 x ...