您的位置:首頁>>管理中心>>行業(yè)資訊>>新聞資訊正文
 
計算CRC-16循環(huán)冗余校驗碼的C51程序
新聞ID號:  14296 無標(biāo)題圖片
資訊類型:  交流培訓(xùn)
所屬類別:  UPS電源; 變頻電源; 發(fā)電機組; 通信電源; 傳感器
關(guān) 鍵 字:  CRC-16/循環(huán)冗余校驗碼/C51程序
內(nèi)容描述:  ~
發(fā)布時間:  2008/2/4 11:22:44
更新時間:  2008/2/4 11:22:44
審核情況:  已審核開通[2008/2/4 11:22:44]
瀏覽次數(shù):  共 6994 人/次
新聞來源:  ~
鏈    接:  ~
責(zé)任編輯:  ~
發(fā) 布 者:  rousunluo
公    司:  深圳市諾順科技有限公司
圖片文件
原文件名:~
保存文件:~
路徑文件:~
管理操作:  修改  設(shè)置為未審核  發(fā)布公告  發(fā)布新聞資訊
內(nèi)    容:

一、計算步驟:

1、定義一個初始值為FFFF的16位的組合變量(regs),該變量稱為CRC寄存器。

2、把欲發(fā)送或接收消息的高8位和CRC寄存器的底8位作異或運算,并把結(jié)果在賦到CRC寄存器。

3、CRC寄存器右移1位(朝最低位),同時最高位添零。取出并檢查最低位是否為1。

4、如果為1,則CRC寄存器與多項式A001異或;如果為0,則重復(fù)第3步的動作。

5、重復(fù)3和4直到完成了8次移位。這樣完整的8位字節(jié)將完成處理了。

6、對于下一個8位字節(jié)的處理就是重復(fù)第2步到第5步了

7、把所有的欲發(fā)送或接收消息這樣處理后,CRC寄存器里的值就是我們最終需要得到的CRC校驗碼(在result中)。

二、C51源程序

/*CRC數(shù)組計算程序*/

#include <stdio.h>

typedef unsigned char uchar;//定義簡寫類型

typedef unsigned short u16;//定義簡寫類型

u16 result;//放計算后的CRC結(jié)果值

u16 len=6;//參與計算的數(shù)組個數(shù)(不包括CRC兩子節(jié))

//數(shù)組1

//uchar ppp[]={0xFF,0x03,0xC0,0x21,0x04,0x03,0x00,0x07,0x0D,0x03,0x06};

//CRC高節(jié)=0x9b,CRC低節(jié)=0x03,即result=0x9B03  len=11

//數(shù)組2

uchar ppp[]={0x64,0x03,0x00,0x0A,0x00,0x01};

//CRC高節(jié)=0xfd,CRC低節(jié)=0xad 即result=0xfdad len=6

//定義組合結(jié)構(gòu)

typedef union

{

    u16 val;

    struct

    {

        u16 bit0 : 1;

        u16 bit1 : 1;

        u16 bit2 : 1;

        u16 bit3 : 1;

        u16 bit4 : 1;

        u16 bit5 : 1;

        u16 bit6 : 1;

        u16 bit7 : 1;

        u16 bit8 : 1;

        u16 bit9 : 1;

        u16 bit10 : 1;

        u16 bit11 : 1;

        u16 bit12 : 1;

        u16 bit13 : 1;

        u16 bit14 : 1;

        u16 bit15 : 1;

    } bits;

} CRCREGS;

CRCREGS regs;

 

u16 CRCCheck(uchar *pp,u16 CRClen)

{

bit a;

int i,j;

regs.val=0xffff;

pp=&ppp[0];

for(i=0;i<CRClen;i++)

 {

  regs.val^=pp[i];

  for(j=0;j<8;j++)

   {

    a=regs.bits.bit0;

    regs.val>>=1;   

    if(a) regs.val^=0xA001;

   }

 }

  return regs.val;

}

 

/* 主程序 */

void main()

{

result=CRCCheck(ppp,len);

}

三、簡要說明

1、程序中列了兩組數(shù),可以做測試用,結(jié)果都在注釋中,注意 len 的值要與數(shù)組的個數(shù)相匹配,數(shù)組1為11,數(shù)組2為6;

2、regs.val是一個共用體變量,該變量既可以作為字用,也可以進行位操作,詳細(xì)情況請參照變量union和共用和struct結(jié)構(gòu)類型體說明;

3、在主程序中直接調(diào)用result=CRCCheck(ppp,len);即可得到CRC-16結(jié)果,注意ppp是一個數(shù)組變量,在函數(shù)中是當(dāng)成數(shù)組變量指針用的。

本人參考了許多資料,通過反復(fù)修本人認(rèn)為是比較精練的C51程序,完全可以直接用到編程中去。希望能夠?qū)ν杏兴鶐椭?/font>
主站蜘蛛池模板: 精品综合久久久久久888蜜芽| 久久综合亚洲色HEZYO社区| 国产成人综合精品一区| 色欲色香天天天综合网站| 狠狠色综合网站久久久久久久高清| 亚洲欧美日韩综合二区三区| 欧美激情中文字幕综合一区| 国产成人综合亚洲亚洲国产第一页| 狠狠色噜噜色狠狠狠综合久久| 国产综合在线观看| 色欲综合久久躁天天躁蜜桃| 伊伊人成亚洲综合人网7777| 亚洲激情综合网| 欧美日韩国产色综合一二三四| 狠狠色丁香婷综合久久| 色妞色综合久久夜夜| 91精品一区二区综合在线| 伊人成年综合网| 亚洲国产精品综合久久一线| 色婷婷综合久久久久中文字幕| 精品国产综合区久久久久久| 欧美亚洲综合色| 一本久久综合亚洲鲁鲁五月天| 国产成人综合一区精品| 国产综合久久久久久鬼色| 亚洲国产综合欧美在线不卡| 成人综合久久精品色婷婷| 国产婷婷色综合AV蜜臀AV| 大香网伊人久久综合网2020| 色8激情欧美成人久久综合电| 亚洲伊人久久综合影院| 久久久久久青草大香综合精品| 综合久久给合久久狠狠狠97色| 丁香五月亚洲综合深深爱| 久久综合狠狠综合久久综合88| 一日本道伊人久久综合影| 狠狠色成人综合首页| 国产天堂一区二区综合| 狠狠综合久久综合中文88| 丁香五月综合缴情综合| 久久精品水蜜桃av综合天堂|