B4A实现CRC16校验(Modbus)

介绍

循环冗余校验(Cyclic Redundancy Check, CRC)是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术,主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除法及余数的原理来作错误侦测的。

1.设置CRC寄存器,并给其赋值FFFF(hex)。
2.将数据的第一个8-bit字符与16位CRC寄存器的低8位进行异或,并把结果存入CRC寄存器。
3.CRC寄存器向右移一位,MSB补零,移出并检查LSB。
4.如果LSB为0,重复第三步;若LSB为1,CRC寄存器与多项式码相异或。
注意:该步检查LSB应该是右移前的LSB,即第3步前的LSB。
5.重复第3与第4步直到8次移位全部完成。此时一个8-bit数据处理完毕。
6.重复第2至第5步直到所有数据全部处理完成。
7.最终CRC寄存器的内容即为CRC值。

B4A

这里提供一个 Modbus 的 CRC16 校验计算,亲测可用!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Sub CRC16(buf() As Byte, lbuf As Short) As Byte()

Dim CRC(2) As Byte
Dim crcval As Short
crcval = 0xffff
For i = 0 To lbuf - 1
crcval = Bit.Xor(crcval,Bit.And( buf(i),0xff))
For j = 0 To 7
If Bit.And(crcval, 1) > 0 Then
crcval =Bit.And( Bit.ShiftRight(crcval,1),0x7fff)
crcval=Bit.Xor(crcval, 0xa001)
Else
crcval =Bit.And( Bit.ShiftRight(crcval,1),0x7fff)
End If
Next 'j
Next 'i
CRC(0) = Bit.And(crcval, 0xff)
CRC(1) = Bit.And(crcval, 0xff00) / 256
Return CRC

End Sub

下面这个是 modbus 返回计算校验

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Sub MB_Read(Func As Byte) As Boolean
Dim addr As Byte
Dim crcval(2) As Byte
If(MB_RecvDataLength <= 1 ) Then
Return False
End If
addr = Main.Int_DevAddr
If(MB_RecvData(0) <> addr ) Then
Return False
End If
If(MB_RecvData(1) <> Func ) Then
Return False
End If
crcval = CRC16(MB_RecvData,MB_RecvDataLength -2)
If(crcval(0) <> MB_RecvData(MB_RecvDataLength - 2) Or crcval(1) <> MB_RecvData(MB_RecvDataLength - 1) ) Then
Return False
End If
MB_RecvDataLength = 0
Return True
End Sub
坚持原创技术分享,您的支持将鼓励我继续创作!