none
Comunicación Serial RS232.VB.Net. Entrada Análoga. Recepción de datos. Procesamiento de datos. RRS feed

  • Pregunta

  • Saludos.

    Estoy intentando capturar los datos de una entrada analógica a través del puerto serial. He logrado capturar los datos como quería pero ocurre que tengo un problema. El buffer se llena después de un tiempo y por ende no procesa los datos a la misma velocidad que llegan. Ocupo el evento DataReceived que yo supongo que se ejecuta con cada dato que llega pero es justo aquí donde pienso que esta el problema ya que siguen llegando datos y se ejecuta un nuevo evento antes de que termine de procesar las tareas que tiene el evento. Pienso que podría hacer el procesamiento de los datos con hilos pero la verdad no entiendo bien el tema. Cualquier ayuda que me puedan brindar les agradeceré. 

    • Cambiado Enrique M. Montejo miércoles, 13 de septiembre de 2017 8:16 Comunicación con dispositivos externos.
    viernes, 8 de septiembre de 2017 21:38

Todas las respuestas

  • Hola:

    El ejemplo que he hecho hasta ahora es este. Entrada analógica desde Arduino.

    C#:

    using System;
    using System.Collections.Generic;
    using System.Windows.Forms;
    
    using System.IO.Ports; // No olvidar.
    using System.IO;
    
    namespace Arduino_In_Analogico_prueba_01
    {
        public partial class Form1 : Form
        {
            // Utilizaremos un string como buffer de recepción.
            string Recibidos;
    
            public Form1()
            {
                InitializeComponent();
    
                if (!serialPort1.IsOpen)
                {
                    try
                    {
                        serialPort1.Open();
                    }
                    catch (System.Exception ex)
                    {
                        MessageBox.Show(ex.ToString());
                    }
    
                    serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
                }
            }
    
    
            // Al recibir datos.
            private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
    
                // Acumula los caracteres recibidos a nuestro 'buffer' (string).
                try
                {
                    // Recibidos = serialPort1.ReadLine();
                }
    
                catch (IOException)
                {
                    // Información adicional: La operación de E/S se anuló por una salida de subproceso o por una solicitud de aplicación.
                    return;
                }
    
                catch(Exception)
                {
                    return;
                }
    
                // Invocar o llamar al proceso de tramas.
                Invoke(new EventHandler(Actualizar));
            }
    
    
            // Como variables de clase
            private string[] Separador = new string[] { ",", "\r", "\n", "/n" };
            private List<string> Leo_Dato = new List<string>();
    
            // Procesar los datos recibidos en el bufer y extraer tramas completas.
            private void Actualizar(object sender, EventArgs e)
            {
    
                
    
                    Recibidos = serialPort1.ReadExisting();
    
                    double Voltaje = 0;
                    double Porcentaje = 0;
    
                    // En el evento.
                    Leo_Dato.Clear();
                    Leo_Dato.AddRange(Recibidos.Split(Separador, StringSplitOptions.RemoveEmptyEntries));
    
                    //            Se produjo una excepción de tipo 'System.ArgumentOutOfRangeException' en mscorlib.dll pero no se controló en el código del usuario
    
    
                    try
                    {
                        label_Lectura_Potenciometro.Text = Leo_Dato[0].ToString();
    
                
    
                progressBar1.Value = Convert.ToInt32(Leo_Dato[0].ToString());
                double Dato_Voltaje = Convert.ToDouble(Leo_Dato[0]);
                double Dato_Porcentaje = Convert.ToDouble(Leo_Dato[0]);
    
    
                Voltaje = Dato_Voltaje * (5.00 / 1023.00);
                Porcentaje = Dato_Porcentaje * (100.00 / 1023.00);
                }
    
                catch (ArgumentOutOfRangeException)
                {
                    //Información adicional: El índice estaba fuera del intervalo. Debe ser un valor no negativo e inferior al tamaño de la colección.
                }
    
                label_Voltio.Text = Voltaje.ToString("N2") + " V."; // N2 tiene dos decimales.
                label_Portentaje.Text = Porcentaje.ToString("N2") + " %";
            }
    
            private void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {
    
                timer1.Stop();
    
                if (serialPort1.IsOpen) // ¿El puerto está abierto?
                {
                    serialPort1.Close(); // Puerto cerrado.
                }
            }
        }
    }

    Saludos.


    http://electronica-pic.blogspot.com

    miércoles, 1 de noviembre de 2017 23:52