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 :
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;
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.
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