📄 dsss1.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 + -