wangxz5200 2015-06-15 09:28 采纳率: 100%
浏览 2185
已采纳

老是提示下界超标pr======

Private Sub MSComm1_OnComm()
Static cnt As Integer
Dim receive_cnt As Integer
Dim i As Integer
Dim Pr As Byte

Dim Buffer As Variant
Dim Arr() As Byte
Dim s As String

Select Case MSComm1.CommEvent
Case comEvReceive

receive_cnt = MSComm1.InBufferCount '接收缓冲区的字节数

' 往暂存区存二进位资料
Buffer = MSComm1.Input
' 指定给位元组阵列以便处理
Arr = Buffer

s = ""
For i = 0 To receive_cnt - 1

If Arr(i) > 15 Then
s = s + Hex(Arr(i)) + " "

Else
s = s + "0" + Hex(Arr(i)) + " "

End If

cnt = cnt + 1

Next i

Text1.Text = Text1.Text & s

Erase Arr

If cnt >= 300 Then
Text1.Text = ""
cnt = 0
Exit Sub
End If

Pr = Arr(11) + Arr(12) + Arr(13) + Arr(14) + Arr(15) + Arr(16) + Arr(17)

If Pr <> Arr(18) Then '校验正确
If Arr(17) = &H0 Then
Shape2.FillColor = RGB(0, 255, 0)
Shape3.FillColor = RGB(0, 255, 0)
Shape4.FillColor = RGB(0, 255, 0)
Shape5.FillColor = RGB(0, 255, 0)
Shape6.FillColor = RGB(0, 255, 0) '测试OK
Else
If Arr(17) And &H1 = &H1 Then '电压校准
Shape2.FillColor = RGB(0, 255, 0)
Else
Shape2.FillColor = RGB(255, 0, 0)
End If

 If Arr(17) And &H2 = &H2 Then    '电压测试
      Shape3.FillColor = RGB(0, 255, 0)
  Else
      Shape3.FillColor = RGB(255, 0, 0)
  End If

  If Arr(17) And &H4 = &H4 Then   '写内部EEPROM
      Shape4.FillColor = RGB(0, 255, 0)
     Else
      Shape4.FillColor = RGB(255, 0, 0)
   End If

   If Arr(17) And &H8 = &H8 Then   ' 脉冲检测
      Shape5.FillColor = RGB(0, 255, 0)
     Else
      Shape5.FillColor = RGB(255, 0, 0)
   End If

   If Arr(17) And &H10 = &H10 Then   ' 电机开关
      Shape6.FillColor = RGB(0, 255, 0)
     Else
      Shape6.FillColor = RGB(255, 0, 0)
  End If
End If

Else
MsgBox "校验失败,请重新测试"

End If

Case comEvSend
End Select
End Sub

  • 写回答

4条回答 默认 最新

  • 知常曰明 2015-06-15 12:29
    关注

    你的问题是刚寄出通讯的时候经常犯的错。
    你认为你的协议是每次传18个字节,因此通讯过来的数据肯定是18字节,这个是不对的。
    通讯的过程很复杂,期间可能有位的缺失、甚至字节的缺失。因此一个通讯过来的数据未必如你所想是18个字节。
    假设它小于18字节,那么你上面的代码肯定会出现下标越界。
    解决方法两个:
    第一种,如果过来的数据不是18字节,直接抛弃(或者记录日志后抛弃)
    第二种,把每次接受到的数据凭借起来,每18个字节进行一次分析。
    具体采取哪种方式,要看你的协议。建议对于能自己纠正错误的协议,使用第二种;固定长度的协议,采用第一种

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 想问一下stata17中这段代码哪里有问题呀
  • ¥15 flink cdc无法实时同步mysql数据
  • ¥100 有人会搭建GPT-J-6B框架吗?有偿
  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决