本人小白,请高手指点,我的接收数据代码如下:
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() As Byte
Winsock1.getData str()
strdata = StrConv(str(), vbUnicode) '转换为字符串,
flag = Left(strdata, 2)
'log.Text = log.Text & Format(Hour(Time), "00") & ":" & Format(Minute(Time), "00") & ":" & Format(Second(Time), "00") & " " & strdata '显示日志
'log.SelStart = Len(log.Text)
Select Case flag
Case "E1" '登录
Sleep 200
Login '登录
log.Text = log.Text & Format(Hour(Time), "00") & ":" & Format(Minute(Time), "00") & ":" & Format(Second(Time), "00") & " " & "admin" & vbCrLf '显示日志
Case "E0" '仪器执行命令成功
u = u + 1
log.Text = log.Text & Format(Hour(Time), "00") & ":" & Format(Minute(Time), "00") & ":" & Format(Second(Time), "00") & " " & strdata '显示日志
log.SelStart = Len(log.Text)
If u = 1 Then
' Sleep 500
log.Text = log.Text & Format(Hour(Time), "00") & ":" & Format(Minute(Time), "00") & ":" & Format(Second(Time), "00") & " " & "登录成功" & vbCrLf '显示日志
state_lab = "TCP/IP Connect OK" '登录成功
log.SelStart = Len(log.Text)
End If
Case "EA" '温度值返回
S = strdata
log.Text = log.Text '不显示日志
log.SelStart = Len(log.Text)
S3 = Split(S, "^C", , vbTextCompare)
For j = 1 To UBound(S3)
s1 = Split(S3(j), vbCrLf)(0)
s1 = Trim(s1)
If Format(s1) > Val(Form4.CH(j - 1)) Then
Form4.CH(j - 1) = Format(s1, "00.0")
End If
Next j
Case "EB" '二进制数据返回,可以是设定信息,也可以是画面数据
tmp = StrConv(str(), vbUnicode)
id = str(9) '取ID ,测试ok
strlen = HEX_to_DEC(Hex(str(4)) & Hex(str(5)) & Hex(str(6)) & Hex(str(7))) '取数据长度,测试OK
在此位置该如何处理才能先接收全部的数据??
数据格式和使用Wireshark抓包的数据截图如下图
If id = 19 Then '如果ID为19,则为设定信息输出
此处为对接收的数据进行处理,同上面温度值取出
End If
End Select
下图为仪器返回数据的格式。
4 个解决方案
#1
既然是以字节流接收,就应先判断接收的12byte包头来设置动态数组的接收长度,待接收到完整数据包后,判断和处理数据。
#2
不好意思,问题我讲的不够清楚,我的程序是要控制一台仪器,仪器返回数据有以下几种情况:
1:当发送控制指令时,执行成功时仅近回“E0+CRLF“,错误时会返回“E1+错误代码+内容提示“
2:当发送输出命令时,返回数据分两种情况,一种是文本输出,格式为"EA +CRLF+文本内容+EN CRLF",另一种就是BINARY输出,格式为“12byte(EB+CRLF+数据长度+FLAG+ID+校验)+数据+EN+校验”具体格式参考1楼图片,
我现在遇到的问题为以下几点;
1:接收长度超过8192的情况下如何多次接收并合并数据。
2:我现在的接收过程是否适合这种多种响应格式的处理?不合适该如何改?
3:BINARY格式的数据怎么样从中去头去尾,只保留有效数据。
本人小白,请大哥帮帮忙!
1:当发送控制指令时,执行成功时仅近回“E0+CRLF“,错误时会返回“E1+错误代码+内容提示“
2:当发送输出命令时,返回数据分两种情况,一种是文本输出,格式为"EA +CRLF+文本内容+EN CRLF",另一种就是BINARY输出,格式为“12byte(EB+CRLF+数据长度+FLAG+ID+校验)+数据+EN+校验”具体格式参考1楼图片,
我现在遇到的问题为以下几点;
1:接收长度超过8192的情况下如何多次接收并合并数据。
2:我现在的接收过程是否适合这种多种响应格式的处理?不合适该如何改?
3:BINARY格式的数据怎么样从中去头去尾,只保留有效数据。
本人小白,请大哥帮帮忙!
#3
1)接收长度超过8192,请在本坛搜索解决方法。
2)凡二进制与字符截收并存的,先以字节流接收,经判断后交由各自数据处理过程处理。
3)二进制数据,按数据规约,取出后用API来处理,可参考:
http://blog.csdn.net/zdingyun/article/details/4565659
http://blog.csdn.net/zdingyun/article/details/2528026
#4
不知道有多少前人掉在TCP Socket
send(人多)send(病少)send(财富)
recv(人多病)recv(少财富)
陷阱里面啊!
http://bbs.csdn.net/topics/380167545
send(人多)send(病少)send(财富)
recv(人多病)recv(少财富)
陷阱里面啊!
http://bbs.csdn.net/topics/380167545
#1
既然是以字节流接收,就应先判断接收的12byte包头来设置动态数组的接收长度,待接收到完整数据包后,判断和处理数据。
#2
不好意思,问题我讲的不够清楚,我的程序是要控制一台仪器,仪器返回数据有以下几种情况:
1:当发送控制指令时,执行成功时仅近回“E0+CRLF“,错误时会返回“E1+错误代码+内容提示“
2:当发送输出命令时,返回数据分两种情况,一种是文本输出,格式为"EA +CRLF+文本内容+EN CRLF",另一种就是BINARY输出,格式为“12byte(EB+CRLF+数据长度+FLAG+ID+校验)+数据+EN+校验”具体格式参考1楼图片,
我现在遇到的问题为以下几点;
1:接收长度超过8192的情况下如何多次接收并合并数据。
2:我现在的接收过程是否适合这种多种响应格式的处理?不合适该如何改?
3:BINARY格式的数据怎么样从中去头去尾,只保留有效数据。
本人小白,请大哥帮帮忙!
1:当发送控制指令时,执行成功时仅近回“E0+CRLF“,错误时会返回“E1+错误代码+内容提示“
2:当发送输出命令时,返回数据分两种情况,一种是文本输出,格式为"EA +CRLF+文本内容+EN CRLF",另一种就是BINARY输出,格式为“12byte(EB+CRLF+数据长度+FLAG+ID+校验)+数据+EN+校验”具体格式参考1楼图片,
我现在遇到的问题为以下几点;
1:接收长度超过8192的情况下如何多次接收并合并数据。
2:我现在的接收过程是否适合这种多种响应格式的处理?不合适该如何改?
3:BINARY格式的数据怎么样从中去头去尾,只保留有效数据。
本人小白,请大哥帮帮忙!
#3
1)接收长度超过8192,请在本坛搜索解决方法。
2)凡二进制与字符截收并存的,先以字节流接收,经判断后交由各自数据处理过程处理。
3)二进制数据,按数据规约,取出后用API来处理,可参考:
http://blog.csdn.net/zdingyun/article/details/4565659
http://blog.csdn.net/zdingyun/article/details/2528026
#4
不知道有多少前人掉在TCP Socket
send(人多)send(病少)send(财富)
recv(人多病)recv(少财富)
陷阱里面啊!
http://bbs.csdn.net/topics/380167545
send(人多)send(病少)send(财富)
recv(人多病)recv(少财富)
陷阱里面啊!
http://bbs.csdn.net/topics/380167545