当前位置:编程学习 > VB >>

网络通讯问题:如何把多次接受到数据合并后再触发处理数据的事件

我只负责接收端的程序,且多线程的网络通讯
数据的格式是:返回码(6个1字节)-命令码(2个1字节)-内容
程序响应了N次DataArrival才接受到一个完整的数据,把数据处理过程放在DataArrival事件中,处理数据时总是提示下标越界的错误。
数据是存放在一个字节数组的全局变量中,没得到完整的数据前就用copymemory把每次接受到的数据存进去
查询状态返回的数据:55 55 55 55 55 55 81 81 00 00
查询时间返回的数据:55 55 55 55 55 55 82 82 00 00 31 30 30
以上数据是16进制的
先接受完数据再处理,处理的过程应该怎么触发?
--------------------编程问答-------------------- 接受一次处理一次的代码
Private Sub ser_sock_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim bytRecv() As Byte
ReDim Preserve bytSource(bytLth + bytesTotal - 1)
ser_sock(Index).GetData bytRecv
CopyMemory bytSource(bytLth), bytRecv(0), bytesTotal’追加存储
bytLth = bytLth + bytesTotal
Rdeal bytLth, bytSource '数据处理过程
End Sub

Sub Rdeal(pckLth As Integer, pckSource() As Byte) 'sktindex As Integer)
Dim mcmd As Byte
Dim i As Integer
Dim bytConst() As Byte '字节数组检验变量
On Error Resume Next ‘注释后就报错
For i = 0 To UBound(pckSource)
ReDim bytConst(5) '返回码字节数组
CopyMemory bytConst(0), packsource(i), 6
If headTest(bytConst) = True Then '返回码检验成功
   Debug.Print "返回码"
   ReDim bytConst(1) '命令码字节数组
   CopyMemory bytConst(0), packsource(i + 6), 2
   If cmdTest = 1 Then
   Debug.Print "查询状态"
   '查询状态数据处理
   ElseIf cmdTest = 2 Then
   Debug.Print "查询时间"
   '查询时间处理
   ElseIf cmdTest = 3 Then
   Debug.Print "查询数据段"
   '查询数据段处理
   ElseIf cmdTest = 4 Then
   Debug.Print "查询记录"
   '查询记录处理
   ElseIf cmdTest = 5 Then
   Debug.Print "设置时间"
   '设置时间处理
   ElseIf cmdTest = 8 Then
   Debug.Print "设置初始化"
   '设置初始化处理
   ElseIf cmdTest = 0 Then
   Debug.Print "无此命令,退出数据处理"
   '数据处理退出
   End If
End If
Next
End Sub

Public Function headTest(bytHead As Variant) As Boolean      '检验返回码
'On Error Resume Next
Dim i As Integer
For i = 0 To UBound(bytHead)
If bytHead(i) = &H55 Then
headTest = True
Else
headTest = False
Exit Function
End If
End Function

Public Function cmdTest(bytcmd As Variant) As Integer      '检验发送的命令码
'On Error Resume Next
If btycmd(0) = &H81 And btycmd(1) = &H81 Then '查询状态
cmdTest = 1
ElseIf btycmd(0) = &H82 And btycmd(1) = &H82 Then '查询时间
cmdTest = 2
ElseIf btycmd(0) = &H83 And btycmd(1) = &H83 Then '查询数据段
cmdTest = 3
ElseIf btycmd(0) = &H84 And btycmd(1) = &H84 Then '查询记录
cmdTest = 4
ElseIf bytcmd(0) = &H85 And btycmd(1) = &H85 Then '设置时间
cmdTest = 5
ElseIf bytcmd(0) = &H88 And btycmd(1) = &H88 Then '设置初始化
cmdTest = 8
Else
cmdTest = 0 '命令码错误
End If
End Function

如何是数据接受完后才处理?请高手指导下 --------------------编程问答-------------------- 通讯协议中加上结束码,可以简单地解决这个问题 --------------------编程问答--------------------
引用 2 楼 cpcfchina 的回复:
通讯协议中加上结束码,可以简单地解决这个问题

如上楼所说。多线程也是一样的。 --------------------编程问答-------------------- LZ最好在线程里使用static变量接收并合并数据(如果是多个套接字而不是多线程,则可以全局或模块级动态数组)。
补充:VB ,  基础类
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,