⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dsss1.cpp

📁 crc16 通用程序,可在单片机或PC上运行.
💻 CPP
字号:
//---------- 2006.11.25
#include <stdio.h>
#include "math.h"

unsigned char  buff[30]=
{// 0xff, 0x7b, 0x00, 0x00 ,0x00 ,0x01, 0x00, 0x00, 0x00, 0x00, 0x35, 0x68, 0xFE};
	0xff,0x78,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf3,0xa8,0xfe};   
               //0x01,0x01,0x01,0x14,0x20,0x31,0x31};
                 //  0x01,0x01,0x23,0x10};
                //   0x00,0x00,0x01,0x31};
   // 0x89, 0xab, 0xcd, 0xef, 0x12 ,0x56 ,0x03 ,0x59 ,0x00 ,0x00 ,0x1C ,0x88 ,0xFE};
     //  0xFF, 0x7F ,0x00 ,0x00, 0x00 ,0x00 ,0x04 ,0x00 , 0xff,0xff,0x75,0x89,0xfe};
              //  0xFC ,0xF3 ,0xFC ,0xF3 ,0x75 ,0x89 ,0xFE};
unsigned char   data_long=0,i,data1;
unsigned   char c;
unsigned long int g=0x00011021;  //G(x)=x(16)+x(12)+x(5)+1
//unsigned long int g=0x00018005;  //G(x)=x(16)+x(15)+x(2)+1
unsigned int sum; //  CRC
unsigned   char  crc16(unsigned  char ),crc162(unsigned char),crc161(unsigned  char );
 unsigned long  int y,z;

void main()
{ // char aaa;
	data_long=10;
    for(i=0;i<data_long;i++)  //crc data_long bytes
 	  { data1=buff[i];
         crc16(data1);  //CRC 1 byte
      }
  
        buff[i++]=sum;   // low 8bits CRC
        sum>>=8;
        buff[i]=sum;     //high 8bits CRC

        for(i=0;i<13;i++)
		{ printf(" buff[%d] = ",i);
        // printf("\n");
        printf("%d", buff[i]);
	    //  printf("%16f", datain[i]);
        printf("\n");
        //  scanf("%c",&aaa);
		}
	 printf("\n");	
}


unsigned   char  crc16(unsigned  char x )   // 计 算  1 byte CRC 校 验
   {   unsigned  int y,z;     //unsigned long int g=0x00011021;  //G(x)=x(16)+x(12)+x(5)+1
    unsigned   char  ii;
    z=sum;
    y=x*256;           //<<=8;           //data left 8 bit
    z=z^y;            // CRC+data
    for(ii=0;ii<8;ii++)
	{ 
		if(z&0x8000)  //MSB=1
		{c=1;
		}
        else
		  {c=0;
		  }
          z<<=1;  //data left 1 bit
        if(c)  //c=1
            {// z=z^0x0001021;       //divi  G(x)=x(16)+x(12)+x(5)+1
		      z=z^g;   // Z divi  G(x)=x(16)+x(12)+x(5)+1
            }
        }
    sum= z;  // 1 byte CRC 
   return 0;
 }
unsigned   char  crc162(unsigned  char x )   // 计 算  1 byte CRC 校 验 (最高位为1)
   { //unsigned long  int y,z;     //unsigned long int g=0x00011021;  //G(x)=x(16)+x(12)+x(5)+1
     unsigned   char ii;
     z=0;
     z=sum;
     y=x*256;               //<<=8;           //data left 8 bit
     z=z^y;            // CRC+data
   for(ii=0;ii<8;ii++)
        { z<<=1;
        if(z&0x010000)
             {  z=z^g;//0x00011021;       //divi  G(x)=x(16)+x(12)+x(5)+1
              }
       }
    sum= z;
    return 0;
   }

unsigned   char  crc161(unsigned  char x )   // 计 算  1 byte CRC 校 验 (最高位为1)
   {   unsigned long  int y,z;     //unsigned long int g=0x00011021;  //G(x)=x(16)+x(12)+x(5)+1
     unsigned   char ii;
    z=sum;
    y=x*256;               //<<=8;           //data left 8 bit
    z=z^y;            // CRC+data
   for(ii=0;ii<8;ii++)
        { z<<=1;
        if(z&0x010000)
             {  z=z^0x00011021;       //divi  G(x)=x(16)+x(12)+x(5)+1
              }
       }
    sum= z;
    return 0;
   }

 ///////////////////////////////////////////
 /*                    0x01/0x011021
                                  1
                        ....................................
 1 0001 0000 0010 0001 |  000000001 00000000 00000000
                                  1 00010000 00100001
                           ...............................
                                  0 00010000 00100001  =0x1021
      ////////////////////////////////////////////
                   0x02/0x011021
                                 1
                        ....................................
 1 0001 0000 0010 0001 |  000000010 00000000 00000000
                                 10 00100000 0100001
                           ...............................
                                  0 00100000 01000010  =0x2042

/////////////////////////////////////////////////
               0x01 0x01 0x01 /0x011021
                           1     1      1
                        ....................................
 1 0001 0000 0010 0001 |  01 00000001 00000001 00000000 00000000
                           1 00010000 00100001
                           ...............................
                           0 00010001 00100000 0000
                                10001 00000010 0001
                                ..................................
                                        100010 00010000 000
                                        100010 00000100 001
                                        ............................
                                                  10100 00100000 =0x1420
  //////////////////////////////////////////////////////////////////////////////////
          0x89 0xab 0xcd 0xef 0x12 0x56/0x011021
                           1     1      1
                        .........................................................
 1 0001 0000 0010 0001 |  10001001 10101011 11001101 11101111 00010010 01010110  00000000 00000000
                          10001000 00010000 1
                         ....  ...............................
                                 1 10111011 01001101
                                 1 00010000 00100001
                                ..................................
                                   10101011 01101100 1
                                   10001000 00010000 1
                                  ............................
                                     100011 01111100 011
                                     100010 00000100 001
                                     ........................
                                          1 01111000 01001111
                                          1 00010000 00100001
                                          .....................
                                             1101000 01101110 00
                                             1000100 00001000 01
                                             ...................
                                              101100 01100110 010
                                              100010 00000100 001
                                              .......................
                                                1110 01100010 01110
                                                1000 10000001 00001
                                                .......................
                                                 110 11100011 011110
                                                 100 01000000 100001
                                                 ......................
                                                  10 10100011 1111111
                                                  10 00100000 0100001
                                                  ...................
                                                     10000011 10111100 0
                                                     10001000 00010000 1
                                                     ....................
                                                         1011 10101100 11010
                                                         1000 10000001 00001
                                                         ...................
                                                           11 00101101 1101111
                                                           10 00100000 0100001
                                                           ...................
                                                            1 00001101 10011100
                                                            1 00010000 00100001
                                                            ...................
                                                                 11101 10111101  0000
                                                                 10001 00000010  0001
                                                                 .....................
                                                                  1100 10111111  00010
                                                                  1000 10000001  00001
                                                                  .....................
                                                                   100 00111110  000110
                                                                   100 01000000  100001
                                                                   ....................
                                                                        1111110  10011100 00
                                                                        1000100  00001000 01
                                                                        .....................
                                                                         111010  10010100 010
                                                                         100010  00000100 001
                                                                         ....................
                                                                          11000  10010000 0110
                                                                          10001  00000010 0001
                                                                          .....................
                                                                           1001  10010010 01110
                                                                           1000  10000001 00001
                                                                           ....................
                                                                              1  00010011 01111000
                                                                              1  00010000 00100001
                                                                              .....................
                                                                                       11 01011001=0x0359  =crc





是这样的,在查表法CRC计算的程序中,数据参与计算之前应该先进行镜像计算,如:F0―0F

    然后才能参与计算,因为线路码是低位在前发送的,而CRC计算通常是高位在前,应该颠倒一下。

    而Z85C30的结果是高位在前发送的,所以还应该颠倒一下,并且取反,即0―1

    所以通过Z85C30输出的CRC结果为:

    00――FFFF
    01----6E77
    ......

    如果对以上的数据取反即得:

    00――0000
    01----9188
    ......
	Z85C30的CRC已经调试通过了,结果是这样的:

    CRC1(高字节)CRC2(低字节):每个字节高位在前。

    然后对CRC取反。

    用软件计算时,应将参与计算的每个数据镜像反转。









*///////////////////////

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -