还是原来程序,单片机不断发送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
请达人帮忙。我把程序贴出来一部分。
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
2.检查一下 intInputLen 的值,会不会出现 <=0 的情况
bytinput = MSComm1.Input
dim tmp
'intInputLen = MSComm1.InBufferCount'ReDim bytinput(intInputLen)tmp = MSComm1.Input
bytinput = tmp
intInputLen = Ubound(bytinput)
......
要考虑你的画图过程能否在 1 ms 内完成。否则,目前的还没有结束,下一次事件又触发了。
我先屏蔽了画图程序,还是报同样的错。
后来按 of123() 的那样改了之后就可以了,不过程序还是不很好,容易死掉
最好是代码,谢了