打印

CRC16问题求助!

[复制链接]
1617|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Newer_darui|  楼主 | 2013-7-15 20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人新手,正在做一个MODBUS协议的485通讯,其中关于CRC16校验一直得不到正确值。厂方给了一个例数:01 03 00 00 00 05 CRC:85 C9。我看到网上关于CRC的算法,就是将信息后面加16个0,然后再对0X18005进行异或计算,我用手算了一下得到了一个CRC值是F8 95。结果和我在单片机上用网上下载的一个函数得出的值相同。本以为是厂方给的例数错了,可是又下载了一个CRC16计算工具,算了一下,结果却是:85 C9。本人现在很迷惑,为什么会出现这种情况,不知道错在哪里,之后在网上又下载了几个程序,可是算出来的值更不一样。求高人指点我可能在哪里犯了什么错误。或者您如果有CRC16的程序,能计算出我给的例数的话,那麻烦您把程序给我一下。感激不尽啊!!
沙发
jekey| | 2013-7-15 21:07 | 只看该作者
网上搜索很多modbus的crc代码都不对?

使用特权

评论回复
板凳
Newer_darui|  楼主 | 2013-7-15 21:42 | 只看该作者
jekey 发表于 2013-7-15 21:07
网上搜索很多modbus的crc代码都不对?

是啊,都得不到正确的CRC值。每次换个函数,得到的值都不一样。

使用特权

评论回复
地板
jekey| | 2013-7-16 20:14 | 只看该作者
我觉得你不够认真,下面的代码,搜索,出来的网站一大堆。
计算是正确的。

unsigned int crc_chk(unsigned char* pData, unsigned char length)
{
        int j;
        unsigned int reg_crc=0xFFFF;
        while(length--)
        {
                reg_crc ^= *pData++;
                for(j=0;j<8;j++)
                {
                        if(reg_crc & 0x01) /* LSB(b0)=1 */
                                reg_crc=(reg_crc>>1) ^ 0xA001;
                        else
                                reg_crc=reg_crc >>1;
                }
        }
       
        return reg_crc;
}

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
Newer_darui + 1 真的,你这个程序一试就出来结果了,不过我.
5
yklstudent| | 2013-7-17 09:26 | 只看该作者
WINAVR编译器就自带这个CRC校验源代码的 直接调用就可以了
PIC的 可以COPY过来用

使用特权

评论回复
6
hotpower| | 2018-12-30 01:26 | 只看该作者

使用特权

评论回复
7
yewuyi| | 2019-1-3 15:06 | 只看该作者
hotpower 发表于 2018-12-30 01:26
http://www.hotpage.com.cn/hotcrc

老农,好久不见。

使用特权

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

本版积分规则

4

主题

10

帖子

1

粉丝