首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

vb6.0串口接收数据的程序,老是提示下表出界,谁来指导一下

2012-05-02 
vb6.0串口接收数据的程序,老是提示下表出界,哪位高手来指导一下!编了一个串口接收数据的程序,与下位机对发

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 之类的情况。

至于你的问题,自己分析一下原来的逻辑,找到问题的话,你就进步了。

一个棋手不能下盲棋,就永远不是高手。一个程序员不能分析逻辑,就永远是误打误撞的菜鸟。
 
[解决办法]
你设置的范围是有问题

热点排行