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

...全文
50 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
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
  • 打赏
  • 举报
回复
给出源代码
内容概要:本文档是2025年全国广播电视技术能手竞赛IPTV专业的竞赛内容大纲,旨在指导参赛选手准备比赛。竞赛为理论和实操两大部。理论部涵盖基本知识、基础理论和专业知识,包括法律法规、技术标准、IPTV技术基础、信号传输与发、网络和数据安全等。实操部则涉及IPTV系统设备、仪器设备的操作使用和指标测量。具体内容包括IPTV系统架构、传输技术与指标、设备配置及维护、专业技能如测量工具使用、视音频指标测量、直播点播协议析、播出网络性能测量、网络安全数据析以及系统故障排查等。 适合人群:从事或有意从事IPTV相关工作的技术人员,尤其是有志于参加全国广播电视技术能手竞赛的专业人士。 使用场景及目标:①帮助参赛选手全面了解并掌握IPTV相关的法规文件和技术标准;②提升选手对IPTV系统架构、传输技术和设备配置的理解;③增强选手在实际操作中的测量、析和故障排查能力;④确保选手能够熟练运用各种测量工具和析软件进行视音频指标测量和网络安全数据析。 阅读建议:由于文档内容详尽且专业性强,建议读者在学习过程中结合实际案例和操作练习,同时参考相关技术文献,以便更好地理解和掌握竞赛所需的知识和技能。

7,785

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧