回复 17楼 lianyicq
非常感谢您能抽空写代码帮我解决问题,可惜本人太小白了,依然没有领悟出解决方法。
现在针对我的问题,我有以下方案,
我只有对仪器发出两组命令的时候才会出现数据量大于8192字节的情况
所以我在发出命令后设置一个状态符dataflag=true
接收端处理时,当状态符为dataflag=true时以byte型接收,否则以string型接收
但是在出现byte型数据时,我的代码仍然不能按预期接收数据,
经实测,数据长度每次会递增12字节,但是全部为0.请帮忙看看此处如何修改才能完整的接收数据。
为便于分析问题,再次添加数据格式以及仪器输出数据时使用Wireshark抓取的数据包
接收代码如下
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim S, S3, s1, flag, flag1 As String
Dim id, strlen As Integer
Dim tmp As String
Dim str(), tmp() As Byte
Dim lngDataSize As Long
lngDataSize = 0
'初始化接收到的数据量
ReDim str(bytesTotal - 1)
'初始化接收缓冲区
'=======================================
'数据接收过程
'=======================================
If dataflag Then
'判断接收类型,为真时,接收类型为Byte
'循环接收数据,直到接收数据长度等于应收数据长度
Do
Winsock1.getData str, vbByte + vbArray
id = str(9) '取ID ,测试ok
strlen = HEX_to_DEC(Hex(str(4)) & Hex(str(5)) & Hex(str(6)) & Hex(str(7))) '取数据长度,完整数据长度为此长度+8
ReDim tmp(lngDataSize + bytesTotal - 1) As Byte
copymemory tmp(), str(0), bytesTotal
lngDataSize = lngDataSize + bytesTotal
loop until lngDataSize=stren+8
'数据接收完成后的预处理
strdata = StrConv(str(), vbUnicode)
'转换为字符串,
flag = Left(strdata, 2)
'取数据类型标志
Else
Winsock1.getData strdata
'接收类型为string
flag = Left(strdata, 2)
End If
'===================================
'
接收数据处理过程
'===================================
Select Case flag
'数据处理类型标志
Case "E1"
'登录
Case "E0"
Case "EA"
'温度值返回
Case "EB"
'二进制数据返回,
[
本帖最后由 hcyang1422 于 2015-4-30 16:27 编辑 ]