久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8212|回復: 3
打印 上一主題 下一主題
收起左側

CRC8校驗分析

[復制鏈接]
跳轉到指定樓層
樓主
ID:112317 發表于 2016-4-7 03:47 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

CRC循環冗余校驗碼Cyclic Redundancy Check):是數據通信領域中最常用的一種差錯校驗碼,其特征是信息字段和校驗字段的長度可以任意選定。

     CRC校驗可以簡單地描述為:例如我們要發送一些數據(信息字段),為了避免一些干擾以及在接收端的對讀取的數據進行判斷是否接受的是真實的數據,這時我們就要加上校驗數據(即CRC校驗碼),來判斷接收的數據是否正確。在發送端,根據要傳送的k位二進制碼序列,以一定的規則(CRC校驗有不同的規則。這個規則,在差錯控制理論中稱為生成多項式。)產生一個校驗用的r位校驗碼(CRC),附在原始信息后邊,構成一個新的二進制碼序列數共k+r位,然后發送出去。在接收端,根據信息碼和CRC碼之間所遵循的規則(即與發送時生成CRC校驗碼相同的規則)進行檢驗,校驗采用計算機的模二除法,即除數和被除數(即生成多項式)做異或運算,進行異或運算時除數和被除數最高位對齊,進行按位異或運算,若最終的數據能被除盡,則傳輸正確;否則,傳輸錯誤。

     CRC8即最終生成的CRC校驗碼為1字節,其生成多項式,生成多項式為g(x)=x8+x5+x4+1,相當于g(x=1·x8+0·x7+0·x6+1·x5+1·x4+0·x3+0·x2+0·x1+1·x0,即對應的二進制數為100110001

    CRC8校驗算法:

     1.CRC8校驗的一般性算法:

        例如:  信息字段代碼為: 00000001 00000010         ————    對應m(x)=x8+x

                   生成多項式為:g(x)=x8+x5+x4+1                 ————    對應g(x)的二進制代碼為:100110001

        現在我們將要對2字節數據0x0102生成CRC8校驗碼,并最終將生成的1字節CRC校驗碼跟在0x0102的后面,即 0x01 02 ##,(##8CRC碼),最終生成的3字節數據就是經CRC8校驗生成的數據。

        先計算x8m(x)=x16+x9,對應的2進制數為:100000010 00000000  。可以看到這樣運算所得到的結果其實就是將信息字段代碼的數左移8位。因為最終要將生成的8CRC8校驗碼附在信息字段的后面,所以要將信息字段的數左移8位。最后用x8m(x)得到的二進制數對生成多項式g(x)進行模二運算,最終的余數(其二進制數的位數一定比生成多項式g(x)的位數。┚褪撬CRC8校驗碼。

(差與被除數高位對齊)

       100000010 00000000

    ^ 100110001 

  ---------------------------

       000110011 00000000

    ^      100110 001

  ---------------------------

            010101  00100000

     ^          10011 0001

  ---------------------------

              00110 00110000

    ^           100 110001

  ---------------------------

                 010 11110100

    ^            10 0110001

  ---------------------------

                   00 10010110

       x8m(x)做模二運算取余得100101100x96),這個8位的二進制數就是CRC8校驗碼。所以,經CRC8校驗后研發送的數據就是0x010296。          

  for (_bit = 8; _bit > 0; --_bit)
  { 
     if (crc & 0x80) 
     {
       crc = (crc << 1) ^ 0x0131;(所有多項式的最高位都為1,所以左移1位)
     }
      else
      {
       crc = (crc << 1);
      }
  }

CRC examples 
 
The input message 11011100 (0xDC) will have as result 01111001 (0x79). 
 
The input message 01101000 00111010 () will have as result 01111100 (0x7C). 
 
The input message 01001110 10000101 () will have as result 01101011 (0x6B).

    

    2.CRC8校驗在DS18B20中的應用:

      以上分析的是常規的CRC8校驗方法。在DS18B20中,有兩處用到CRC。一是DS18B208字節的序列號,最后一字節是前面七個字節的CRC碼,這是為了保證序列號的唯一性與正確性;另一個是在DS18B20內部9字節的高速溫度存儲器,其第9字節是前面8個字節的CRC校驗碼,這是為了溫度數據傳輸的正確性。而在DS18B20中生成CRC碼所用到的方法不同于常規生成算法,它采用的是逆序CRC信息單元編碼算法,該CRC的生成是由DS18B20中的多項式寄存器通過其中所包含的移位寄存器以及異或門對輸入該多項式寄存器的每一位二進制數做一定的運算所得到的CRC碼(可以查看Maxim官網上DS18B20的應用筆記Note27,專門介紹DS18B20CRC詳細生成過程)。在此列舉兩種DS18B20CRC校驗的C程序。

      A.按位運算方法
1.  /********************************************************/  
2.     /*DS18B20的CRC8校驗程序*/  
3.     /********************************************************/   
4.     uchar calcrc_1byte(uchar abyte)   
5.     {   
6.        uchar i,crc_1byte;     
7.        crc_1byte=0;                //設定crc_1byte初值為0  
8.        for(i = 0; i < 8; i++)   
9.         {   
10.       if(((crc_1byte^abyte)&0x01))   
11.          {   
12.            crc_1byte^=0x18;     
13.            crc_1byte>>=1;   
14.            crc_1byte|=0x80;   
15.           }         
16.        else     
17.           crc_1byte>>=1;   
18.        abyte>>=1;         
19.      }   
20.      return crc_1byte;   
21. }   
22. uchar calcrc_bytes(uchar *p,uchar len)  
23. {  
24.  uchar crc=0;  
25.  while(len--) //len為總共要校驗的字節數  
26.   {  
27.     crc=calcrc_1byte(crc^*p++);  
28.   }  
29.  return crc;  //若最終返回的crc為0,則數據傳輸正確  
30. }  

      B.查表法
        unsigned char crc_array[256] = {
                                                    0x00, 0x5e, 0xbc, 0xe2, 0x61, 0x3f, 0xdd, 0x83,
                                                    0xc2, 0x9c, 0x7e, 0x20, 0xa3, 0xfd, 0x1f, 0x41, 
                                                    0x9d, 0xc3, 0x21, 0x7f, 0xfc, 0xa2, 0x40, 0x1e,
                                                    0x5f, 0x01, 0xe3, 0xbd, 0x3e, 0x60, 0x82, 0xdc, 
                                                    0x23, 0x7d, 0x9f, 0xc1, 0x42, 0x1c, 0xfe, 0xa0,
                                                    0xe1, 0xbf, 0x5d, 0x03, 0x80, 0xde, 0x3c, 0x62, 
                                                    0xbe, 0xe0, 0x02, 0x5c, 0xdf, 0x81, 0x63, 0x3d,
                                                    0x7c, 0x22, 0xc0, 0x9e, 0x1d, 0x43, 0xa1, 0xff,
                                                    0x46, 0x18, 0xfa, 0xa4, 0x27, 0x79, 0x9b, 0xc5, 
                                                    0x84, 0xda, 0x38, 0x66, 0xe5, 0xbb, 0x59, 0x07,
                                                    0xdb, 0x85, 0x67, 0x39, 0xba, 0xe4, 0x06, 0x58,
                                                    0x19, 0x47, 0xa5, 0xfb, 0x78, 0x26, 0xc4, 0x9a,
                                                    0x65, 0x3b, 0xd9, 0x87, 0x04, 0x5a, 0xb8, 0xe6, 
                                                    0xa7, 0xf9, 0x1b, 0x45, 0xc6, 0x98, 0x7a, 0x24, 
                                                    0xf8, 0xa6, 0x44, 0x1a, 0x99, 0xc7, 0x25, 0x7b,
                                                    0x3a, 0x64, 0x86, 0xd8, 0x5b, 0x05, 0xe7, 0xb9, 
                                                    0x8c, 0xd2, 0x30, 0x6e, 0xed, 0xb3, 0x51, 0x0f, 
                                                    0x4e, 0x10, 0xf2, 0xac, 0x2f, 0x71, 0x93, 0xcd,
                                                    0x11, 0x4f, 0xad, 0xf3, 0x70, 0x2e, 0xcc, 0x92,
                                                    0xd3, 0x8d, 0x6f, 0x31, 0xb2, 0xec, 0x0e, 0x50, 
                                                    0xaf, 0xf1, 0x13, 0x4d, 0xce, 0x90, 0x72, 0x2c, 
                                                    0x6d, 0x33, 0xd1, 0x8f, 0x0c, 0x52, 0xb0, 0xee, 
                                                    0x32, 0x6c, 0x8e, 0xd0, 0x53, 0x0d, 0xef, 0xb1, 
                                                    0xf0, 0xae, 0x4c, 0x12, 0x91, 0xcf, 0x2d, 0x73, 
                                                    0xca, 0x94, 0x76, 0x28, 0xab, 0xf5, 0x17, 0x49,
                                                    0x08, 0x56, 0xb4, 0xea, 0x69, 0x37, 0xd5, 0x8b,
                                                    0x57, 0x09, 0xeb, 0xb5, 0x36, 0x68, 0x8a, 0xd4,
                                                    0x95, 0xcb, 0x29, 0x77, 0xf4, 0xaa, 0x48, 0x16, 
                                                    0xe9, 0xb7, 0x55, 0x0b, 0x88, 0xd6, 0x34, 0x6a, 
                                                    0x2b, 0x75, 0x97, 0xc9, 0x4a, 0x14, 0xf6, 0xa8, 
                                                    0x74, 0x2a, 0xc8, 0x96, 0x15, 0x4b, 0xa9, 0xf7,
                                                    0xb6, 0xe8, 0x0a, 0x54, 0xd7, 0x89, 0x6b, 0x35,
                                                    };
            unsigned char CRC8_Table(unsigned char *p, char counter)
            {
               unsigned char crc8 = 0;
               for( ; counter > 0; counter--)
                {
                   crc8 = CRC8Table[crc8^*p]; //查表得到CRC碼
                   p++;
                }
              return crc8;

            }
       DS18B20的兩種校驗CRC碼的方法本質上都是一樣的。查表法是對0x00~0xff這256個數依次生成與每一個數對應的CRC碼所組合成的表,每次算一字節數據的CRC碼不用經過calcrc_1byte(uchar abyte)這個函數對每個數據的最低位進行判斷是1還是0,而直接通過查表的方式直接提取出  crc8^*p的CRC碼,其運行效率相對按位運算方法更高,但是查表法所列的表卻很占空間。  

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1 發表于 2016-4-7 03:57 | 只看該作者
51黑的這篇也不錯 CRC校驗原理:http://www.zg4o1577.cn/bbs/dpj-31885-1.html
回復

使用道具 舉報

板凳
ID:155719 發表于 2019-4-1 11:04 | 只看該作者
受教受教,保存了好好閱讀一番
回復

使用道具 舉報

地板
ID:406489 發表于 2019-9-18 09:57 | 只看該作者
感謝分享
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91伦理片 | 国产高清视频 | 中文字幕视频在线观看 | 欧美日韩亚洲系列 | 成人免费在线 | 精品视频久久久 | 国产精品激情小视频 | 精品精品视频 | 农夫在线精品视频免费观看 | 欧美视频免费 | 成人精品区 | 国产福利视频导航 | 免费永久av | 亚洲欧美精品 | 亚洲精品自拍 | 日韩欧美精品 | 日批免费观看 | 亚州无限乱码 | 日韩精品一区二区三区中文在线 | 黄色大全免费看 | 欧美一级二级三级 | 无码日韩精品一区二区免费 | gogo肉体亚洲高清在线视 | 午夜在线电影网 | 久操福利| 精品久久国产 | 亚洲在线一区二区 | 超碰97免费在线 | 2019天天干天天操 | 五月婷婷在线视频 | 日韩国产黄色片 | 久草热8精品视频在线观看 午夜伦4480yy私人影院 | 毛片网站在线观看视频 | 成人午夜免费视频 | 一区二区高清在线观看 | h在线免费观看 | 久久久久久九九九九九九 | 亚洲一区二区视频在线播放 | 免费黄色录像片 | 精品91 | 欧美在线精品一区 |