Leer datos del puerto serie en C#

Hola chicoss!
Me gustaría que alguein me pudiera ayudar con este problema:
esto probando la entrada analoga de la arduino con un potenciometro. Hice una interfaz en C# para leer el valor del convertidor que oscila entre 0 - 1023 y mostrarlo en una label. Eso está bien!
Pero tambien quiero que muestre el valor equivalente en volts de acurdo al valor del convertidor. Es decir, 0 = 0 volts y 1023 = 5 volts. Cuando leo el valor del serial port es un string y al mostrarlo en el label como string no hay problema. Pero cuando quiero convertir ese string a entero para realizar las operaciones que me convierten a VOLTS me marca un error de conversión.
Aquí estan los codigos :

ARDUINO CODE:

void setup() {
  Serial.begin(9600);
}

void loop() {
  int sensorValue = analogRead(A0);
  Serial.println(sensorValue, DEC);
  delay(200);
}

C# CODE:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports; //PERMITE EL USO DE LOS PUERTOS.

namespace PWM_LED
{
    public partial class Form1 : Form
    {
         public Form1()
        {
            InitializeComponent();
            serialPort1.Open(); 
        }
        

        private void timer1_Tick(object sender, EventArgs e)
        {
            string POT = serialPort1.ReadExisting(); //changing between 0-1023
            label3.Text = POT;
            int VALUE = Convert.ToInt32(POT); // convert to int for making operations.
            label5.Text = Convert.ToString(VALUE * (5/1023)); //shows the voltage value
            //pot=1023 the voltage showed is 5, pot=0 the voltage showed is 0.
        }
    }
}

Wenas compañero, por que no conviertes mejor con el metodo parse, de forma que seria.

value = int.Parse(pot);

y ya tendrias el valor de pot de forma entero en value, y para hacer las operaciones te sugeriria una variable auxiliar, de forma que se queradia algo a si

aux = value * (5 /1023);

y ya para mostarlo en el label, solo tendrias que usar el metodo tostring

aux.tostring(); //esto te devolveria el valor de aux en strng
de forma que podrias poner label5.text = aux.tosrting();

Espero que esto te sea de ayuda, y si no funciona, pues nada a segir preguntando que aqui estaremos para echarte una mano en lo que se pueda xD;

Una pequeña precisión:

Para convertir la lectura del convertidor analógico de 10 bits hay que multiplicar por 5/1024. Es decir:

aux = value *(5/1023);

Efectivamente, la resolución es 5/1024 y la medida máxima 5/1024*1023, esto es, que aunque pongamos 5V, nuestra lectura nunca llegará a los 5V ya que se quedara un cuenta del convertidor (4.9mV) por debajo.

Holaa!!
gracias por responder
intente hace la modificacion que me dices pero me arroja el mismo error
me marca

FORMATEXCEPTION WAS UNHANDLED
input string vas not in a correct format.

No sé si saben a que se debaa :S

El problema puede ser que lo que te llega del arduino no sea exactamente un número, aunque lo parezca.
Prueba poniendo en la etiqueta lo que llega del arduino encerrado entre algo.
Por ejemplo pon en la etiqueta "$"+POT+"$", si aparece $ 123 $ es que tienes blancos por delante o por detrás, haz un trim() del string justo antes de la conversión.

Sería bueno capturar la excepción (supongo que en C# se puede hacer) y tirar al log lo que está llegando en ese momento.

arrggg se me paso, fallo mio, el problema es que cuando usas en arduino println junto con la cadena tambien se envian caracteres de control, /n /r o que son el retorno de carro y el salto de linea. la idea seria cortar esa cadena con el metodo Split(), de forma que tomaras solo una cadena hasta llegar al primer espacio en blanco, o tambien podrias buscar el indice del espacio en blanco, y hacer un substring para obtener la cadena hasta el espacio en blanco.

O si no me confundo mucho, usar en arduino el metodo, print solamente que no escribe los caracteres de control.

Aqui te dejo un link donde explican el uso de cadenas en c#.

Por cierto lo de las interupciones, en c# se pueden capturar con try{}
poniendo entre las llaves el codigo el cual puede generar la exepcion, y con cath(){}la exepcion.

Espero esto te alla servido un poco de ayuda, se que podria haberme explicado mejor, pero no tengo tengo que partir en breve, mañana si no ha habido solucion, pasare de nuevo y me entretengo mas xD

Saludos compañeros

Bien chicoss!!
Dejemneee intentar sus métodoss :slight_smile:

Listoo chicosss!!!
Lo conseguí gracias a su ayudaa e inventivaa
muhcass graciass :slight_smile:

Aquí les dejo el código.

ARDUINO:

void setup()
{
  Serial.begin(9600);
  
}
void loop()
{
  int value=map(analogRead(0),0,1023,0,255);
  Serial.println(value);
  delay(250);
}

CODIGO C#:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Read_serial
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            serialPort1.Open();
            serialPort1.DataReceived += serialPort1_DataReceived;        
        }


        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            string POT = serialPort1.ReadLine();
            this.BeginInvoke(new LineReceivedEvent(LineReceived), POT);
        }

        private delegate void LineReceivedEvent(string POT);

        private void LineReceived(string POT)
        {
            //What to do with the received line here
            int voltaje; double aux;
            voltaje = int.Parse(POT);
            label1.Text = POT;
            aux = voltaje * (5.0 / 255.0);
            string valor = Convert.ToString(aux);
            try
            {
                string valor2dec = valor.Substring(0, 4);
                label2.Text = valor2dec + " v";
            }
            catch
            {
                label2.Text = valor+".00 v";
            }
                progressBar1.Value = voltaje;
           
        }
    }
}

Te bastaba con cambiar Serial.println por Serial.print, no?

Disculpa aun soy nuevo en estoo,
cual sería la diferencia :slight_smile:

Para eso esta la referencia :wink:

http://www.arduino.cc/es/Serial/Println
http://www.arduino.cc/es/Serial/Print