您现在所在的是:

串口通信

回帖:15个,阅读:2099 [上一页] [1] [2] [下一页]
* 帖子主题:

怎么取出仪表数据

1182
ykang0208
文章数:83
年度积分:50
历史总积分:1182
注册时间:2008/4/29
发站内信
发表于:2010/10/2 11:39:29
#10楼
是不是前边改任意一个数值CRC16高位低位都有变化呀!
1182
ykang0208
文章数:83
年度积分:50
历史总积分:1182
注册时间:2008/4/29
发站内信
发表于:2010/10/5 17:40:43
#11楼
生成一个CRC的流程为:
1 预置一个16位寄存器为0FFFFH(全1),称之为CRC寄存器。
2 把数据帧中的第一个字节的8位与CRC寄存器中的低字节进行异或运算,结果存回CRC寄存器。
3 将CRC寄存器向右移一位,最高位填以0,最低位移出并检测。
4 如果最低位为0:重复第三步(下一次移位);如果最低位为1:将CRC寄存器与一个预设的固定值(0A001H)进行异或运算。
5 重复第三步和第四步直到8次移位。这样处理完了一个完整的八位。
6 重复第2步到第5步来处理下一个八位,直到所有的字节处理结束。
7 最终CRC寄存器的值就是CRC的值。

请问 固定值(0A001H)从何而来,我看有些写的不一样呀。
是不是固定值(0A001H)是厂家设出来的标准
1182
ykang0208
文章数:83
年度积分:50
历史总积分:1182
注册时间:2008/4/29
发站内信
发表于:2010/10/5 17:52:09
#12楼
CRC-16(循环冗余错误校验)
  冗余循环码(CRC)包含2个字节,即16位二进制。CRC码由发送设备
计算,放置于发送信息的尾部。接收信息的设备再重新计算接收到信
息的CRC码,比较计算得到的CRC码是否与接收到的相符,如果两者不
相符,则表明出错。
  在进行CRC码计算时只用8位数据位。起始位、停止位、奇偶校验
位都不参与CRC码计算。
  计算CRC码的步骤为:
  ① 预置16位寄存器为十六进制FFFF(即全为1)。称此寄存器为CRC寄
存器。
  ② 把第一个8位数据与16位CRC寄存器的低位相异或运算,把结果
放于CRC寄存器。
  ③ 把寄存器的内容右移一位,用0填补最高位,检查最低位。
  ④ 如果最低位为0:重复第3步,再次右移一位;如果最低位为1
:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或运算。
  ⑤ 重复步骤③和④,直到右移8次,这样整个8位数据全部进行了
处理。
  ⑥ 重复步骤②到⑤,进行下个8位数据的处理。
  ⑦ 最后得到的CRC寄存器的值即为CRC码。
  ⑧ 将CRC码分成高8位和低8位,按低位在先,高位在后,将它们
加到传送数据之后。
直接法生成代码:
unsigned short crc_16(unsigned char *Array, unsigned char *Rcvbuf,unsigned int Len)
{
       unsigned int  IX,IY,CRC;
       CRC=0xFFFF;//set all 1

       if (Len<=0)
               CRC = 0;
       else
       {
               Len--;
               for (IX=0;IX<=Len;IX++)
               {
                       CRC=CRC^(unsigned int)(Array[IX]);
                       for(IY=0;IY<=7;IY++)
                       {
                               if ((CRC&1)!=0 )
                                       CRC=(CRC>>1)^0xA001;
                               else
                                       CRC=CRC>>1;    //
                       }
               }
 
       }
       Rcvbuf[0] = (CRC & 0xff00)>>8;//高位置
       Rcvbuf[1] = (CRC & 0x00ff);  //低位置

       CRC= Rcvbuf[0]<<8;
       CRC+= Rcvbuf[1];
       return CRC;
}
0xA001是怎么出来的那,是仪表固化的吗??
1922
周长锁
文章数:312
年度积分:53
历史总积分:1922
注册时间:2006/4/29
发站内信
08年优秀博客奖
发表于:2010/10/6 6:36:07
#13楼
http://blog.gkong.com/more.asp?name=zhouchs&id=25000#51069
我做的串口调试,改变数据后点CRC可生成新的校验码。注意发送数据窗口就不要写入原CRC码,只写除CRC外的其他数据,例如0C0300120006,点CRC,会出校验码64D0。地址变为01后校验码是65CD。选取自动加入,发送数据后自动发送校验码。



[此贴子已经被作者于2010/10/6 6:44:29编辑过]
欢迎光临我的BLOG
17528
ahljj
文章数:3386
年度积分:240
历史总积分:17528
注册时间:2002/3/23
发站内信
发表于:2012/4/8 14:52:29
#14楼
此楼内容不符合板块规定,不予显示! 查看原帖内容>>
17528
ahljj
文章数:3386
年度积分:240
历史总积分:17528
注册时间:2002/3/23
发站内信
发表于:2012/5/20 21:12:51
#15楼
此楼内容不符合板块规定,不予显示! 查看原帖内容>>

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2024 Gkong.com, All Rights Reserved

62.4004