发表于:2009/1/16 0:30:17
#0楼
这是我从VBGOOD看到的一个帖子 觉得很好 转来请大家分析一下
'*****************************************************************************************
'*功能: 计算modbus校验码,参数为byte类型的数组,此数组包括校验码。 *
'*返回值: 返回一个long型数据,此long数据包括校验码的高位和低位 *
'*Author: *
'*修改日期: 2006-6-22 *
'*备注: 此函数很容易修改成为封包添加校验码,例如: *
'* dim longCRC as long *
'* longCRC = CRC16(frame()) 'frame()为封包 *
'* frame(UBound(frame) - 1) = longCRC Mod 256 *
'* frame(UBound(frame)) = longCRC \ 256 *
'*****************************************************************************************
Function CRC16(Coun() As Byte) As Long
Dim intBit, intTemp As Integer
Dim lonCRC As Long
lonCRC = &HFFFF&
For intCnt = 0 To UBound(Coun) - 2
lonCRC = lonCRC Xor Coun(intCnt)
For intBit = 0 To 7
intTemp = lonCRC Mod 2
lonCRC = lonCRC \ 2
If intTemp = 1 Then
lonCRC = lonCRC Xor &HA001&
End If
Next intBit
Next intCnt
CRC16 = lonCRC
End Function
·······························································
我想问的是我如果做一个两台PC机之间的通信 或者单片机同PC的通信
那这个校验信息怎么加入呢。。。。
我的程序是一个自发自收的类似聊天室的程序,集合了发送和接收:
Private Sub Command1_Click()
Winsock1.SendData txtSend.Text
End Sub
Private Sub Form_Load()
Dim my As String
Winsock1.Protocol = sckUDPProtocol '设置为UDP协义
Winsock1.LocalPort = 4001 '随便设置,不过两个要一样
Winsock1.RemotePort = 4001
my = Winsock1.LocalIP '取得自己的IP地址,是不要的
Winsock1.RemoteHost = Text1.Text '这里通过text1填入需要通信的IP地址
End Sub
Private Sub Text1_Change()
Winsock1.RemoteHost = Text1.Text
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) '取得数据时发生
Dim Tmp As String
Winsock1.GetData Tmp, vbString '取得数据
Tmp = "对方位址:" + Winsock1.RemoteHostIP + "发言内容为-->" + Tmp
txtMess.Text = Tmp + Chr$(13) + Chr$(10) + txtMess.Text
End Sub
其中的难点是怎么把CRC校验位加入所发送数据的后面,是应该打包还是怎样还是做成数组的形式? 如果是数组,那整个Text的数据怎么载入?
然后在接收端接收到数据后又怎么把数据再计算一次跟校验位比较,如果一致就说明数据未丢失,算是一种软件的加密吧。。。。
'*****************************************************************************************
'*功能: 计算modbus校验码,参数为byte类型的数组,此数组包括校验码。 *
'*返回值: 返回一个long型数据,此long数据包括校验码的高位和低位 *
'*Author: *
'*修改日期: 2006-6-22 *
'*备注: 此函数很容易修改成为封包添加校验码,例如: *
'* dim longCRC as long *
'* longCRC = CRC16(frame()) 'frame()为封包 *
'* frame(UBound(frame) - 1) = longCRC Mod 256 *
'* frame(UBound(frame)) = longCRC \ 256 *
'*****************************************************************************************
Function CRC16(Coun() As Byte) As Long
Dim intBit, intTemp As Integer
Dim lonCRC As Long
lonCRC = &HFFFF&
For intCnt = 0 To UBound(Coun) - 2
lonCRC = lonCRC Xor Coun(intCnt)
For intBit = 0 To 7
intTemp = lonCRC Mod 2
lonCRC = lonCRC \ 2
If intTemp = 1 Then
lonCRC = lonCRC Xor &HA001&
End If
Next intBit
Next intCnt
CRC16 = lonCRC
End Function
·······························································
我想问的是我如果做一个两台PC机之间的通信 或者单片机同PC的通信
那这个校验信息怎么加入呢。。。。
我的程序是一个自发自收的类似聊天室的程序,集合了发送和接收:
Private Sub Command1_Click()
Winsock1.SendData txtSend.Text
End Sub
Private Sub Form_Load()
Dim my As String
Winsock1.Protocol = sckUDPProtocol '设置为UDP协义
Winsock1.LocalPort = 4001 '随便设置,不过两个要一样
Winsock1.RemotePort = 4001
my = Winsock1.LocalIP '取得自己的IP地址,是不要的
Winsock1.RemoteHost = Text1.Text '这里通过text1填入需要通信的IP地址
End Sub
Private Sub Text1_Change()
Winsock1.RemoteHost = Text1.Text
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) '取得数据时发生
Dim Tmp As String
Winsock1.GetData Tmp, vbString '取得数据
Tmp = "对方位址:" + Winsock1.RemoteHostIP + "发言内容为-->" + Tmp
txtMess.Text = Tmp + Chr$(13) + Chr$(10) + txtMess.Text
End Sub
其中的难点是怎么把CRC校验位加入所发送数据的后面,是应该打包还是怎样还是做成数组的形式? 如果是数组,那整个Text的数据怎么载入?
然后在接收端接收到数据后又怎么把数据再计算一次跟校验位比较,如果一致就说明数据未丢失,算是一种软件的加密吧。。。。