1、加入了
CRC校验的发送帧
************************************
——可——编——程——控-制-器-技——术——门——户
Private Sub Timer1_Timer() '定时发送请求
plcjs.技.术_网
Dim CRC() As Byte
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)
Dim s, str As String
WW.W_PLCJS_COM-PLC-技.术_网
Dim myLo, myHi As String
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
Dim i As Integer
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
Dim aa() As Byte
——可——编——程——控-制-器-技——术——门——户
ReDim aa(5) As Byte '定义动态数组
WWW_PLC※JS_COM-PmLC-技.术_网
aa(0) = Form1.Text1.Text
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
aa(1) = &H3
P.L.C.技.术.网——可编程控制器技术门户
aa(2) = &H0
WWW_P※LCJS_CO※M-PLC-技-.术_网
aa(3) = &HA
W1WW_P4LCJS_COM-PLC-技.术_网
aa(4) = &H0
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
aa(5) = &H8
WWcW_PLCJS_COM-PLC-技.术_网
CRC = CRC16(aa) '计算CRC
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
str = CRC
P.L.C.技.术.网——可编程控制器技术门户
s = ""
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
For i = 1 To LenB(str)
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
s = s + Hex(AscB(MidB(str, i, 1)))
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
Next i
WWW_PLCJS_COM-PLC-技.术_网
myLo = Right(s, 2)
WW.W_PLCJS_COM-PLC-技.术_网
myHi = Mid(s, 1, 2)
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
If Len(s) < 4 Then
P.L.C.技.术.网——可编程控制器技术门户
myHi = Mid(s, 1, 1)
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
End If
WW.W_PLCJS_COM-PLC-技.术_网
ReDim Preserve aa(0 To 7) As Byte
——可——编——程——控-制-器-技——术——门——户
aa(6) = Val("&H" & myLo) '取CRC校验高低位
WWW_P※LCJS_COM-PLC-)技.术_网
aa(7) = Val("&H" & myHi)
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
MSComm1.OutBufferCount = 0 '清空输出寄存器
W1WW_P4LCJS_COM-PLC-技.术_网
MSComm1.Output = aa '发送数据
WWW_P※LCJS_COM-PLC-)技.术_网
End Sub
WWW_PLCJS@_COM%-PLC-技.术_网
*********************************
WWW_PLCJS_COM-PLC-技.术_网
2、CRC校验程序
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)
**********************************
plcjs.技.术_网
Function CRC16(data() As Byte) As String
W1WW_P4LCJS_COM-PLC-技.术_网
Dim CRC16Lo As Byte, CRC16Hi As Byte 'CRC寄存器
WWW_PLCJS@_COM%-PLC-技.术_网
Dim CL As Byte, CH As Byte '多项式码&HA001
WWW_PLCJS_COM-PLC-技.术_网
Dim SaveHi As Byte, SaveLo As Byte
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
Dim i As Integer
WWW_P※LCJS_CO※M-PLC-技-.术_网
Dim Flag As Integer
WWW_PL※CJS_COM-PLC-技.术_网
CRC16Lo = &HFF
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
CRC16Hi = &HFF
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
CL = &H1
WWcW_PLCJS_COM-PLC-技.术_网
CH = &HA0
WWW_P※LCJS_CO※M-PLC-技-.术_网
For i = 0 To UBound(data)
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
CRC16Lo = CRC16Lo Xor data(i) '每一个数据与CRC寄存器进行异或
W1WW_P4LCJS_COM-PLC-技.术_网
For Flag = 0 To 7
plcjs.技.术_网
SaveHi = CRC16Hi
WW.W_PLC※JS_C,OM-PL,C-技.术_网
SaveLo = CRC16Lo
WW.W_PLC※JS_C,OM-PL,C-技.术_网
CRC16Hi = CRC16Hi \ 2 '高位右移一位
WW.W_PLCJS_COM-PLC-技.术_网
CRC16Lo = CRC16Lo \ 2 '低位右移一位
WWW_PLC※JS_COM-PmLC-技.术_网
If ((SaveHi And &H1) = &H1) Then '如果高位字节最后一位为1
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
CRC16Lo = CRC16Lo Or &H80 '则低位字节右移后前面补1
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
End If '否则自动补0
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
If ((SaveLo And &H1) = &H1) Then '如果LSB为1,则与多项式码进行异或
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
CRC16Hi = CRC16Hi Xor CH
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
CRC16Lo = CRC16Lo Xor CL
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
End If
WWW.PLCJS.COM——可编程控制器技术门户
Next Flag
WW.W_PLCJS_COM-PLC-技.术_网
Next i
WW.W_PLC※JS_C,OM-PL,C-技.术_网
Dim ReturnData(1) As Byte
——可——编——程——控-制-器-技——术——门——户
ReturnData(0) = CRC16Hi 'CRC高位
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
ReturnData(1) = CRC16Lo 'CRC低位
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
CRC16 = ReturnData
WWW_P※LCJS_CO※M-PLC-技-.术_网
End Function
W1WW_P4LCJS_COM-PLC-技.术_网
*************************************
——可——编——程——控-制-器-技——术——门——户