| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6751 人关注过本帖
标题:VB winsock接收数据处理的问题
只看楼主 加入收藏
lianyicq
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:26
帖 子:737
专家分:3488
注 册:2013-1-26
收藏
得分:0 
把id定义为全局变量,不要定义在Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
之内

大开眼界
2015-05-06 10:50
hcyang1422
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2015-4-23
收藏
得分:0 
回复 31楼 lianyicq
把id定义为全局变量后依然不行。是否应该把这部分的判断处理放在if语句外面,即先接收数据,当数据全部接收完成后,再进行处理。
2015-05-06 11:20
lianyicq
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:26
帖 子:737
专家分:3488
注 册:2013-1-26
收藏
得分:0 
...
CopyMemory FileByte(0), str(0), UBound(str) - 3
Put #1, , FileByte
ReceiveState = False
Select Case id
Case Is = 19
...
如果能执行红色这条,那就在下一条设个断点。看看id究竟是多少。最早粘的图片中ID列表不会是16进制数吧

大开眼界
2015-05-06 11:34
hcyang1422
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2015-4-23
收藏
得分:0 
回复 33楼 lianyicq
现在我把代码又修正了一下,红色字体的代码也可以执行了,而且id值也是正确的,即id=19
但是后面的处理程序没有正常工作,即下面红色字体处,该怎样才能把刚收到的全部数据转换成字符串进行处理?
现在的代码输出的tmp值为空。
Select Case id
           Case Is = 19                                                   '当id为19时,表示接收的为设定信息
             '显示信息
             tmp = Mid(StrConv(1, vbUnicode), 6000, 10000)                '将全部查询数据转换为字符串,并截取中间部分
             text7.text = tmp

               S3 = Split(tmp, "ST", , vbBinaryCompare)                   '字符串分解,区分大小写
                'Text4.Text = Trim(s3)
                For i = 1 To UBound(S3)
                    s1 = Split(Split(S3(i), vbCrLf)(0), ",")(1)           '取通道标记
                    s1 = Trim(s1)
                    Text2 = Text2 + s1 + vbCrLf
                    Form4.CHNAME(j - 1) = Trim(s1)                        
                Next i
         End Select

[ 本帖最后由 hcyang1422 于 2015-5-6 14:56 编辑 ]
2015-05-06 14:32
lianyicq
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:26
帖 子:737
专家分:3488
注 册:2013-1-26
收藏
得分:0 
2:倒数第二包是以EN&VBCRLF结尾
3:最终的尾包只有2byte,即数据校验和

以上两条可能有误导致以下条件语句不满足
    If str(UBound(str)) = &HD And str(UBound(str) - 1) = &HA And str(UBound(str) - 3) = Asc("E") And str(UBound(str) - 2) = Asc("N") Then
改为
    If str(UBound(str-5)) = &H45 And str(UBound(str) - 4) = &H4E And str(UBound(str) - 3) = &HD And str(UBound(str) - 2) = &HA Then
......
收到的鲜花
  • hcyang14222015-05-06 16:46 送鲜花  3朵   附言:我很赞同

大开眼界
2015-05-06 15:11
hcyang1422
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2015-4-23
收藏
得分:0 
回复 35楼 lianyicq
这个问题我已修正了,现在的问题是后面的处理程序没有正常工作,即下面红色字体处,该怎样才能把刚收到的全部数据转换成字符串进行处理?
现在的代码输出的tmp值为空。
Select Case id
           Case Is = 19                                                   '当id为19时,表示接收的为设定信息
             '显示信息
             tmp = Mid(StrConv(1, vbUnicode), 6000, 10000)                '将全部查询数据转换为字符串,并截取中间部分
             text7.text = tmp

               S3 = Split(tmp, "ST", , vbBinaryCompare)                   '字符串分解,区分大小写
                'Text4.Text = Trim(s3)
                For i = 1 To UBound(S3)
                    s1 = Split(Split(S3(i), vbCrLf)(0), ",")(1)           '取通道标记
                    s1 = Trim(s1)
                    Text2 = Text2 + s1 + vbCrLf
                    Form4.CHNAME(j - 1) = Trim(s1)                        
                Next i
         End Select
2015-05-06 15:16
lianyicq
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:26
帖 子:737
专家分:3488
注 册:2013-1-26
收藏
得分:0 
以前就说过tmp = Mid(StrConv(1, vbUnicode), 6000, 10000) 中"1"是什么意思
可以把字节数组转为字符串,比如字节数组a,字符串tmp
tmp=strconv(a,vbunicode)

大开眼界
2015-05-06 15:36
hcyang1422
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2015-4-23
收藏
得分:0 
回复 37楼 lianyicq
现在的程序是把temp.bat做为动态数组保存接收数据的吧!并没有哪一个临时数组里面是包含全部数据的。现在我要调用已接收的全部数据,应怎么把temp.bat中的数据调入一个临时数组里面?

可以在接收完数据后,关闭temp.bat,然后再打开,用Get #2, , tmp语句进行全部数据调用吗?
2015-05-06 15:47
lianyicq
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:26
帖 子:737
专家分:3488
注 册:2013-1-26
收藏
得分:0 
程序代码:
ReDim str(Loc(1))
Loc(1) = 0
Get #1, , str
Text1.Text = StrConv(str, vbUnicode)
Close #1
显示信息的时候,temp.dat并没有关闭。可以
...
loc(1)=0改为
seek #1,1
...
迷糊了
其实只需要
ReDim str(Loc(1))
Get #1,1 , str
Text1.Text = StrConv(str, vbUnicode)
Close #1


[ 本帖最后由 lianyicq 于 2015-5-6 16:14 编辑 ]

大开眼界
2015-05-06 15:59
hcyang1422
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2015-4-23
收藏
得分:0 
回复 39楼 lianyicq
非常感谢你一直以来的帮助,刚才这一问题我用先关闭再打开的方法也搞定了,你的这种方法等下我再去测试一下。
另外,再向你请教一个比较小白的问题
我在这个处理过程中,得出的结果是传送给另外一个窗口的LABEL的Caption,我第一次点击显示子窗口时,可以看到得到的值,但是关掉后再打开,这个属性值又返回为默认值了。
请问如何才可以在得到数据后,将值锁定给子窗口的LABEL。
2015-05-06 16:10
快速回复:VB winsock接收数据处理的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.033446 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved