資源描述:
《Modbus協(xié)議中CRC校驗和LRC校驗》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、.CRC的生成循環(huán)冗余校驗(CRC)域為兩個字節(jié),包含一個二進(jìn)制16位值。附加在報文后面的CRC的值由發(fā)送設(shè)備計算。接收設(shè)備在接收報文時重新計算CRC的值,并將計算結(jié)果于實際接收到的CRC值相比較。如果兩個值不相等,則為錯誤。CRC的計算,開始對一個16位寄存器預(yù)裝全1.然后將報文中的連續(xù)的8位子節(jié)對其進(jìn)行后續(xù)的計算。只有字符中的8個數(shù)據(jù)位參與生成CRC的運算,起始位,停止位和校驗位不參與CRC計算。CRC的生成過程中,每個8–位字符與寄存器中的值異或。然后結(jié)果向最低有效位(LSB)方向移動(Shift)1位,
2、而最高有效位(MSB)位置充零。然后提取并檢查LSB:如果LSB為1,則寄存器中的值與一個固定的預(yù)置值異或;如果LSB為0,則不進(jìn)行異或操作。這個過程將重復(fù)直到執(zhí)行完8次移位。完成最后一次(第8次)移位及相關(guān)操作后,下一個8位字節(jié)與寄存器的當(dāng)前值異或,然后又同上面描述過的一樣重復(fù)8次。當(dāng)所有報文中子節(jié)都運算之后得到的寄存器中的最終值,就是CRC.生成CRC的過程為:1.將一個16位寄存器裝入十六進(jìn)制FFFF(全1).將之稱作CRC寄存器.2.將報文的第一個8位字節(jié)與16位CRC寄存器的低字節(jié)異或,結(jié)果置于CRC
3、寄存器.3.將CRC寄存器右移1位(向LSB方向),MSB充零.提取并檢測LSB.4.(如果LSB為0):重復(fù)步驟3(另一次移位).(如果LSB為1):對CRC寄存器異或多項式值0xA001(1010000000000001).5.重復(fù)步驟3和4,直到完成8次移位。當(dāng)做完此操作后,將完成對8位字節(jié)的完整操作。6.對報文中的下一個字節(jié)重復(fù)步驟2到5,繼續(xù)此操作直至所有報文被處理完畢。7.CRC寄存器中的最終內(nèi)容為CRC值.8.當(dāng)放置CRC值于報文時,如下面描述的那樣,高低字節(jié)必須交換。MODBUS協(xié)議的CRC校驗
4、子程序代碼為方便讀者使用MODBUS協(xié)議,將VC、VB、ASM51環(huán)境下MODBUS協(xié)議的CRC校驗子程序代碼一并給出,供讀者參考。//***CRCCalculationforMODBUSProtocolforVC***////數(shù)組snd為地址等傳輸字節(jié),num為字節(jié)數(shù),發(fā)為6收為5//unsignedintmb_crc(BYTE*snd,intnum){inti,j;unsignedintc,crc=0xFFFFfor(i=0;i5、<8,j)..{if(crc&0x0001){crc>>=1;crc^=0xA001;}elsecrc>>=1}}return(crc);}unsignedshortintCrcCheck(constunsignedchar*buffer,constintbuffLen){unsignedshortintcrcValue=0;if(!buffer
6、
7、buffLen<0){returncrcValue;}intCRCHi[]={0x0,0xC1,0x81,0x40,0x1,0xC0,0x80,0x41,0x1,0
8、xC0,0x80,0x41,0x0,0xC1,0x81,0x40,0x1,0xC0,0x80,0x41,0x0,0xC1,0x81,0x40,0x0,0xC1,0x81,0x40,0x1,0xC0,0x80,0x41,0x1,0xC0,0x80,0x41,0x0,0xC1,0x81,0x40,0x0,0xC1,0x81,0x40,0x1,0xC0,0x80,0x41,0x0,0xC1,0x81,0x40,0x1,0xC0,0x80,0x41,0x1,0xC0,0x80,0x41,0x0,0xC1,0x81,0x
9、40,0x1,0xC0,0x80,0x41,0x0,0xC1,0x81,0x40,0x0,0xC1,0x81,0x40,0x1,0xC0,0x80,0x41,0x0,0xC1,0x81,0x40,0x1,0xC0,0x80,0x41,0x1,0xC0,0x80,0x41,0x0,0xC1,0x81,0x40,0x0,0xC1,0x81,0x40,0x1,0xC0,0x80,0x41,0x1,0xC0,0x80,0x41,0x0,0xC1,0x81,0x40,0x1,0xC0,0x80,0x41,0x0,0xC1
10、,0x81,0x40,0x0,0xC1,0x81,0x40,0x1,0xC0,0x80,0x41,0x1,0xC0,0x80,0x41,0x0,0xC1,0x81,0x40,0x0,0xC1,0x81,0x40,0x1,0xC0,0x80,0x41,0x0,0xC1,0x81,0x40,0x1,0xC0,0x80,0x41,0x1,0xC0,0x80,0x41,0x0,0xC1,0x8