打印

在接收端怎么对CRC校验方法产生的数据进行校验?

[复制链接]
12570|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wcjaglzf|  楼主 | 2011-6-10 11:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 wcjaglzf 于 2011-6-10 11:13 编辑

unsigned char Array[2]={0xaa,0x59};
/******************************
形参:    一个指针和一个长度值
返回值:   一个unsigned int的CRC校验码
******************************/
unsigned int Crcprocess(unsigned char data *p,unsigned char len)  
{
    unsigned char i;\
unsigned int Crc;
while(len--)         
  {
      for(i=0x80;i!=0;i>>=1)
    {
        if((Crc&0x8000) != 0)    { Crc<<=1; Crc ^= 0x1021;}
     else                     { Crc<<=1;}
     if((*p&i) != 0)          Crc ^= 0x1021;
    }
   p++;
  }
return Crc;
}

===================================
假如这是发送端产生的CRC校验码的子函数。
要发送的数据为一个的数据A(即数组array[2],这里用p来指向他),用这个方法的CRC校验码为B
然后我们将A、B一起发送过去。
那么,在这里想请教一下高手们,在接收端怎么对这个数据进行鉴定呢?

相关帖子

沙发
hotpower| | 2011-6-22 00:57 | 只看该作者
板凳
刘前辈| | 2011-6-22 10:00 | 只看该作者
本帖最后由 刘前辈 于 2011-6-22 10:22 编辑

这里扩展2字节存放Crc 码:
unsigned char Array[4]={0xaa,0x59,00,00};
/******************************
形参:    一个指针和一个长度值
返回值:   一个unsigned int的CRC校验码
******************************/
unsigned int Crcprocess(unsigned char data *p,unsigned char len)  
{
    unsigned char i;\
unsigned int Crc;
while(len--)         
  {
      for(i=0x80;i!=0;i>>=1)
    {
        if((Crc&0x8000) != 0)    { Crc<<=1; Crc ^= 0x1021;}
     else                     { Crc<<=1;}
     if((*p&i) != 0)          Crc ^= 0x1021;
    }
   p++;
  }
return Crc;
}




void main( )
{
unsigned int CRC_B;
//  发送端
CRC_B=Crcprocess(Array,2);        // 0xaa59的Crc码CRC_B=0x3969

Array[2]=CRC_B>>8;     // 0x39
Array[3]=CRC_B;          //  0x69

//  发送数据帧Array[4]=0xaa593969.

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

// 下面是接收数据端对接收帧 0xaa593969 进行Crc 帧校验
unsigned char Array[6];   // 接收帧数据。

if ( Crcprocess(Array, 4 ) != 0)
  {  
   //  接收帧Crc帧校验错误处理代码;
   }

//  若Crc==0,接收帧校验正确。
  
while(1);

}
Hotpower的网上CRC计算,选用crc16-ccitt(X16+X12+X5+1),初值为0000.

//

使用特权

评论回复
地板
hotpower| | 2011-6-25 17:30 | 只看该作者
这都是基本的

使用特权

评论回复
5
coody| | 2011-6-25 18:45 | 只看该作者
接收方将所有数据包括CRC进行校验,结果为0就正确,非0就错误

使用特权

评论回复
6
hotpower| | 2011-6-25 19:26 | 只看该作者
接收方将所有数据包括CRC进行校验,结果为0就正确,非0就错误
coody 发表于 2011-6-25 18:45


是这样的,它是CRC的一条性质

使用特权

评论回复
7
刘前辈| | 2011-6-26 12:09 | 只看该作者
死记硬背这条CRC性质?恐怕永远记不住。记错了更麻烦。
和十进制一样,很简单的原理:

1、假定发送数据多项式等于A(x);生成多项式G(x)=1021;余数CRC=R(x);商=Q(x);
2、A(x)/G(x) = Q(x) + R(x)/G(x)
  于是接收端:  A(x) - R(x) = Q(x)G(x) + 0000(余数CRC=0)


、、

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

21

帖子

2

粉丝