100分请教.用vb后遇到的最匪夷所思的问题,请各位高手帮忙!

zhangwh6882 2002-12-06 04:06:08

这段程序是在MSComm_OnComm事件中校验重串口接收的数据的代码,接到的数据前41位(0——40)为信息,第42位order(41)为校验和,即前41位的加和转换为16进制后取后两位。现在是每次接收到信息,如果在1、2、3行中任意一处设断点的话,程序执行正常。否则的话校验和计算错误。而且接收到的数据相同的情况下,每次得到的结果都不同。
为什么同一段代码,设断点和不设断点得到的结果不同呢?
'检查效验和
1 sum = 0
For I = 0 To (40)
sum = sum + order(I)
Next I
2 I = 0
3 sum = Hex(sum And 255)
If Not Hex(order(41)) = sum Then

MessageBox 0&, "校验和错,退出", "IDMS", &H0&

exit sub

End If

下面是接收到的数据的例子
E7 A0 43 EE AA 11 10 00 20 00 01 00 01 01 12 22 01 12 34 56 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 77

...全文
15 点赞 收藏 8
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
other870 2002-12-07
你的这段代码是放在MSComm_OnComm的哪一个事件中?你的42位数据中间间隔多久发另一串的?另外你的这种情况象是数据没有接收完全或是接收出错了,你试试用TIMER定时器来接收数据。
回复
darkmoon 2002-12-06
以前碰到过因为触发不同事件或是时间延迟导致设断点和不设断点结果不一致
建议用Debug.Print 来查看数据,不要设断点
回复
zhangwh6882 2002-12-06
但是order数组的内容是什么,变量的类型是什么,详细点
inbyte()字节数组,将输入缓存区的内容读入到数组
order()字节数组,存储inbyte(_)读出的数据直到命令完整读出.
sum 是Variant型
我觉得原因不应该是数据类型的问题呀,因为单步执行的话一点问题都没有,不知道有没有朋友遇到过类似的情况
回复
zhangwh6882 2002-12-06
of123()
命令不一定会一直是42个字节,其他类型的命令长度不定呀
MSComm.CommPort = 1
MSComm.RThreshold = 1
MSComm.InputLen = 0
MSComm.PortOpen = True
MSComm.InBufferCount = 0
这是我打开串口的代码
回复
zhangwh6882 2002-12-06
'一条命令42字节,分几次读入,命令的开头&He7,第二位&Ha0或者&ha1.

Private Sub MSComm_OnComm()
Dim max As Variant
Dim foo As Variant
Dim serial As Variant '当前包号
Dim sum As Variant
'On Error GoTo Mscomm2Error


InByte = MSComm2.Input
'屏蔽空信号
If UBound(InByte) = -1 Then
Exit Sub
End If

If readstart = True Then '判断是否命令的开头
If Not InByte(0) = &HE7 Then '检验起使位是否为E7
'放弃
MessageBox 0&, "前导码错,退出", "IDMS", &H0&
Call Cancel1

Exit Sub

End If
If Not (InByte(1) = &HA0 Or InByte(1) = &HA1) Then '检验数据流向位是否为A0或A1
'放弃
MessageBox 0&, "数据流向错,退出", "IDMS", &H0&
Call Cancel1

Exit Sub
End If

max = UBound(InByte)
ReDim order(0 To max)
order = InByte
readstart = False
Else
'合并数组order()与inbyte()
foo = UBound(order)
max = foo + UBound(InByte) + 1
ReDim Preserve order(max)
For I = LBound(InByte) To UBound(InByte)

order(foo + 1 + I) = InByte(I)
Next I

If UBound(order) >= 41 Then '命令完整读入


'检查效验和
sum = 0
For I = 0 To (40)
sum = sum + order(I)
Next I
I = 0
sum = Hex(sum And 255)
If Not Hex(order(41)) = sum Then
'需要扩充放弃
MessageBox 0&, "校验和错,退出", "IDMS", &H0&

Call Cancel1

End If

readstart = True
serial = order(11) * 16 * 16 + order(12)
If Not serial = Num + 1 Then
'放弃
MessageBox 0&, "包号不连续,退出", "IDMS", &H0&

Call Cancel1

End If
Num = serial

'调用命令处理过程

Call Perform(order)
End If
回复
of123 2002-12-06
MSComm1.RThreshold = 42
使数据全部到达后再开始校验。
回复
blue风儿 2002-12-06
看到源代码了,但是order数组的内容是什么,变量的类型是什么,详细点
回复
blue风儿 2002-12-06
给出源代码
回复
相关推荐
发帖
VB基础类
创建于2007-09-28

7485

社区成员

VB 基础类
申请成为版主
帖子事件
创建了帖子
2002-12-06 04:06
社区公告
暂无公告