CRC-16(循環(huán)冗余錯誤校驗)
CRC-16 錯誤校驗程序如下:報文(此處只涉及數(shù)據(jù)位,不指起始位、停止位和任選的奇偶校驗位)被看作是一個連續(xù)的二進制,其最高有效位(MSB)首選發(fā)送。報文先與 X↑16 相
乘(左移 16 位),然后看 X↑16+X↑15+X↑2+1 除,X↑16+X↑15+X↑2+1 可以表示為二進制數(shù) 11000000000000101。整數(shù)商位忽略不記,16 位余數(shù)加入該報文(MSB 先發(fā)送),成為 2 個 CRC 校驗字節(jié)。余數(shù)中的 1 全部初始化,以免所有的零成為一條報文被接收。經(jīng)上述處理而含有 CRC 字節(jié)的報文,若無錯誤,到接收設(shè)備后再被同一多項式(X↑16+X↑15+X ↑2+1)除,會得到一個零余數(shù)(接收設(shè)備核驗這個 CRC 字節(jié),并將其與被傳送的 CRC 比較)。全部運算以 2 為模(無進位)。
習慣于成串發(fā)送數(shù)據(jù)的設(shè)備會首選送出字符的最右位(LSB-最低有效位)。而在生成 CRC
情況下,發(fā)送首位應(yīng)是被除數(shù)的最高有效位 MSB。由于在運算中不用進位,為便于操作起見,計算 CRC 時設(shè) MSB 在最右位。生成多項式的位序也必須反過來,以保持一致。多項式的 MSB 略去不記,因其只對商有影響而不影響余數(shù)。
生成 CRC-16 校驗字節(jié)的步驟如下:
①裝如一個 16 位寄存器,所有數(shù)位均為 1。
②該 16 位寄存器的高位字節(jié)與開始 8 位字節(jié)進行“異或”運算。運算結(jié)果放入這個 16 位
寄存器。
③把這個 16 寄存器向右移一位。
④若向右(標記位)移出的數(shù)位是 1,則生成多項式 1010000000000001和這個寄存器進行
“異或”運算;若向右移出的數(shù)位是 0,則返回③。
⑤重復(fù)③和④,直至移出 8 位。
⑥另外 8 位與該十六位寄存器進行“異或”運算。
⑦重復(fù)③~⑥,直至該報文所有字節(jié)均與 16 位寄存器進行“異或”運算,并移位 8 次。
⑧這個 16 位寄存器的內(nèi)容即 2 字節(jié) CRC 錯誤校驗,被加到報文的最高有效位。
另外,在某些非 ModBus 通信協(xié)議中也經(jīng)常使用 CRC16 作為校驗手段,而且產(chǎn)生了一些 CRC 16 的變種,他們是使用 CRC16 多項式 X↑16+X↑15+X↑2+1,單首次裝入的 16 位寄存器為0 000;使用 CRC16 的反序 X↑16+X↑14+X↑1+1,首次裝入寄存器值為 0000 或 FFFFH。
LRC(縱向冗余錯誤校驗)
LRC 錯誤校驗用于 ASCII 模式。這個錯誤校驗是一個 8 位二進制數(shù),可作為 2 個 ASCII 十
六進制字節(jié)傳送。把十六進制字符轉(zhuǎn)換成二進制,加上無循環(huán)進位的二進制字符和二進制補碼結(jié)果生成 LRC 錯誤校驗(參見圖)。這個 LRC 在接收設(shè)備進行核驗,并與被傳送的 LR C 進行比較,冒號(:)、回車符號(CR)、換行字符(LF)和置入的其他任何非 ASCII
十六進制字符在運算時忽略不計。