Foxtable(狐表)用户栏目专家坐堂 → [求助]求CRC16 校验码算法例子


  共有8919人关注过本帖树形打印复制链接

主题:[求助]求CRC16 校验码算法例子

帅哥哟,离线,有人找我吗?
111yangguojun
  11楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:243 积分:1928 威望:0 精华:0 注册:2013/8/8 23:49:00
  发帖心情 Post By:2014/12/24 19:01:00 [只看该作者]

#include<stdio.h>

unsigned int calccrc(unsigned char crcbuf,unsigned int crc)
{
 unsigned char i;
 crc=crc ^ crcbuf;
 for(i=0;i<8;i++)
 {
  unsigned char chk;
  chk=crc&1;
  crc=crc>>1;
  crc=crc&0x7fff;
  if (chk==1)
  crc=crc^0xa001;
  crc=crc&0xffff;
 }
 return crc;

}

unsigned int chkcrc(unsigned char *buf,unsigned char len)
{
 unsigned char hi,lo;
 unsigned int i;
 unsigned int crc;
 crc=0xFFFF;
 for (i=0;i<len;i++)
 {
  crc=calccrc(*buf,crc);
  buf++;
 }
 hi=crc%256;
 lo=crc/256;
 crc=(hi<<8)|lo;
 return crc;
}

void main()
{
 //char buf[8]={0x01,0x03,0x00,0x00,0x00,0x02};
 char buf[8]={0x01,0x04,0x00,0x00,0x00,0x0a};
 int modbus,i;

 //memset(buf,0,sizeof(buf));
 //for(i=0;i<8;i++)
 {
 // buf[i]=40+i;
 }

 modbus = chkcrc(buf,sizeof(buf)-2);
 printf("----modbus=%x\n",modbus);
}

 

这个是  VC的算法,这个经过测试,结果是正确的!


 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  12楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2014/12/24 19:35:00 [只看该作者]

全局代码

 

Public Function calccrc(crcbuf As Uinteger, crc As Uinteger) As Uinteger
Dim i As Uinteger
crc = crc Xor crcbuf
For i = 0 To 7
 Dim chk As Uinteger
 chk = crc And 1
 crc = crc >> 1
 crc = crc And &H7fff
 If chk = 1 Then
  crc = crc Xor &Ha001
 End If
 crc = crc And &Hffff
Next
Return crc
End Function

Public Function chkcrc(buf As Uinteger(),len As Uinteger) As Uinteger
Dim hi As Uinteger, lo As Uinteger
Dim i As Uinteger
Dim crc As Uinteger
crc = &Hffff
For i = 0 To len - 1
 crc = calccrc(buf(i), crc)
Next
hi = crc Mod 256
lo = crc / 256
crc = (hi << 8) Or lo
Return crc
End Function

 

 

调用代码

 

Dim aaff As uInteger() = {&H01, &H04, &H00, &H00, &H00, &H0a}
Dim aa As Integer = chkcrc(aaff, aaff.Length)
Dim bb As String = Convert.ToString(aa, 16).ToUpper()
msgbox(bb)


 回到顶部
帅哥哟,离线,有人找我吗?
54292550
  13楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:283 积分:4135 威望:0 精华:0 注册:2011/8/19 10:07:00
[讨论]CRC校验的问题~  发帖心情 Post By:2015/3/22 10:32:00 [只看该作者]

Dim aaff As uInteger() = {&H55, &H05, &H01}
Dim aa As Integer = chkcrc(aaff, aaff.Length)
Dim bb As String = Convert.ToString(aa, 16).ToUpper()
msgbox(bb)

执行结果A341

我用CRC校验工具查出来的是A340

这是哪儿的问题?

 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  14楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2015/3/22 12:07:00 [只看该作者]

算法有问题,换一种算法

 

Public Function crc_16(Array As UInteger(), Len As UInteger) As UInteger
 Dim IX As UInteger, IY As UInteger, CRC As UInteger
        Dim Rcvbuf(1) As UInteger
 CRC = &Hffff
 'set all 1
 If Len <= 0 Then
  CRC = 0
 Else
  Len -= 1
  

  For IX = 0 To Len
   CRC = CRC Xor (Array(IX))
   For IY = 0 To 7
    If (CRC And 1) <> 0 Then
     CRC = (CRC >> 1) Xor &Ha001
    Else
     CRC = CRC >> 1
     '
    End If
   Next

  Next
 End If
 Rcvbuf(0) = (CRC And &Hff00) >> 8
 '高位置
 Rcvbuf(1) = (CRC And &Hff)
 '低位置
 CRC = Rcvbuf(0) << 8
 CRC += Rcvbuf(1)
 Return CRC
End Function

 

 

----------------

 

Dim aaff As uInteger() = {&H55, &H05, &H01}
Dim aa As Integer = crc_16(aaff, aaff.Length)
Dim bb As String = Convert.ToString(aa, 16).ToUpper()
msgbox(bb)


 回到顶部
帅哥哟,离线,有人找我吗?
111yangguojun
  15楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:243 积分:1928 威望:0 精华:0 注册:2013/8/8 23:49:00
  发帖心情 Post By:2015/4/4 11:46:00 [只看该作者]

14楼这个算法,计算出来的结果都是正确的图片点击可在新窗口打开查看,非常感谢!

 回到顶部
总数 15 上一页 1 2