Foxtable(狐表)用户栏目专家坐堂 → crc16校验代码怎么写


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

主题:crc16校验代码怎么写

帅哥哟,离线,有人找我吗?
YDS
  1楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:598 积分:3347 威望:0 精华:0 注册:2011/5/21 18:05:00
crc16校验代码怎么写  发帖心情 Post By:2018/11/15 16:58:00 [只看该作者]

最近在做一个飞行控制系统,用到串口通信,想请教一下crc16校验代码怎么写,要求低位在前  我想用一个自定义函数来写,要怎么写,请教大神!

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


加好友 发短信
等级:二尾狐 帖子:598 积分:3347 威望:0 精华:0 注册:2011/5/21 18:05:00
  发帖心情 Post By:2018/11/15 17:06:00 [只看该作者]

查表法
  查表法的优缺点与计算法的正好相反。为了便于比较,这里所有的假定与计

算法的完全相同,都而在窗体上放置一个Command1的按钮,其代码部分与上面的

也完全一致。下面只介绍CRC函数的编写源代码。

 
以下内容为程序代码:

1 Private Function CRC16(data() As Byte) As String
2    Dim CRC16Hi As Byte
3    Dim CRC16Lo As Byte
4    CRC16Hi = &HFF
5    CRC16Lo = &HFF
6    Dim i As Integer
7    Dim iIndex As Long
8    For i = 0 To UBound(data)
9     iIndex = CRC16Lo Xor data(i)
10     CRC16Lo = CRC16Hi Xor GetCRCLo(iIndex)    '低位处理
11     CRC16Hi = GetCRCHi(iIndex)          '高位处理
12    Next i
13    Dim ReturnData(1) As Byte
14    ReturnData(0) = CRC16Hi    'CRC高位
15    ReturnData(1) = CRC16Lo    'CRC低位
16    CRC16 = ReturnData
17  End Function
18
19   'CRC低位字节值表
20 Function GetCRCLo(Ind As Long) As Byte
21    GetCRCLo = Choose(Ind + 1, &H0, &HC1, &H81, &H40, &H1, &HC0,
22
23 &H80, &H41, &H1, &HC0, &H80, &H41, &H0, &HC1, &H81, &H40, &H1, &HC0,
24
25 &H80, &H41, &H0, &HC1, &H81, &H40, &H0, &HC1, &H81, &H40, &H1, &HC0,
26
27 &H80, &H41, &H1, &HC0, &H80, &H41, &H0, &HC1, &H81, &H40, &H0, &HC1,
28
29 &H81, &H40, &H1, &HC0, &H80, &H41, &H0, &HC1, &H81, &H40, &H1, &HC0,
30
31 &H80, &H41, &H1, &HC0, &H80, &H41, &H0, &HC1, &H81, &H40, &H1, &HC0,
32
33 &H80, &H41, &H0, &HC1, &H81, &H40, &H0, &HC1, &H81, &H40, &H1, &HC0,
34
35 &H80, &H41, &H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, &H1, &HC0,
36
37 &H80, &H41, &H0, &HC1, &H81, &H40, &H0, &HC1, &H81, &H40, &H1, &HC0,
38
39 &H80, &H41, &H1, &HC0, &H80, &H41, &H0, &HC1, &H81, &H40, &H1, &HC0,
40
41 &H80, &H41, &H0, &HC1, &H81, &H40, &H0, &HC1, &H81, &H40, &H1, &HC0,
42
43 &H80, &H41, &H1, &HC0,
44 &H80, &H41, &H0, &HC1, &H81, &H40, &H0, &HC1, &H81, &H40, &H1, &HC0,
45
46 &H80, &H41, &H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, &H1, &HC0,
47
48 &H80, &H41, &H0, &HC1, &H81, &H40, &H0, &HC1, &H81, &H40, &H1, &HC0,
49
50 &H80, &H41, &H1, &HC0, &H80, &H41, &H0, &HC1, &H81, &H40, &H1, &HC0,
51
52 &H80, &H41, &H0, &HC1, &H81, &H40, &H0, &HC1, &H81, &H40, &H1, &HC0,
53
54 &H80, &H41, &H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, &H1, &HC0,
55
56 &H80, &H41, &H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, &H0, &HC1,
57
58 &H81, &H40, &H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, &H1, &HC0,
59
60 &H80, &H41, &H0, &HC1, &H81, &H40, &H0, &HC1, &H81, &H40, &H1, &HC0,
61
62 &H80, &H41, &H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, &H1, &HC0,
63
64 &H80, &H41, &H0, &HC1, &H81, &H40)
65   End Function
66
67   'CRC高位字节值表
68   Function GetCRCHi(Ind As Long) As Byte
69    GetCRCHi = Choose(Ind + 1, &H0, &HC0, &HC1, &H1, &HC3, &H3, &H2,
70
71 &HC2, &HC6, &H6, &H7, &HC7, &H5, &HC5, &HC4, &H4, &HCC, &HC, &HD, &HCD,
72
73 &HF, &HCF, &HCE, &HE, &HA, &HCA, &HCB, &HB, &HC9, &H9, &H8, &HC8, &HD8,
74
75 &H18, &H19, &HD9, &H1B, &HDB, &HDA, &H1A, &H1E, &HDE, &HDF, &H1F, &HDD,
76
77 &H1D, &H1C, &HDC, &H14, &HD4, &HD5, &H15, &HD7, &H17, &H16, &HD6, &HD2,
78
79 &H12, &H13, &HD3, &H11, &HD1, &HD0, &H10, &HF0, &H30, &H31, &HF1, &H33,
80
81 &HF3, &HF2, &H32, &H36, &HF6, &HF7, &H37, &HF5, &H35, &H34, &HF4, &H3C,
82
83 &HFC, &HFD, &H3D, &HFF, &H3F, &H3E, &HFE, &HFA, &H3A, &H3B, &HFB, &H39,
84
85 &HF9, &HF8, &H38, &H28, &HE8, &HE9, &H29, &HEB, &H2B, &H2A, &HEA, &HEE,
86
87 &H2E, &H2F, &HEF, &H2D, &HED, &HEC, &H2C, &HE4, &H24, &H25, &HE5, &H27,
88
89 &HE7, &HE6, &H26, &H22, &HE2, &HE3, &H23, &HE1, &H21, &H20, &HE0, &HA0,
90
91 &H60,
92 &H61, &HA1, &H63, &HA3, &HA2, &H62, &H66, &HA6, &HA7, &H67, &HA5, &H65,
93
94 &H64, &HA4, &H6C, &HAC, &HAD, &H6D, &HAF, &H6F, &H6E, &HAE, &HAA, &H6A,
95
96 &H6B, &HAB, &H69, &HA9, &HA8, &H68, &H78, &HB8, &HB9, &H79, &HBB, &H7B,
97
98 &H7A, &HBA, &HBE, &H7E, &H7F, &HBF, &H7D, &HBD, &HBC, &H7C, &HB4, &H74,
99
100 &H75, &HB5, &H77, &HB7, &HB6, &H76, &H72, &HB2, &HB3, &H73, &HB1, &H71,
101
102 &H70, &HB0, &H50, &H90, &H91, &H51, &H93, &H53, &H52, &H92, &H96, &H56,
103
104 &H57, &H97, &H55, &H95, &H94, &H54, &H9C, &H5C, &H5D, &H9D, &H5F, &H9F,
105
106 &H9E, &H5E, &H5A, &H9A, &H9B, &H5B, &H99, &H59, &H58, &H98, &H88, &H48,
107
108 &H49, &H89, &H4B, &H8B, &H8A, &H4A, &H4E, &H8E, &H8F, &H4F, &H8D, &H4D,
109
110 &H4C, &H8C, &H44, &H84, &H85, &H45, &H87, &H47, &H46, &H86, &H82, &H42,
111
112 &H43, &H83, &H41, &H81, &H80, &H40)
113   End Function

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


加好友 发短信
等级:二尾狐 帖子:598 积分:3347 威望:0 精华:0 注册:2011/5/21 18:05:00
  发帖心情 Post By:2018/11/15 17:06:00 [只看该作者]

这个可以用不?要怎么用?

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


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


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


加好友 发短信
等级:二尾狐 帖子:598 积分:3347 威望:0 精华:0 注册:2011/5/21 18:05:00
  发帖心情 Post By:2018/11/16 10:01:00 [只看该作者]

我看了一下,也测试了,但是生成的不对,我把我的协议的要求说一下

CRC码的计算方法:

<!--[if !supportLists]-->(1) <!--[endif]-->预置116位的寄存器为十六进制FFFF(即全为1);称此寄存器为CRC寄存器;

<!--[if !supportLists]-->(2) <!--[endif]-->把第一个8位二进制数据既通讯信息帧的第一个字节16位的CRC寄存器的低8位相异或,把结果放于CRC寄存器;

<!--[if !supportLists]-->(3) <!--[endif]-->CRC寄存器的内容右移一位朝低位0填补最高位,并检查右移后的移出位;

<!--[if !supportLists]-->(4) <!--[endif]-->如果移出位为0:重复第3再次右移一位;如果移出位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或;

<!--[if !supportLists]-->(5) <!--[endif]-->重复步骤34,直到右移8次,这样整个8位数据全部进行了处理;

<!--[if !supportLists]-->(6) <!--[endif]-->重复步骤2到步骤5,进行通讯信息帧下一个字节的处理;

<!--[if !supportLists]-->(7) <!--[endif]-->将该通讯信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高、低字节进行交换;

<!--[if !supportLists]-->(8) <!--[endif]-->最后得到的CRC寄存器内容即为CRC码。


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


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

1、认认真真看完整个帖子测试。

 

2、请举例说明输入什么、输出什么才是你需要的。

 

 


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


加好友 发短信
等级:二尾狐 帖子:598 积分:3347 威望:0 精华:0 注册:2011/5/21 18:05:00
  发帖心情 Post By:2018/11/16 10:21:00 [只看该作者]

输入 01,03,00,02,00,02
输出 65,CB

输入 01,03,04,01,F4,13,88
输出 B7,6B

以上是正确的输入,给出的算法如下:
CRC码的计算方法:
(1)预置1个16位的寄存器为十六进制FFFF(即全为1);称此寄存器为CRC寄存器;
(2)把第一个8位二进制数据(既通讯信息帧的第一个字节)与16位的CRC寄存器的低8位相异或,把结果放于CRC寄存器;
(3)把CRC寄存器的内容右移一位(朝低位)用0填补最高位,并检查右移后的移出位;
(4)如果移出位为0:重复第3步(再次右移一位);如果移出位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或;
(5)重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;
(6)重复步骤2到步骤5,进行通讯信息帧下一个字节的处理;
(7)将该通讯信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高、低字节进行交换;
(8)最后得到的CRC寄存器内容即为CRC码。

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


加好友 发短信
等级:二尾狐 帖子:598 积分:3347 威望:0 精华:0 注册:2011/5/21 18:05:00
  发帖心情 Post By:2018/11/16 10:23:00 [只看该作者]

再写一组:

输入 01,06,00,00,09,60
输出 8F,B2

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/11/16 10:37: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() = {&H01, &H03, &H04, &H01, &Hf4, &H13, &H88}
Dim aa As Integer = crc_16(aaff, aaff.Length)
Dim bb As String = Convert.ToString(aa, 16).ToUpper()
msgbox(bb)

 


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


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

这样也可以

 

Public chCRCHTalbe As UInteger() = {&H0, &Hc1, &H81, &H40, &H1, &Hc0, _
&H80, &H41, &H1, &Hc0, &H80, &H41, _
&H0, &Hc1, &H81, &H40, &H1, &Hc0, _
&H80, &H41, &H0, &Hc1, &H81, &H40, _
&H0, &Hc1, &H81, &H40, &H1, &Hc0, _
&H80, &H41, &H1, &Hc0, &H80, &H41, _
&H0, &Hc1, &H81, &H40, &H0, &Hc1, _
&H81, &H40, &H1, &Hc0, &H80, &H41, _
&H0, &Hc1, &H81, &H40, &H1, &Hc0, _
&H80, &H41, &H1, &Hc0, &H80, &H41, _
&H0, &Hc1, &H81, &H40, &H1, &Hc0, _
&H80, &H41, &H0, &Hc1, &H81, &H40, _
&H0, &Hc1, &H81, &H40, &H1, &Hc0, _
&H80, &H41, &H0, &Hc1, &H81, &H40, _
&H1, &Hc0, &H80, &H41, &H1, &Hc0, _
&H80, &H41, &H0, &Hc1, &H81, &H40, _
&H0, &Hc1, &H81, &H40, &H1, &Hc0, _
&H80, &H41, &H1, &Hc0, &H80, &H41, _
&H0, &Hc1, &H81, &H40, &H1, &Hc0, _
&H80, &H41, &H0, &Hc1, &H81, &H40, _
&H0, &Hc1, &H81, &H40, &H1, &Hc0, _
&H80, &H41, &H1, &Hc0, &H80, &H41, _
&H0, &Hc1, &H81, &H40, &H0, &Hc1, _
&H81, &H40, &H1, &Hc0, &H80, &H41, _
&H0, &Hc1, &H81, &H40, &H1, &Hc0, _
&H80, &H41, &H1, &Hc0, &H80, &H41, _
&H0, &Hc1, &H81, &H40, &H0, &Hc1, _
&H81, &H40, &H1, &Hc0, &H80, &H41, _
&H1, &Hc0, &H80, &H41, &H0, &Hc1, _
&H81, &H40, &H1, &Hc0, &H80, &H41, _
&H0, &Hc1, &H81, &H40, &H0, &Hc1, _
&H81, &H40, &H1, &Hc0, &H80, &H41, _
&H0, &Hc1, &H81, &H40, &H1, &Hc0, _
&H80, &H41, &H1, &Hc0, &H80, &H41, _
&H0, &Hc1, &H81, &H40, &H1, &Hc0, _
&H80, &H41, &H0, &Hc1, &H81, &H40, _
&H0, &Hc1, &H81, &H40, &H1, &Hc0, _
&H80, &H41, &H1, &Hc0, &H80, &H41, _
&H0, &Hc1, &H81, &H40, &H0, &Hc1, _
&H81, &H40, &H1, &Hc0, &H80, &H41, _
&H0, &Hc1, &H81, &H40, &H1, &Hc0, _
&H80, &H41, &H1, &Hc0, &H80, &H41, _
&H0, &Hc1, &H81, &H40}

Public chCRCLTalbe As Uinteger() = {&H0, &Hc0, &Hc1, &H1, &Hc3, &H3, _
&H2, &Hc2, &Hc6, &H6, &H7, &Hc7, _
&H5, &Hc5, &Hc4, &H4, &Hcc, &Hc, _
&Hd, &Hcd, &Hf, &Hcf, &Hce, &He, _
&Ha, &Hca, &Hcb, &Hb, &Hc9, &H9, _
&H8, &Hc8, &Hd8, &H18, &H19, &Hd9, _
&H1b, &Hdb, &Hda, &H1a, &H1e, &Hde, _
&Hdf, &H1f, &Hdd, &H1d, &H1c, &Hdc, _
&H14, &Hd4, &Hd5, &H15, &Hd7, &H17, _
&H16, &Hd6, &Hd2, &H12, &H13, &Hd3, _
&H11, &Hd1, &Hd0, &H10, &Hf0, &H30, _
&H31, &Hf1, &H33, &Hf3, &Hf2, &H32, _
&H36, &Hf6, &Hf7, &H37, &Hf5, &H35, _
&H34, &Hf4, &H3c, &Hfc, &Hfd, &H3d, _
&Hff, &H3f, &H3e, &Hfe, &Hfa, &H3a, _
&H3b, &Hfb, &H39, &Hf9, &Hf8, &H38, _
&H28, &He8, &He9, &H29, &Heb, &H2b, _
&H2a, &Hea, &Hee, &H2e, &H2f, &Hef, _
&H2d, &Hed, &Hec, &H2c, &He4, &H24, _
&H25, &He5, &H27, &He7, &He6, &H26, _
&H22, &He2, &He3, &H23, &He1, &H21, _
&H20, &He0, &Ha0, &H60, &H61, &Ha1, _
&H63, &Ha3, &Ha2, &H62, &H66, &Ha6, _
&Ha7, &H67, &Ha5, &H65, &H64, &Ha4, _
&H6c, &Hac, &Had, &H6d, &Haf, &H6f, _
&H6e, &Hae, &Haa, &H6a, &H6b, &Hab, _
&H69, &Ha9, &Ha8, &H68, &H78, &Hb8, _
&Hb9, &H79, &Hbb, &H7b, &H7a, &Hba, _
&Hbe, &H7e, &H7f, &Hbf, &H7d, &Hbd, _
&Hbc, &H7c, &Hb4, &H74, &H75, &Hb5, _
&H77, &Hb7, &Hb6, &H76, &H72, &Hb2, _
&Hb3, &H73, &Hb1, &H71, &H70, &Hb0, _
&H50, &H90, &H91, &H51, &H93, &H53, _
&H52, &H92, &H96, &H56, &H57, &H97, _
&H55, &H95, &H94, &H54, &H9c, &H5c, _
&H5d, &H9d, &H5f, &H9f, &H9e, &H5e, _
&H5a, &H9a, &H9b, &H5b, &H99, &H59, _
&H58, &H98, &H88, &H48, &H49, &H89, _
&H4b, &H8b, &H8a, &H4a, &H4e, &H8e, _
&H8f, &H4f, &H8d, &H4d, &H4c, &H8c, _
&H44, &H84, &H85, &H45, &H87, &H47, _
&H46, &H86, &H82, &H42, &H43, &H83, _
&H41, &H81, &H80, &H40}

Public Function CRC16(pchMsg As uinteger(), wDataLen As ushort) As ushort
Dim chCRCHi As uinteger = &Hff
' 高CRC 字节初始化
Dim chCRCLo As uinteger = &Hff
' 低CRC 字节初始化
Dim wIndex As ushort
Dim i As ushort = 0
' CRC 循环中的索引
While wDataLen > 0
    ' 计算CRC
    wIndex = chCRCLo Xor pchMsg(i)
    i += 1
    chCRCLo = chCRCHi Xor chCRCHTalbe(wIndex)
    chCRCHi = chCRCLTalbe(wIndex)
    wDataLen -= 1
End While
Return ((chCRCHi << 8) Or chCRCLo)

End Function

 

调用

 

Dim aaff As uInteger() = {&H01, &H03, &H04, &H01, &Hf4, &H13, &H88}
Dim aa As Integer = CRC16(aaff, aaff.Length)
Dim bb As String = Convert.ToString(aa, 16).ToUpper()
msgbox(bb)


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