版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、CRC校驗(yàn)碼軟件CRC-16是檢測(cè)數(shù)據(jù)在發(fā)送過(guò)程中發(fā)生錯(cuò)誤的常用校驗(yàn)方法。一、前言CRC的計(jì)算方式是將欲傳輸?shù)臄?shù)據(jù)塊視為一堆連續(xù)位所構(gòu)成的整個(gè)數(shù)值,將此數(shù)值除以一個(gè)特定的除數(shù),通常以二進(jìn)制表示,此除數(shù)稱(chēng)為生成多項(xiàng)式(ANSI CRC-16的生成多項(xiàng)式為:x16 + x15 + x2 + 1)。目前較常用的CRC位數(shù)目有8和16以及32,在這里只講述如何寫(xiě)CRC位數(shù)目為16的程序。CRC位數(shù)目越大,數(shù)據(jù)的錯(cuò)誤檢測(cè)率則越高,但必須多花一些時(shí)間進(jìn)行數(shù)據(jù)的計(jì)算。二、CRC-16計(jì)算步驟CRC-16的計(jì)算方法有兩種:查表法與計(jì)算法,在這里只講述計(jì)算法。在某電力儀表上的說(shuō)明書(shū)中摘錄下來(lái)的計(jì)算CRC-16步
2、驟如下:1、 Load a 16-bit register with FFFF hex. Call this the CRC register.2、 Exclusive OR the first 8-bit byte of the message with the low-order byte of the 16-bit CRC, putting the result in the CRC register.3、 Shift the CRC register one bit to the right (toward the LSB), zero-filling the MSB. Extract
3、 and Examine.4、 If the LSB was 1: Exclusive OR the CRC register with polynomial value A001 hex. If the LSB was 0: Repeat step 3 (another shift).5、 Repeat step 3 and 4 until 8 shifts have been performed. When this is done, a complete 8-bit byte will have been processed.6、 Repeat step 2 through 5 for
4、the next 8-bit byte of them message.7、 The final content of the CRC register is the CRC value.中文解釋如下:1、定義一個(gè)初始值為FFFF的16位的變量,該變量稱(chēng)為CRC寄存器。(想想在程序中,應(yīng)該怎么表示16位的變量呢?)2、把欲發(fā)送或接收消息的高8位和CRC寄存器的底8位作異或運(yùn)算,并把結(jié)果在賦到CRC寄存器。3、CRC寄存器右移1位(朝最低位),同時(shí)最高位添零。取出并檢查最低位是否為1。(Visual Basic 里如何做移位的運(yùn)算呢?)4、如果為1,則CRC寄存器與多項(xiàng)式A001異或;如果為0,
5、則重復(fù)第3步的動(dòng)作。(Visual Basic 里如何判斷一個(gè)字節(jié)里某個(gè)位的值呢?)5、重復(fù)3和4直到完成了8次移位。這樣完整的8位字節(jié)將完成處理了。6、對(duì)于下一個(gè)8位字節(jié)的處理就是重復(fù)第2步到第5步了7、把所有的欲發(fā)送或接收消息這樣處理后, CRC寄存器里的值就是我們最終需要得到的CRC校驗(yàn)碼。如果你能正確回答我的問(wèn)題,那么恭喜你,你自己可以用Visual Basic寫(xiě)數(shù)據(jù)采集卡的控制程序了。三、Visual Basic程序?qū)崿F(xiàn)以江陰長(zhǎng)江斯菲爾電力儀表公司CD194E系列多功能電力儀表的MODBUS-RTU通訊協(xié)議的報(bào)文格式為例,該表通信報(bào)文格式使用的校驗(yàn)方式就是CRC-16。通過(guò)對(duì)地址01
6、H、命令04H、數(shù)據(jù)地址005CH和數(shù)據(jù)長(zhǎng)度0004H的CRC-16運(yùn)算后得到主機(jī)請(qǐng)求數(shù)據(jù)報(bào)文的CRC16的校驗(yàn)碼為31DBH。 程序界面程序代碼:Private Sub cmdGenerate_Click()Dim OutByte(7) As Byte, CRC16() As Byte, CRC16LO As Byte, CRC16HI As Byte, TempHI As Byte, TempLO As ByteDim i As Integer, j As Integer''''''''''''
7、''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
8、'''''''''''''''''''''''''''''''''''''OutByte(0) = Val("&H" & txtOutByte(0).Text)OutByte(1) = Val("&H" & txtOutByte(1
9、).Text)OutByte(2) = Val("&H" & txtOutByte(2).Text)OutByte(3) = Val("&H" & txtOutByte(3).Text)OutByte(4) = Val("&H" & txtOutByte(4).Text)OutByte(5) = Val("&H" & txtOutByte(5).Text) CRC16LO = &HFF '(1)Load a 16-bit registe
10、r with FFFF hex.call this the CRC register. CRC16HI = &HFFFor i = 0 To UBound (OutByte) - 2 CRC16LO = CRC16LO Xor OutByte (i) '(2)Exclusive OR the first 8-bit byte of the message 'with the low-order byte of the 16-bit CRC, 'putting the result in the CRC register For j = 0 To 7 TempHI
11、 = CRC16HI TempLO = CRC16LO CRC16HI = CRC16HI 2 '(3)Shift the CRC register one bit to the right(toward the LSB),zero-filling CRC16LO = CRC16LO 2 'the MSB.Extract and Examine If (TempHI And &H1) = &H1) Then CRC16LO = CRC16LO Or &H80 '移位時(shí),如果高低位是1,則低高位加1 End If If (TempLO And &a
12、mp;H1) = &H1) Then '(4)if the LSB was 1: CRC16HI = CRC16HI Xor &HA0 'Exclusive OR the CRC register with polynomial value A001 hex. CRC16LO = CRC16LO Xor &H1 End If 'if the LSB was 0: Repeat step 3 (another shift) Next j '(5)Repeat step 3 and 4 until 8 shifts have been per
13、formed. 'when this is done, a complete 8-bit byte will have been processed.Next i '(6)Repeat step 2 through 5 for the next 8-bit byte of them message. OutByte(6) = CRC16LO '(7)The final contents of the CRC register is the CRC value txtOutByte(6) = Hex(OutByte(6) OutByte(7) = CRC16HI txtO
14、utByte(7) = Hex(OutByte(7)End Sub四、Visual C+程序?qū)崿F(xiàn) 程序界面主要代碼:#define CHECKVALUE(pt,nl) if(btData=NULL)|(nLength<=0)AfxMessageBox("無(wú)效數(shù)組!");return -1;BOOL CCRC_16Dlg:OnInitDialog()m_strCRC="01 04 00 5C 00 04"UpdateData(FALSE);return TRUE; / return TRUE unless you set the focus to a
15、 controlvoid CCRC_16Dlg:OnOK()UpdateData(TRUE);CString strTemp;strTemp=m_strCRC;WORD CRC;BYTE btData4096;int nLength=StrToHex(strTemp,btData); CRC=ANSI_CRC_16(btData,nLength); /ANSI-16CString str;str.Format(" %02X %02X",(BYTE)(CRC>>8),(BYTE)CRC);AfxMessageBox(str);CDialog:OnOK();WORD
16、 CCRC_16Dlg:ANSI_CRC_16(BYTE* btData,int nLength) /ANSI CRC-16,x16 + x15 + x2 + 1CHECKVALUE(btData,nLength);WORD CRC=0xFFFF;BYTE j,Tmp=0;int i; for(i=0;i<nLength;i+) CRC=btDatai; /做位異或運(yùn)算 for (j=0;j<8;j+) Tmp=CRC&0x0001; /位與運(yùn)算 CRC=CRC>>1; /位右移運(yùn)算 if(Tmp) CRC=(CRC0xA001); return (CRC>
17、;>8)+(CRC<<8);int CCRC_16Dlg:StrToHex(CString str, BYTE *btData)int nLength=str.GetLength();if(nLength<2) return 0;for(int i=0;i<nLength;i+=3) _stscanf(str.Mid(i,2),"%02X",&btDatai/3);return (i+1)/3;五、結(jié)論1, 這兩個(gè)實(shí)例可以當(dāng)作計(jì)算CRC-16的小工具,代碼對(duì)于自己要開(kāi)發(fā)CRC-16的人員也提供一些參考價(jià)值。2, 如果你在Visual B
18、asic里,右移應(yīng)該做什么運(yùn)算,那么你就真的看進(jìn)去了,如果你不知道,可以發(fā)E-Mail給我。3, 同一個(gè)實(shí)例,兩種開(kāi)發(fā)語(yǔ)言,值得學(xué)習(xí)一下??吹竭@里,你可以告訴我在VC+中,異或是用什么符號(hào)?是不是很意外呢?CRC校驗(yàn)1、循環(huán)校驗(yàn)碼(CRC碼):是數(shù)據(jù)通信領(lǐng)域中最常用的一種差錯(cuò)校驗(yàn)碼,其特征是信息字段和校驗(yàn)字段的長(zhǎng)度可以任意選定。2、生成CRC碼的基本原理:任意一個(gè)由二進(jìn)制位串組成的代碼都可以和一個(gè)系數(shù)僅為0和1取值的多項(xiàng)式一一對(duì)應(yīng)。例如:代碼1010111對(duì)應(yīng)的多項(xiàng)式為x6+x4+x2+x+1,而多項(xiàng)式為x5+x3+x2+x+1對(duì)應(yīng)的代碼101111。3、CRC碼集選擇的原則:若設(shè)碼字長(zhǎng)度為N,信息字段為K位,校驗(yàn)字段為R位(N=K+R),則對(duì)于CRC碼集中的任一碼字,存在且僅存在一個(gè)R次多項(xiàng)式g(x),使得V(x)=A(x)g(x)=xRm(x)+r(x);其中: m(x)為K次信息多項(xiàng)式, r(x)為R-1次校驗(yàn)多項(xiàng)式,g(x)稱(chēng)為生成多項(xiàng)式:g(x)=g0+g1x+ g2x2+.+g(R-1)x(R-1)+gRxR發(fā)送方通過(guò)指定的g(x)產(chǎn)生CRC碼字,接收方則通過(guò)該g(x)來(lái)驗(yàn)證收到的CRC碼字。4、CRC校驗(yàn)碼軟件生成方法:借助于多項(xiàng)式除法,其余數(shù)為校驗(yàn)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年金融機(jī)構(gòu)與中小企業(yè)公對(duì)公信用貸款合同3篇
- 美食廣場(chǎng)食品安全檢測(cè)制度
- 交通運(yùn)輸設(shè)備采購(gòu)招投標(biāo)流程
- 網(wǎng)絡(luò)安全防護(hù)指南
- 填筑土方施工合同
- 倉(cāng)儲(chǔ)物流中心續(xù)租合同
- 2024年水電設(shè)備安全認(rèn)證與檢測(cè)服務(wù)合同3篇
- 金融行業(yè)總監(jiān)理合同模板
- 房屋共同使用權(quán)保險(xiǎn)合同
- 醫(yī)療設(shè)備采購(gòu)項(xiàng)目承攬
- 保險(xiǎn)學(xué)期末試題及答案
- 高一數(shù)學(xué)上學(xué)期期末模擬試卷01-【中職專(zhuān)用】2024-2025學(xué)年高一數(shù)學(xué)上學(xué)期(高教版2023基礎(chǔ)模塊)(解析版)
- 《外傷性顱內(nèi)積氣》課件
- 2024-2025學(xué)年人教版八年級(jí)上冊(cè)地理期末測(cè)試卷(一)(含答案)
- 統(tǒng)編版(2024新版)七年級(jí)上冊(cè)道德與法治第四單元綜合測(cè)試卷(含答案)
- 滬教版英語(yǔ)小學(xué)六年級(jí)上學(xué)期期末試題與參考答案(2024-2025學(xué)年)
- 北京市海淀區(qū)2023-2024學(xué)年四年級(jí)上學(xué)期語(yǔ)文期末試卷
- 南京審計(jì)大學(xué)《中級(jí)財(cái)務(wù)會(huì)計(jì)》2023-2024學(xué)年第一學(xué)期期末試卷
- 【MOOC】電工電子學(xué)-浙江大學(xué) 中國(guó)大學(xué)慕課MOOC答案
- 2024道路設(shè)計(jì)計(jì)算書(shū)
- 人教版八年級(jí)上冊(cè)數(shù)學(xué)期末考試試題有答案
評(píng)論
0/150
提交評(píng)論