'================================= '名称 CRC16 '参数 Data Byte() 数据内容 ' Offset Integer 数组起始位置,默认值 0(从数组第一个元素开始) ' Length Integer 计算长度,默认值 0(计算整个数组) '返回 Byte() 2字节,低在前,高在后 '说明 计算CRC16值 '日期 2007-03-09 ' 2007-03-15 修改Length判断 '================================= Public Function GetCRC16(Data() As Byte, Optional ByVal Offset As Integer = 0, Optional ByVal Length As Integer = 0) As Byte() Dim CRC16Lo As Byte, CRC16Hi As Byte 'CRC寄存器 Dim CL As Byte, CH As Byte '多项式码&HA001 Dim SaveHi As Byte, SaveLo As Byte Dim I As Integer Dim Flag As Integer Dim ReturnData(1) As Byte CRC16Lo = &HFF CRC16Hi = &HFF CL = &H1 CH = &HA0 Length = IIf(Length < 1, UBound(Data) - Offset, Length - 1) 'Update 2007-03-15 For I = Offset To Offset + Length CRC16Lo = CRC16Lo Xor Data(I) '每一个数据与CRC寄存器进行异或 For Flag = 0 To 7 SaveHi = CRC16Hi SaveLo = CRC16Lo CRC16Hi = CRC16Hi \ 2 '高位右移一位 CRC16Lo = CRC16Lo \ 2 '低位右移一位 If ((SaveHi And &H1) = &H1) Then '如果高位字节最后一位为1 CRC16Lo = CRC16Lo Or &H80 '则低位字节右移后前面补1 End If '否则自动补0 If ((SaveLo And &H1) = &H1) Then '如果LSB为1,则与多项式码进行异或 CRC16Hi = CRC16Hi Xor CH CRC16Lo = CRC16Lo Xor CL End If Next Next ReturnData(0) = CRC16Lo 'CRC低位 ReturnData(1) = CRC16Hi 'CRC高位 GetCRC16 = ReturnData End Function
用定时器处理,加个Timer定时器Private Sub Timer1_Timer() Static A As Integer Select Case A Case 0 ‘第一条指令 Case 1 ‘第二条指令 Case 2 ‘第三条指令 End Select A=(A+1)Mod 3 End Sub
'=================================
'名称 CRC16
'参数 Data Byte() 数据内容
' Offset Integer 数组起始位置,默认值 0(从数组第一个元素开始)
' Length Integer 计算长度,默认值 0(计算整个数组)
'返回 Byte() 2字节,低在前,高在后
'说明 计算CRC16值
'日期 2007-03-09
' 2007-03-15 修改Length判断
'=================================
Public Function GetCRC16(Data() As Byte, Optional ByVal Offset As Integer = 0, Optional ByVal Length As Integer = 0) As Byte()
Dim CRC16Lo As Byte, CRC16Hi As Byte 'CRC寄存器
Dim CL As Byte, CH As Byte '多项式码&HA001
Dim SaveHi As Byte, SaveLo As Byte
Dim I As Integer
Dim Flag As Integer
Dim ReturnData(1) As Byte
CRC16Lo = &HFF
CRC16Hi = &HFF
CL = &H1
CH = &HA0
Length = IIf(Length < 1, UBound(Data) - Offset, Length - 1) 'Update 2007-03-15
For I = Offset To Offset + Length
CRC16Lo = CRC16Lo Xor Data(I) '每一个数据与CRC寄存器进行异或
For Flag = 0 To 7
SaveHi = CRC16Hi
SaveLo = CRC16Lo
CRC16Hi = CRC16Hi \ 2 '高位右移一位
CRC16Lo = CRC16Lo \ 2 '低位右移一位
If ((SaveHi And &H1) = &H1) Then '如果高位字节最后一位为1
CRC16Lo = CRC16Lo Or &H80 '则低位字节右移后前面补1
End If '否则自动补0
If ((SaveLo And &H1) = &H1) Then '如果LSB为1,则与多项式码进行异或
CRC16Hi = CRC16Hi Xor CH
CRC16Lo = CRC16Lo Xor CL
End If
Next
Next
ReturnData(0) = CRC16Lo 'CRC低位
ReturnData(1) = CRC16Hi 'CRC高位
GetCRC16 = ReturnData
End Function
Static A As Integer
Select Case A
Case 0
‘第一条指令
Case 1
‘第二条指令
Case 2
‘第三条指令
End Select
A=(A+1)Mod 3
End Sub