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

...全文
49 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
  • 打赏
  • 举报
回复
给出源代码
资源下载链接为: https://pan.quark.cn/s/1bfadf00ae14 松下电工数字压力传感器用户手册详细介绍了DP-100系列数字压力传感器,涵盖其技术参数、操作方法及适用场景等,适用于各类需要精准压力测量的工业环境。 双屏显示:主屏与输出动作同步,可同时显示当前值和基准值,便于实时监控与调整。显示屏为12段字母数字显示,数字清晰易读。 三色指示:屏幕颜色随传感器状态变化(红、绿、橙),便于快速判断工作状态。 紧凑结构:尺寸仅□30mm,适合空间狭窄的安装环境。 多种操作模式:提供RUN模式(日常操作)、菜单设定模式(深入设置如输出模式切换)及PRO模式(高级功能如应差调整、复制设定)。 安全认证:DP-101(A)/102(A)型号通过特定认证,确保产品安全可靠。 复制功能:可通过数据通信将主传感器设定内容复制到其他传感器,减少人工设定错误,节省时间。 高性能传感:具备高精度,辨率1/2,000,反应时间2.5ms(最长5,000ms可调),温度特性±0.5%F.S.,重复精度±0.1%F.S. 电子元件吸附检测:监测吸盘是否成功吸附电子元件。 总压力监测:测量管道或容器内的压力水平。 空气泄漏检测:通过压力变化检测泄漏情况。 DP-101□:适用于低压环境(-100kPa至100kPa)。 DP-102□:适用于高压环境(0kPa至1MPa)。 订购时需根据实际需求选择合适型号,考虑传感器的适用范围和工作条件。手册提供详细订购流程及注意事项,包括相关认证信息(如韩国S标志)。 复制功能:通过数据通信将主传感器设定复制到其他传感器,支持多种设定模式,避免设定错误,节省时间。 操作模式:RUN模式用于日常监控,菜单设定模式用于深入设置,PRO模式提供高级功能。 使用前需仔细阅读手册,了解各功能使用方法。遵循安全指南,正确安装和使用传感器,避免损坏。对于

7,785

社区成员

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

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