嗯,贴代码。
Private Sub MSComm_OnComm()
Dim a&
Dim recbuf() As Byte
Dim inlen As Integer
Dim i As Integer
Dim x As Variant
'On Error GoTo error1
Select Case MSComm.CommEvent
    Case comEvReceive
    inlen = MSComm.InBufferCount
   Do Until inlen >= 6
   DoEvents
   inlen = MSComm.InBufferCount
   Loop
  ReDim recbuf(0 To inlen - 1)
   recbuf = MSComm.Input
    Case comFrame
    x = MsgBox("帧错误!", vbCritical, "接受数据错误!!")
    Exit Sub
    Case comEventOverrun
    x = MsgBox("数据丢失", vbCritical, "接受数据错误!!")
    Exit Sub
End Select
Select Case recbuf(1)
问题在于我一调用recbuf数组中的任意元素都会出现下标越界

解决方案 »

  1.   

    Private Sub MSComm_OnComm()
    Dim a&
    Dim buffer As String
    Dim recbuf(0 To 5) As Byte
    Dim inlen As Integer
    Dim i As Integer
    Dim x As Variant
    Dim c As Variant
    On Error GoTo error1
    Select Case MSComm.CommEvent
        Case comEvReceive
        inlen = MSComm.InBufferCount
       Do Until inlen >= 6
       DoEvents
       inlen = MSComm.InBufferCount
       Loop
       i = 0
       For Each c In MSComm.Input
       recbuf(i) = c
       i = i + 1
       Next c
        Case comFrame
        x = MsgBox("帧错误!", vbCritical, "接受数据错误!!")
        Exit Sub
        Case comEventOverrun
    新代码,问题已解决,谢谢一楼
      

  2.   

    不是的,那个事件是接收6个字节才会触发的,怎么你总是说接收不足6个字节?我一直不理解,
    rivate Sub Form_load()
    f1 = False  '先置开关的标记位为关
    f2 = False
    f3 = False
    f4 = False
    Dim i As Integer
    MSComm.Settings = "9600,n,8,1"   '串口的初始化设置,9600第一位代表波特率
    MSComm.InputMode = comInputModeBinary
    MSComm.RThreshold = 6
    MSComm.InputLen = 6
    MSComm.OutBufferCount = 0
    MSComm.InBufferCount = 0
    ,这是串口的初始化,设置了接收6个字节触发on_comm的事件,不同意你的说法
      

  3.   

    如果MSComm.RThreshold = 6,那么产生onComm时间,必然缓冲区有6个字符,或者更多。
    经过等待,缓冲区可以有超过6个字符的。  ReDim recbuf(0 To inlen - 1)
    这样定义就已经限制了接收去的数量了。如果mscomm缓冲区超过inlen会在慢机器上存在一种可能,执行到下面读取缓冲区的时候,缓冲区是超过6个字符的。
       recbuf = MSComm.Input后面的部分,本来可以一次读取缓冲区的,你偏偏要一个字节一个字节读,你也不累。
    你如果就想读6个字节,就设置mscomm.inputlen属性为6好了。