还是原来程序,单片机不断发送16进制数据,并转化为10进制,实时画图,1ms一次,串口接收。我用串口调试助手模拟发送数据时,常时间运行没有问题。我接上硬件后,在我的机子上前16秒可以接收数据,但是16秒的时候报错,提示subscript out of range,在另一台机子上很快就报错subscript out of range。怎么回事啊。报错的地方在        buffer(n - 1) = bytinput(n - 1)。去掉这一句就报后面的y(n - 1) = buffer(n - 1)错,反正是这个地方有问题。
请达人帮忙。我把程序贴出来一部分。
Public bytReceiveByte() As Byte     '接收到的总字节
Public intReceiveLen As Integer     '接收到的总字节数
Public buffer() As Byte             '一次接收到的字节
Public intInputLen As Integer        '一次接收到的字节数'**********************************
'画图模块
'**********************************
 
Public strdata As String           '十进制编码
Public t As Long                   '时间横轴,毫秒
Public y() As Integer              '计数值大小,纵轴'接受数据,动态画图
Private Sub MSComm1_OnComm()
 Dim n As Integer
 Dim bytinput() As Byte
Select Case MSComm1.CommEvent
Case comEvReceive
MSComm1.InputMode = comInputModeBinary
 intInputLen = MSComm1.InBufferCount ReDim bytinput(intInputLen)
 bytinput = MSComm1.Input
 Call InputManage(bytinput, intInputLen)
 Call convers
 Call DisplayText
If t > 10000 Or t < 0 Then
t = 0
Picture1.Cls
End If
y11 = y(0)
For n = 1 To intInputLen
y1 = y(n - 1)
Picture1.Line (t, y11)-(t + 1, y1), vbRed
y11 = y1
t = t + 1
Next n
RichTextBox1.Text = strdata
 End Select
End Sub'**********************************
'输入处理
'处理接收到的字节流,并保存在全局变量
'bytReceiveRyte()
'**********************************
Public Sub InputManage(bytinput() As Byte, intInputLenth As Integer)
'定义变量及初始化
    Dim n As Integer
    ReDim Preserve bytReceiveByte(intReceiveLen + intInputLenth)
    ReDim Preserve buffer(intInputLen)
    For n = 1 To intInputLenth Step 1
        'bytReceiveByte(intReceiveLen + n - 1) = bytinput(n - 1)
        buffer(n - 1) = bytinput(n - 1)
    Next n
    
    intReceiveLen = intReceiveLen + intInputLenth
End Sub'**********************************
'为输出准备文本
'保存在全局变量
'将输出转换成十进制数
'**********************************
Public Sub convers()
    Dim n As Integer
     ReDim Preserve y(intInputLen)
    For n = 1 To intInputLen
    y(n - 1) = buffer(n - 1)
        Next n
    
End Sub
Public Sub DisplayText()
Dim n As Integer
For n = 1 To intInputLen
strdata = strdata & Str(y(n - 1))
Next n
End Sub

解决方案 »

  1.   

    1.试试取 MSComm1.Input 之前设置 MSComm1.InputLen = intInputLen 
    2.检查一下 intInputLen 的值,会不会出现 <=0 的情况
      

  2.   

    你在MSComm1_OnComm事件中先把画图的功能的代码屏蔽掉,看一下会不会出错.
      

  3.   

    我之前遇到这个问题是延时问题,串口数据还没有发上来,但是程序去收数据就会有这个问题,这样试试看Sleep 100‘API延时函数,延时100个豪秒
    bytinput = MSComm1.Input
      

  4.   

    ......
    dim tmp 
    'intInputLen = MSComm1.InBufferCount'ReDim bytinput(intInputLen)tmp = MSComm1.Input
    bytinput = tmp
    intInputLen = Ubound(bytinput)
    ......
      

  5.   

    liuberlin(软件边缘) ( ) 信誉:100 :楼主是在接收事件中接收的,数据肯定抵达。况且,它每 1 ms 发送一次数据,延迟 100 ms ......?楼主:
    要考虑你的画图过程能否在 1 ms 内完成。否则,目前的还没有结束,下一次事件又触发了。
      

  6.   

    实时画图,1MS一次,且不说机器处理是否来得及,就算程序能画得出来,你的显示器能有1000HZ的刷新率吗?没有必要啊。
      

  7.   

    难道没有1000HZ的刷新率就不能这样画?那人家更高速的画图是怎么实现的?
    我先屏蔽了画图程序,还是报同样的错。
    后来按 of123() 的那样改了之后就可以了,不过程序还是不很好,容易死掉
      

  8.   

    我估计是画图程序太慢的缘故,有没有谁能告诉我用API函数怎么实现那段画图的功能?
    最好是代码,谢了