看看寫的modbus CRC校驗(yàn)子程序
劉玉蓉
發(fā)布于2014-12-02 17:26
611
0
標(biāo)簽:
誰能理解這段子程序啊,解釋一下。
CRC校驗(yàn)算法是什么
圖片說明: 1,1
佳答案
我找了一段話希望對(duì)你有幫助如下:
在RTU 模式包含一個(gè)對(duì)全部報(bào)文內(nèi)容執(zhí)行的,基于循環(huán)冗余校驗(yàn) (CRC - Cyclical Redundancy Checking) 算法的錯(cuò)誤檢驗(yàn)域。CRC 域檢驗(yàn)整個(gè)報(bào)文的內(nèi)容。不管報(bào)文有無奇偶校驗(yàn),均執(zhí)行此檢驗(yàn)。
CRC 包含由兩個(gè)8位字節(jié)組成的一個(gè)16位值。
CRC 域作為報(bào)文的后的域附加在報(bào)文之后。計(jì)算后,首先附加低字節(jié),然后是高字節(jié)。CRC 高字節(jié)為報(bào)文發(fā)送的后一個(gè)字節(jié)。
附加在報(bào)文后面的CRC 的值由發(fā)送設(shè)備計(jì)算。接收設(shè)備在接收?qǐng)?bào)文時(shí)重新計(jì)算 CRC 的值,并將計(jì)算結(jié)果于實(shí)際接收到的CRC 值相比較。如果兩個(gè)值不相等,則為錯(cuò)誤。
CRC 的計(jì)算, 開始對(duì)一個(gè)16位寄存器預(yù)裝全1。 然后將報(bào)文中的連續(xù)的8位字節(jié)對(duì)其進(jìn)行后續(xù)的計(jì)算。只有字符中的8個(gè)數(shù)據(jù)位參與生成CRC 的運(yùn)算,起始位,停止位和校驗(yàn)位不參與 CRC 計(jì)算。
CRC 的生成過程中, 每個(gè) 8–位字符與寄存器中的值異或。然后結(jié)果向低有效位(LSB)方向移動(dòng)(Shift) 1位,而高有效位(MSB)位置充零。 然后提取并檢查 LSB:如果LSB 為1, 則寄存器中的值與一個(gè)固定的預(yù)置值異或;如果LSB 為 0, 則不進(jìn)行異或操作。
這個(gè)過程將重復(fù)直到執(zhí)行完8次移位。完成后一次(第8次)移位及相關(guān)操作后,下一個(gè)8位字節(jié)與寄存器的當(dāng)前值異或,然后又同上面描述過的一樣重復(fù)8次。當(dāng)所有報(bào)文中字節(jié)都運(yùn)算之后得到的寄存器中的終值,就是CRC。
上面這段話就是對(duì)你貼圖的程序的解釋,好好研究下。