vb6.0串口接收数据的程序,老是提示下表出界,哪位高手来指导一下!
编了一个串口接收数据的程序,与下位机对发几下数据就会出现“下表出界”的提醒,但我明明对下标进行了处理(绿色部分)啊,好郁闷,谁能告诉我哪里出了问题!
Option Explicit '要求变量声明
' 定义全局变量
'--------------------------------------
'接收区变量
Dim ReceiveCount As Integer '定义已接收字符对应字节数
Dim BytReceived(16) As Byte '定义接收数组
Dim DataIndex As Integer '计数用
'--------------------------------------
这上面是有关的几个全局变量
' 通信事件处理
'--------------------------------------
Private Sub MsComm1_OnComm() '接收数据
On Error GoTo MsComm_OnCommErr
Dim TempData() As Byte
Dim TempCount As Integer
Dim I As Integer '定义临时变量
If ReceiveCount >= 65535 Then
TxtReceive.Text = ""
End If
Select Case MSComm1.CommEvent
Case comEvReceive '发生接收事件时,接收数据,并处理
TempCount = 0 '初始化
TempCount = MSComm1.InBufferCount '读出输入缓冲区中的字节数
ReDim TempData(TempCount)
TempData = MSComm1.Input '读出输入缓冲区内容
ReceiveCount = ReceiveCount + TempCount '计算并更新接收到的字节数
TxtReceiveCount.Text = CStr(ReceiveCount)
'16进制显示接收的数据
For I = 0 To TempCount - 1
BytReceived(DataIndex) = TempData(I)
DataIndex = DataIndex + 1
If DataIndex >= 9 Then
If BytReceived(1) = &H4 Then
DataIndex = 0
DataProcess_Flag = True
End If
ElseIf DataIndex >= 15 Then
DataIndex = 0
DataProcess_Flag = True
End If
Debug.Print "X:"; TempCount; DataIndex
'调用数据处理程序
If DataProcess_Flag = True Then
DataProcess_Flag = False '清除数据处理标志位
'调用数据处理函数处理数据
Call ZigbeeData_Process(BytReceived())
End If
'在输出区输出接收到的字符
If Len(Hex$(TempData(I))) > 1 Then
'如果数据大于16直接显示
TxtReceive.Text = TxtReceive.Text & Hex$(TempData(I)) & " "
Else
'如果数据小于16,前面加0显示
TxtReceive.Text = TxtReceive.Text & "0" & Hex$(TempData(I)) & " "
End If
Next I
Case Else
End Select
Exit Sub '退出程序
MsComm_OnCommErr:
If Err.Number <> 0 Then '错误处理程序
MsgBox CStr(Err.Number) + Err.Description, vbOKOnly + vbInformation, "1提示信息!" '为用户提示出错信息
End If
Err.Clear
End Sub
[解决办法]
用这个试一试,依据它改写你的代码
[解决办法]
BytReceived才定义16,也就是才17个字节
[解决办法]
两种可能,一是接收到的字节数大于 17;二是通讯是实时进行的,复制串口缓存时,接收到的数据长度已经大于刚刚取得的 InBufferCount。实际上,复制出来的数据长度可以从数组长度直接取得,而且不需要事先 Redim,通过一个 Variant 型变量转一下就可以。
还有,注意你的 DataIndex 是否会越界。
Dim TempData() As Byte, varTemp As Variant
Dim TempCount As Integer
Dim I As Integer '定义临时变量
If ReceiveCount >= 65535 Then
TxtReceive.Text = ""
End If
Select Case MSComm1.CommEvent
Case comEvReceive '发生接收事件时,接收数据,并处理
varTemp = MSComm1.Input '读出输入缓冲区内容
TempData = varTemp
TempCount = Ubound(TempData) + 1
If TempCount > 17 Then TempCount = 17
TxtReceiveCount.Text = CStr(TempCount)
'16进制显示接收的数据
For I = 0 To TempCount - 1
BytReceived(DataIndex) = TempData(I)
......
[解决办法]
既然最小的接收长度是 10,就应将 OnComm 事件的触发门槛设置为 10,而不要搞成 1, 1, 8 之类的情况。
至于你的问题,自己分析一下原来的逻辑,找到问题的话,你就进步了。
一个棋手不能下盲棋,就永远不是高手。一个程序员不能分析逻辑,就永远是误打误撞的菜鸟。
[解决办法]
你设置的范围是有问题