Puerto Serial en C# (Para No Programadores)

Muchas veces ya sea para proyectos escolares o para cuestiones serias de trabajo, nos gustaría tener una interfaz sencilla con nuestro circuito. Ya sean gráficas, datos, esquemas, queremos que se vea bonito y sea funcional.

Esto se logra fácilmente con la computadora, pero siempre esta el dilema de que muchos somos chicos de hardware, de circuitos y sabemos poco o nada de programación. Bueno pues ese es mi caso, así que tuve que aprender algunas cosas para poder hacer mis propias interfaces con circuitos electrónicos.

Advertencia: No soy programador, así que probablemente mi código no sea elegante o eficiente, si embargo solo es un pequeño tutorial para personas que quieran experiementar conectando circuitos y  controlarlos desde la PC.

Para este caso usaremos C#, así que necesitaremos:

SharpDevelop- Es un IDE para desarrollar cosas con C#. Hay otros como NetBeans o Visual C# etc. Se supone que es lo mismo así que usen el que les acomode mejor.

Un circuito de conexión USB-Serial. Dado que en estos dias ya las computadoras no poseen un puerto serial directo se vuelve un problema y usar el USB se vuelve complejo o caro en ocaciones. Tecnologías como FTDI lo hacen mas sencillo. Pueden usar cualquier convertidor que les instale un puerto COM virtual en su computadora. Les recomiendo el CN-02 de GSB Tecnología. Es un convertidor de 485 a USB por lo que su circuito podría encontrarse a 1km de distancia y controlarlo desde su compu.

Un circuito con un microcontrolador que tenga salida UART, u otro dispositivo con salida serial como un PLC (Programable Logic Controller) u otra computadora con convertidor.

Teniendo todos estos componentes podemos empezar.

Primero creen una nueva solución en el SharpDevelop. File>New>Solution>Windows Application. Pónganle un Nombre y ubicación.

SharpDevelop va a crear todo un entorno para poder comenzar a programar, esto es muy cómodo ya que simplifica la vida. En el van a encontrar dos pestañas en la parte inferior [Source] y [Design]

Captura_Serial_Nomadas

En Source vamos a escribir nuestro codigo, mientras que en Design vamos a configurar la ventana de la aplicación.

Empecemos con el Diseño para este ejemplo. Vamos a la pestaña Design y encontraran una ventanita para hacer nuestro programa. Del lado derecho vamos a encontrar las propiedades de la ventana, así como modificación de eventos.  del Lado Izquierdo vamos a encontrar los tipos de objetos que podemos colocar en nuestra ventana. Desde etiquetas, cuadros de texto, botones etc, hasta temporizadores y puertos. Vamos a hacer click en components y ahí encontraremos el Serial Port. Click y arrastralo hasta el proyecto y habrás colocado el objeto dentro de el área de trabajo. Vamos a incluir algunos controles y visualizadores. En Windows Forms vamos a buscar primero un ComboBox, solo le damos click y lo dibujamos. También colocamos un boton, un textBox y tres Label. De la siguiente manera.

Captura_Serial_Nomadas_2

En el lado derecho de las propiedades, nos colocamos en serialPort1 y aparecerán todas las propiedades del objeto. Aquá seleccionaremos la velocidad de transmisión, la paridad, numero de bits. Asegúrate que ambos dispositivos estén con los mismos parámetros.

Click en Label3 (de mi ejemplo) y del lado derecho busca la propiedad de “Text”, Esta se llamará “Seleccione Puerto”, sin comillas.

Label1 Le pondremos “Datos Recibidos”

Label2 La dejaremos en blanco

Ahora clic en el botón, y de nuevo en la propiedad “Text” va a ser “Enviar”

Ahora vamos al código. Lo explicaré lo mas simple posible para aquellos que nunca han hecho un programa en C#, o incluso no han programado nada. Sera una manera simple de enviar y recibir datos por el puerto serial.

Nos iremos a la pestaña de [Source]

Primero colocaremos una librería que usaremos para el puerto, así que donde vean los using y pondremos:

 using System.IO.Ports;
 

Después hay que buscar los puertos que estén conectados a la computadora y los coloca en la lista del ComboBox, para que cuando se utilice se puedan ver los puertos conectados. Estas instrucciones van después de la función InitializeComponent(); que coloca predeterminada mente el SharpDevelop

Control.CheckForIllegalCrossThreadCalls = false;
foreach(string s in SerialPort.GetPortNames())
{
comboBox1.Items.Add(s);
}

La instrucción “Control.CheckForIllegalCrossThreadCalls = false;” Es para que no nos arroje un error por modificar un objeto donde no se debe. Les advertí que no soy elegante jajajaja.

Ahora Regresamos a [Design] damos doble clic al boton y nos aparecera una unción en el código. Ahí colocamos lo siguiente:

void Button1Click(object sender, EventArgs e)
{
serialPort1.Write(textBox1.Text.ToString());
}

Este comando escribirá en el puerto serial lo que se encuentre en el TextBox que pusimos al lado. Todo sera enviado en cadena de caracteres.

Bien, ahora regresamos a Design, le damos clic a la ventana donde esta el nombre del proyecto y del lado derecho buscamos un botón con un rayo amarillo. Ahí buscamos la opción Form Closign y le damos doble clic. De nuevo nos enviara al código y creara otra función. Esto es para que cuando se cierre la ventana, el puerto serial se cierre también. Si no se hiciera, podría causar conflictos con otros programas que usen el puerto serial.

void MainFormFormClosing(object sender,        FormClosingEventArgs e)
{
serialPort1.Close();
}

De nuevo en Design, seleccionamos el ComboBox y vamos al rayo amarillo. y buscamos el evento SelectedIndexChanged. Esto hará que cuando seleccionemos un puerto, éste sea válido y ademas lo des habilitará para no causar conflictos.

void ComboBox1SelectedIndexChanged(object sender, EventArgs e)
{

serialPort1.PortName = comboBox1.Text;
try {
serialPort1.Open();
}
catch
{
MessageBox.Show("Puerto no válido");
return;
}
comboBox1.Enabled = false;
}

Por ultimo vamos a Design, seleccionamos el serialPort1 y al rayo amarillo. Buscamos DataRecived y le damos doble click.

void SerialPort1DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
string dato_reciv = serialPort1.ReadExisting();

label1.Text = dato_reciv;
}

    Ahora podemos compilar nuestro proyecto. Le damos clic al botón verde de “play” y si todo salio bien aparecerá la ventana que programamos :D.

Solo buscamos nuestro puerto en el ComboBox, y los datos que pongamos en el cuadro de texto se enviarán, y los que se reciban se verán abajo.

Captura_Serial_Nomadas_final

Les dejo el programa que yo compile y he probado. Hice otra aplicación usando estas mismas funciones, pero en vez de solo mostrarlas, las va graficando 😀 Esto para añadir sensores y actuadores a nuestro sistema y monitoriaros desde la PC.  ADC_Graf

https://dl.dropbox.com/u/39231588/Serial_Nomadas.exe

Si requieren el proyecto completo o diagramas de conexión haganos saber en la pagina de facebook o en el twitter 😀

http://www.facebook.com/NomadasElectronicos

@electronomadas

Rick

Anuncios

25 pensamientos en “Puerto Serial en C# (Para No Programadores)

  1. Pingback: ADCGraf-Programa para visualizar los datos de un ADC, por medio de una UART/USART « Nomadas Electronicos

  2. Una consulta… quiero capturar la señal de un equipo que transmite en rs232 pero quiero que la variable la pueda insertar en una pagina web. Me puedes ayudar con este tema por favor

    • Para ello, tendrias que identificar como empieza y termina un paquete, o si la parte que necesitas lleva primero una letra o un numero. O si es dato en bruto (raw) pues que numero (0-255) identifica la parte que quieras obtener. Si es en ascii (texto) puedes obtener un paquete grande y despues buscar dentro de la cadena, hay muchas formas de hacerlo en C#, un par de ejemplos estan aqui y aqui. Espero esto te sea de utilidad.
      Saludos

  3. Hola..!!
    Muchas gracias por publicar estas instrucciones,
    He realizado mi primer programa en C# usando el puerto Serie, en solo unos minutos..!!
    Que te vaya Bien’, Saludos

    Gloria a Dios!!

    • para enviar datos por el puerto usb directamente necesitas desarrollar tu propio sistema, la manera mas difundida es con un pic (si buscas en google “pic usb device” hay muchos links que tienen informacion y tutoriales que podrian ayudarte). De manera abreviada, programas algun microcontrolador que tenga capacidades usb e integras el driver (generalmente lo puedes desarrollar con el software del fabricante del micro) a tu software en la computadora. Espero esto te sirva. Saludos

  4. hola, interesante proyecto me gustaría saber si me pueden ayudar, se como funciona el Usb serial de hecho lo he usado en micro-controladores.. pero tengo que hacer un proyecto sin microcontroladores, solo con elementos basicos como compuertas y eso pero debo hacerlo por comunicacion serial y no tengo idea como, consiste en lo siguiente. hacer un montaje de leds rojo y verde y al enviar un 1 se prenda el led rojo y al enviar un 0 se prenda el led verde.. luego tengo que seguirlo implementando para terminar haciendo un codigo ami… pero aun no consigo ni lo primero… gracias por su atencion.

    • Hola, el puerto serial “hecho a mano” es bastante como para poner en un solo comentario, no es difícil, pero si es extenso.

      Una buena página que te dará una buena base donde empezar con el puerto serie, mas si es el acercamiento por el lado de la electrónica, es la siguiente: http://retired.beyondlogic.org ahí hay un apartado “legacy ports” donde esta el puerto serie y el puerto paralelo. Para mi fue una referencia obligada en mis primeros acercamientos con este tipo de puertos 😉

      Espero te sea de utilidad.

      Saludos

  5. Hola necesito conectar una Balanza (balanza XAC-30C) en el puerto serial de mi PC , para leer el peso que esté midiendo dicha balanza y poder mostrarlo en pantalla, luego procesarlo ( esto si se hacerlo). Este codigo me servirá por favor dame alguna sugerencias. Saludos

    • Hola, por lo que pude investigar sobre la balanza, tiene un puerto RS232 para conectarse a la PC. Lo que se me ocurre para empezar es conectarla con el convertidor de rs232/usb (si es que se necesita) a la PC y usar un programa para el puerto serie y empezar a escuchar a la balanza (yo uso realterm http://realterm.sourceforge.net/ ). Hay que descubrir primero que velocidad esta usando para transmitir, luego ver si no necesita algun comando o algo asi. La verdad no encontre mucha informacion de la balanza, asi que estos serian mis pasos a seguir. Espero sean de ayuda. Saludos

  6. Buenas amigo, excelente tu articulo. Estoy haciendo un proyecto donde muestro los puertos COM disponibles, lo hago perfecto. Pero ahora el proyecto tiene que mostrar de donde provienen esos com. Por ejemplo si conecto un conversor USB TO COM y la computadora le asigne el COM4, el programa tiene que mostrarme que esta disponibl y aparte que proviene del USB TO COM, hay forma de hacer eso?

  7. Gracias por sus aportes muy didácticos.
    Le quiero pedir su asesoría para recibir información por conexión Usb, proveniente de una tarjeta NVIDIA, (se comporta como otro pc pues tiene memoria, son datos de matrices- imagenes desde un microscopio), necesito pasarlos de la tarjeta a un PC,por puero USB. Mi profe dice que son un par de instrucciones en C, pero la verdad llevo varios días buscando y no consigo. Muchas gracias.

    • Hola, tendrías que declarar la clase en un lugar más “global”, digamos donde se declara la clase de form1, así las clases inferiores pueden verlo, como si fuera un variable global en c.

  8. buenas tardes.
    quisiera saber si hay una forma de activar un botón mediante el puerto serial.
    ejemplo: el botón 1, realizar la misma función que si estuviera dándole click.

    • La forma en que se me ocurre es la siguiente: puedes enviar por el puerto serie (a través un microcontrolador) el cambio en un botón, el programa en la computadora tendrá que estar a la espera de ese comando por el puerto serie. El programa también debe contar con alguna clase u objeto que controle el mouse o el teclado de la pc, para simular ese dispositivo y así, cuando presiones el botón, se haga un click, un doble click, una presionada de tecla, etc. Lo que si tendrías que investigar, dependiendo el lenguaje de programación que estés usando, que clase/librería/función usaras para simular tu mouse/teclado.

      Saludos.

  9. Hola, muy buen aporte, solo tuve un problema, al momento de seleccionar el COM con el combobox me aparece el mensaje de “Puerto no válido” aunque tenga el puerto funcionando (con un PLC conectado en el) cabe también mencionar que utilizo un convertidor de serial a usb con el que lo conecto a mi lap.

    cuando introduzco un string es el textbox me aparece el mensaje “No se controló
    InvalidOperationException” “El puerto está cerrado” y el mesaje señala la instrucción del botón: serialPort1.Write(textBox1.Text.ToString());

    Podrías ayudarme a corregir el problema?

    Muchas gracias!

    • Antes de poder usar el puerto serie, es nececsario abrirlo:
      serialPort1.PortName = comboSerial.Text.ToString();
      serialPort1.Open();
      serialPort1.Write(textBox1.Text.ToString());

      Si no puedes abrirlo antes o te marca error al abrirlo, puede ser que alguna aplicacion o servicio tome “posesion” del puerto antes que tu aplicacion.

      Saludos.

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