打印

大家一般情况下用哪种CRC校验多项式?

[复制链接]
13062|53
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
bhsdlmj|  楼主 | 2009-10-9 14:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
bhsdlmj|  楼主 | 2009-10-9 14:28 | 只看该作者
我听说别人用CRC-16 我就也打算学这个

使用特权

评论回复
板凳
ZRL700424| | 2009-10-9 15:22 | 只看该作者
都不用,用CRC8

使用特权

评论回复
地板
bhsdlmj|  楼主 | 2009-10-9 15:50 | 只看该作者
有用查表的?有用计算的?

大家用哪个种?

使用特权

评论回复
5
bhsdlmj|  楼主 | 2009-10-9 16:34 | 只看该作者
这么重要的东西难道都没有人关注么????都在弄什么呢??:Q

使用特权

评论回复
6
ZRL700424| | 2009-10-9 16:36 | 只看该作者
一般都用查表,计算太慢了

使用特权

评论回复
7
bhsdlmj|  楼主 | 2009-10-9 16:58 | 只看该作者
有多慢???

使用特权

评论回复
8
ZRL700424| | 2009-10-9 17:03 | 只看该作者
有多慢???
bhsdlmj 发表于 2009-10-9 16:58


不同的单片机不同,你写个程序仿真一下不就知道了?

使用特权

评论回复
9
bhsdlmj|  楼主 | 2009-10-9 17:06 | 只看该作者
CRC16 怎么写?关键是我不会写》????

帮我写个!! 多谢!!!哈哈

使用特权

评论回复
10
ZRL700424| | 2009-10-9 17:14 | 只看该作者
本帖最后由 ZRL700424 于 2009-10-9 17:16 编辑

//单独计算某个值的16位CRC值
unsigned int crc_cal(unsigned char data);
unsigned int crc;
void main(void)
{
        crc=0;        //crc初值
        crc=crc_cal(3);
  while(1);
}

unsigned int crc_cal(unsigned char data)        
{
        unsigned char i;
                for(i=0x80;i!=0;i>>=1)
                {
                        if((crc&0x8000)!=0)
                        {
                                crc<<=1;
                                crc^=0x1021;
                        }
                        else
                        crc<<=1;
                        if((data&i)!=0)
                        crc^=0x1021;
                }
        return(crc);
}

使用特权

评论回复
11
ZRL700424| | 2009-10-9 17:16 | 只看该作者
//计算一组数据的16位CRC
unsigned char crc_buff[]=
{
        0x01,0X02,0X03,0X04,0X05
};

//======================================
unsigned int crc_cal(unsigned char *ptr,unsigned char len);

void main(void)
{
        unsigned char *ptr;
        crc=0;        //crc初值
        ptr=crc_buff;        //指向第一个数据
        crc=crc_cal(ptr,5);       
  while(1);
}

unsigned int crc_cal(unsigned char *ptr,unsigned char len)        //prt为数据指针,len为数据长度
{
        unsigned char i;
        while(len--)
        {
                for(i=0x80;i!=0;i>>=1)
                {
                        if((crc&0x8000)!=0)
                        {
                                crc<<=1;
                                crc^=0x1021;
                        }
                        else
                        crc<<=1;       
                        if((*ptr&i)!=0)
                        crc^=0x1021;
                }       
                ptr++;
        }
        return(crc);
}

使用特权

评论回复
12
zhangzaiqi| | 2009-10-9 19:31 | 只看该作者
天哪,我咋看不懂...

使用特权

评论回复
13
chunyang| | 2009-10-9 19:37 | 只看该作者
这还搞个投票?做标准产品或需要与他人产品互联或替代,那么就只能选择特定的CRC生成多项式,如果是自己的独立产品,则可以自行选定,甚至在某种标准上加以变化,以具体应用为导向。

使用特权

评论回复
14
wi2c| | 2009-10-9 20:28 | 只看该作者
都不用,用CRC8
ZRL700424 发表于 2009-10-9 15:22


而且是查表的
呵呵

非常同意春阳,首先要搞清楚为什么要搞这么个玩意儿
很多人到最后舍本逐末,都不知道自己要干什么了

使用特权

评论回复
15
gongxd126com| | 2009-10-9 20:38 | 只看该作者
checksum

使用特权

评论回复
16
bhsdlmj|  楼主 | 2009-10-10 08:23 | 只看该作者
都不要急!!!我研究研究!!再讲给你听

使用特权

评论回复
17
bhsdlmj|  楼主 | 2009-10-10 08:23 | 只看该作者
天哪,我咋看不懂...
zhangzaiqi 发表于 2009-10-9 19:31



不要急!!!我研究研究!!再讲给你听

使用特权

评论回复
18
想出国打工| | 2009-10-10 08:59 | 只看该作者
共同约定一个多项式,加上crc 可以整除
的原理;计算挺麻烦的;一般的话,checksum 就够用了吧;

使用特权

评论回复
19
bhsdlmj|  楼主 | 2009-10-10 09:15 | 只看该作者
checksum啥意思???:L

使用特权

评论回复
20
bhsdlmj|  楼主 | 2009-10-10 09:15 | 只看该作者
得用手算一算才好啊!!!

使用特权

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

本版积分规则

55

主题

351

帖子

0

粉丝