打印
[AVR单片机]

CRC16校验函数

[复制链接]
3678|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chrisbo|  楼主 | 2011-2-24 09:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在GCC里有个CRC16校验头文件<util/crc16.h>,里面定义了3个校验函数,其中一个是这样的:
Polynomial: x^16 + x^12 + x^5 + 1 (0x1021)<br>
    Initial value: 0x0
    This is the CRC used by the Xmodem-CRC protocol.
    The following is the equivalent functionality written in C.
    \code
    uint16_t
    crc_xmodem_update (uint16_t crc, uint8_t data)
    {
        int i;
        crc = crc ^ ((uint16_t)data << 8);
        for (i=0; i<8; i++)
        {
            if (crc & 0x8000)
                crc = (crc << 1) ^ 0x1021;
            else
                crc <<= 1;
        }
        return crc;
    }
    \endcode */
其中的这条语句-crc = crc ^ ((uint16_t)data << 8);是什么作用呢?看了好长时间也没能想明白,期待高手帮忙解答!

相关帖子

沙发
chrisbo|  楼主 | 2011-2-24 19:37 | 只看该作者
。。又没人回帖,再次郁闷

使用特权

评论回复
板凳
john_lee| | 2011-2-24 19:47 | 只看该作者
不回你贴,是因为要说清楚这个问题,非常麻烦的,要讲一大堆,而且这个是crc的基础实现原理,网上有很多资料的,你可以自己查嘛,再者,如果你是做应用的,没有必要搞清楚它的内部实现,直接用函数就可以了。

使用特权

评论回复
地板
szlrsmt| | 2011-2-25 14:08 | 只看该作者
帮你顶一下咯

使用特权

评论回复
5
chrisbo|  楼主 | 2011-2-28 17:13 | 只看该作者
自己写了个CRC16校验函数通过测试了。。不用它的了

使用特权

评论回复
6
chang_feng_1| | 2011-4-2 14:31 | 只看该作者
我这里有一个,你可以参考下
uint CRC16(uchar *PSrc,uchar Count)     //CRC16计算函数
{
          uchar i,Temp;
        uint CRC=0xFFFF;
        for(i=0;i<Count;i++)
        {
                CRC=CRC^*(PSrc++);
                for(Temp=0;Temp<8;Temp++)
                {
                        if((CRC&0x01)==1)
                        {
                                CRC=(CRC>>1)^0xA001;
                        }
                        else
                        {
                                CRC=CRC>>1;
                        }
                }
        }
        return CRC;

使用特权

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

本版积分规则

个人签名:吾生之有涯,而知也无涯!

0

主题

55

帖子

0

粉丝