Hola:
Ahora añadí un timer que lee a 1000 ms frente a los 100 ms que envía Arduino.
Se me cuelga a veces, antes era siempre.
Código C:
Ver originalusing 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.ReadLine();
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();
}
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.
}
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);
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.
}
}
}
}
Seguiré con el tema de los hilos, pero cuesta entender como programarlo.
Saludos.