none
comunicacion serial (indice fuera de la matriz)

    Pregunta

  • Buen día, estoy haciendo una aplicación para muestreo de 5 señales mediante un pic18f14k50, y de la forma en que lo hago recibo los valores de manera correcta, solo que hay un par de detalles, en ciertos ciclos se desfasa el array y se muestra en otras casillas o labels y en otras ocaciones el programa se detiene y me dice el error " indice fuera de la matriz" en alguna de las subcadenas que divido con un split del array.

    Alguien podria darme algun tip o decirme como podria solucionar esta situacion. adjunto el codigo de mi aplicacion en Vba

    Public Class Form1

        Dim StrBufferEntrada As String
        Dim StrBufferSalida As String
        Dim contador As Integer = 0
        Dim dato As String
        Dim muestreo As String
        Dim presion As String
        Dim humedad As String
        Dim temperatura As String
        Dim lluvia As String
        Dim viento As String

        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            StrBufferEntrada = ""
            StrBufferSalida = ""
            BtnConectar.Enabled = False
            TxtDatosRecividos.Enabled = False
            Label7.Text = "Puerto sin Conexion"
        End Sub

        Private Sub BtnBuscarPuertos_Click(sender As Object, e As EventArgs) Handles BtnBuscarPuertos.Click
            CboPuertos.Items.Clear()
            For Each PuertoDisponible As String In My.Computer.Ports.SerialPortNames
                CboPuertos.Items.Add(PuertoDisponible)
            Next
            If CboPuertos.Items.Count > 0 Then
                CboPuertos.Text = CboPuertos.Items(0)
                MessageBox.Show("Selecciona el Puerto de Entrada")
                BtnConectar.Enabled = True
                Label7.Text = "Esperando Datos"
            Else
                MessageBox.Show("No se Encontro Ningun Puerto")
                BtnConectar.Enabled = False
                TxtDatosRecividos.Enabled = False
                CboPuertos.Items.Clear()
            End If
        End Sub

        Private Sub BtnConectar_Click(sender As Object, e As EventArgs) Handles BtnConectar.Click
            If BtnConectar.Text = "CONECTAR" Then
                Try
                    With SpPuerto
                        .BaudRate = 9600
                        .DataBits = 8
                        .Parity = IO.Ports.Parity.None
                        .StopBits = IO.Ports.StopBits.One
                        .PortName = CboPuertos.Text
                        .ReadBufferSize = 1024
                        .WriteBufferSize = 1024
                        .Open()
                    End With
                    BtnConectar.Text = "DESCONECTAR"
                    TxtDatosRecividos.Enabled = True
                    CboPuertos.Enabled = False
                    If SpPuerto.IsOpen = True Then
                        Timer1.Start()
                    End If
                Catch ex As Exception
                    MsgBox(ex.Message, MsgBoxStyle.Critical)
                    Timer1.Stop()
                End Try
            ElseIf BtnConectar.Text = "DESCONECTAR" Then
                BtnConectar.Text = "CONECTAR"
                CboPuertos.Enabled = True
                SpPuerto.Close()
                SpPuerto.Dispose()
                Label7.Text = "Sin Conexion"
                Label4.Text = ""
                Label5.Text = ""
                Label6.Text = ""
                Label10.Text = ""
                Label11.Text = ""
                Timer1.Stop()
            End If
        End Sub


        Private Sub SpPuerto_DataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles SpPuerto.DataReceived


        End Sub

        Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick

            Dim Cadena As String = SpPuerto.ReadExisting()

            Label7.Text = "Reciviendo Datos"

            Dim delimitador() As Char = {" "}
            'Dim ArrCadena As String
            Dim ArrCadena() As String = Split(Cadena, "_", 6)

            If Cadena <> "" Then

                Label7.Text = ArrCadena.Length

                presion = ArrCadena(0)
                Label4.Text = presion & " PSI"

                humedad = ArrCadena(1)
                Label5.Text = humedad & " %"

                temperatura = ArrCadena(2)
                Label6.Text = temperatura & " °C"

                lluvia = ArrCadena(3)
                Label10.Text = lluvia & " Esta Lloviendo"

                viento = ArrCadena(4)
                Label11.Text = viento & " Km/h"

                Dim data As String = "Presion: " + ArrCadena(0) + " Humedad: " + ArrCadena(1) + " Temperatura: " + ArrCadena(2)
                TxtDatosRecividos.Text = data + Environment.NewLine

            Else

                Label7.Text = "No Hay Datos"

                presion = 0
                Label4.Text = presion & " PSI"

                humedad = 0
                Label5.Text = humedad & "   %"

                temperatura = 0
                Label6.Text = temperatura & "   °C"

                lluvia = 0
                Label10.Text = lluvia & " No Esta Lloviendo"

                viento = 0
                Label11.Text = viento & " Km/h"

            End If

        End Sub

    End Class


    • Editado DioSosa3 miércoles, 16 de noviembre de 2016 22:36
    miércoles, 16 de noviembre de 2016 22:34

Respuestas

  • Hola DioSosa3,

    Puede deberse a que en algunas consultas el arreglo no llega a contener 5 posiciones y te retorne menos, pero mediante el código quieres obtener su posición 4 (item 5) por lo que producirá un IndexOutOfRangeException.

    Algo como :

    Posición | Valor

    0 - Valor1 1 - Valor2 2 - Valor3 3 - Valor4

    Si se ejecuta "viento = ArrCadena(4)" según el ejemplo : No existe esa posición por lo que te mostrará el error. Podrías agregar una validación y si te muestra lo del MessageBox(..) es porque no hay elementos suficientes.

     If ArrCadena.Length >= 5 Then
        Label7.Text = ArrCadena.Length
    
                ....
    
         viento = ArrCadena(4)
         Label11.Text = viento & " Km/h"
      Else
          MessageBox.Show("No hay 5 elementos.")
      End If

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    miércoles, 16 de noviembre de 2016 23:07