Recibir datos desde el Puerto Serial en C#

Desde más de un ciclo estuve padeciendo este tema de tener que recibir datos desde el puerto serial y tener que descubrir como recibirlo desde el C# y mostrarlos de alguna forma. Finalmente me di cuenta que era mucho más fácil de lo que imagine y que en estos momentos ha solucionado mil problemas.

Esta vez estoy recibiendo una trama en donde se encuentra la temperatura del ambiente censada por un termometro. Esta temperatura llega a mi computador mediante el puerto serial en forma de trama. Está en código ASCII y tiene un encabezado de tres símbolos para poder diferenciar las variaciones y puediéndose más adelante no sólo censar la temperatura del ambiente sino también usar otros dispositivos.

Entonces explicando masomenos como es el dato que recibo, son infinitas tramas que van de esta forma:

*$(espacioenblanco)?

*$(espacioenblanco)/

*$(espacioenblanco)?

*$(espacioenblanco){

*$(espacioenblanco)´

*$(espacioenblanco)&

De manera que *$(espacioenblanco) es el encabezado del que les hablé. Y el símbolo que estaba variando es la temperatura en código ASCII. La aplicación será web y no sólo está concebida para medir la temperatura, tiene mil cosas más. Sólo que lo relacionado al puerto serial es unicamente esto. Esta vez a manera de ejemplo y de probar como es que funciona lo que hice fue leer los datos que me envían por el puerto serial y mostrarlos en listbox de manera que van variando conforme aparecen. Pero obviamente a mi me interesa no sólo mostrar la trama entera, convertirla a decimal y mostrar la temperatura… por tal motivo lo que haré será llamar a algunas clases propias del SerialPort que me ayudaron mucho esta vez.

Como les dije el programa está en WindowsForm, hecho en C#. En la barra herramientas, en el grupo de complementos arrastraremos el que se llama serialPort a nuestro formulario para poder configurarlo y usarlo. En el cambiaremos algunos datos dependiendo de nuestra conveniencia. Por ejemplo el nombre del puerto (en mi caso COM4), el BaudRate (9600), DataBits(8), etc…

Copiaré el código usado dentro del formulario para que tengan una idea, ojalá les sirva:

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;

namespace Puerto
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
//   Recepcion(new object(),new System.IO.Ports.SerialDataReceivedEventArgs(EventHandler);
}

private void Form1_Load(object sender, EventArgs e)
{
//abro el puerto serial
serialPort1.Open();
CheckForIllegalCrossThreadCalls = false;

}

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{

}

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{

//creo una cadena en donde se guardarán todas las tramas
string cadena = serialPort1.ReadExisting();
foreach( char caracterc in cadena)  //la cadena o trama que creé y he recibido
//la particiono en caracteres
{
int n = (int)caracterc; //transformo cada caracter ASCII en decimal
if (n != 36 & n != 42 & n != 0) //los caracteres que son la cabecera de la trama los //valido de manera que consigo filtrar unicamente el valor de la temperatura
{
this.listBox1.Items.Add(n); //muestro la temperatura
}
}

}

}
}

En unos días levanto el programa vía web.

16 Respuestas a “Recibir datos desde el Puerto Serial en C#

  1. oye estoy por iniciar un proyecto de una materia llamada desarrollo en el internet el maestro me pide hacer algo que combine algo de electronica con computo y se me ocurrio hacer un sistema de posicionamiento local con unos sensores, estos sensores me van a generar datos que deseo meterlos a la computadora por el puerto serial y manipularlos en C pero no tengo idea como y el codigo que voy a utilizar la programacion no es mi fuerten no se si me puedas ayudar con mas informacion de tu proyecto para yo poder orientarme como voy comenzar,

  2. @ victor marrufo – Eso quiere decir que lo harás vía web.
    En que lenguaje pretendes programar? pretendes seguir alguna arquitectura? o solo quieres conectarte vía puerto serial?.. generalmente para recibir datos se hace en una cadena de buffer… serialPort.Read() o serialPort.ReadLine() o serialPort.ReadExisting() … pero siempre dependera del lenguaje..

    Saludos.

  3. Hola!! Yo tengo que realizar una aplicacion semejante a la que describes, recibir por puerto serial una trama en ASCII, donde hay varios datos provenientes de un Compresor (Temperatura,presión,corriente) en una sola trama; tengo que realizarlo utilizando lenguaje C, mi pregunta es: no tienes el codigo en C? me seria de gran ayuda, por favor.

  4. Chevere si me parece bien, tambien me seria útil el código en C++, muchas gracias por tu disposicion a ayudarme! =)
    Entonces, me avisarias cuando lo tengas?

  5. Ok Muchas Gracias,

    Saludos, ; )

  6. Muchas gracias pana esto se que me servirá para un peque proyecto que mas parece un juego.
    Sabes dcir muchas gracias es muy saludable, recomiendo a los demás hacerlo si no desean cargar con aquellas en su conciencia.

  7. hola esta muy bn el codigo me ha sido de buena ayuda, pero tengo un problema es que yo mando con un potenciometro el voltaje al pic, y pues lo vario de de 0 a 5 volitos el problema es que cuando lo estoy recibiendo con tu codigo a c#, pues en el listbox me va mostrando el dato pero cuando es mayoer de 127 es decir cuando subo mas de 2.5 voltios me muestra el numero 63 siempre, lo he probado con builder el pic y descarte que el error estaba en el programa del pic, si sabes como solucionar este problemilla porfa ayudame

  8. BaudRate (9600) como defines que valor poner aqui???

    y que es esto de los DataBits(8)??

    • Es un valor que dependerá del HD que tengas, por lo general cuando haces simulaciones con placas o similares se usa ése valor por defecto, de la misma forma que los databits, que serán la cantidad de Bits que podrá trasmitir o recibir tu HD.
      slds

  9. Pingback: Como recibir datos desde un puerto serial en C#? | Blog de Camilo Rodríguez

  10. Me ha servido muchísimo este aporte!

    Ahora si podré completar mi trabajo para ganar el dinero que necesito!

    Mucha gracias!

  11. Hola que tal mira estoy realizando un proyecto donde estoy ocupando un GPS y necesito controlar los datos adquiridos por el GPS necesito programar el puerto serial en C me gustaria que me recomendaras algun link o algun libro donde pueda obtener informacion gracias

  12. buenas yo ando desarrollando un proyecto en arduino y c# donde tengo que enviar datos osea numeros como 20,12,39,49 etc.. en un cuadro de texto los pongo y luego los envio pero no se como hacerlo xD

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s