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]
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.
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.
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://app.box.com/s/7p6ypshi78bl01y0kr9s
Si requieren el proyecto completo o diagramas de conexión haganos saber en la pagina de facebook o en el twitter 😀
@electronomadas
Rick
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
Me gustaMe gusta
saludos tengo un equipo que me manda datos continuos por el rs232 es una trama de pro solo quiero una parte de la trama como puedo hacer gracias.
Me gustaMe gusta
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
Me gustaMe gusta
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!!
Me gustaMe gusta
una duda…. si quiero enviar datos directamente desde el usb port como le haria…
Me gustaMe gusta
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
Me gustaMe gusta
Hey Bro, muchas gracias por el tutorial esta muy practico +10!
Me gustaMe gusta
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.
Me gustaMe gusta
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
Me gustaMe gusta
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
Me gustaMe gusta
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
Me gustaMe gusta
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?
Me gustaMe gusta
De hecho si, con «WMI queries», es practicamente accesar al sistema para pedir informacion directo del hardware. Puede ser un poco truculento, debido al uso de otro lenguaje para la consulta, pero nada que unos 15 minutos de lectura no cubran jejeje. Hay un articulo que se acerca mucho a lo que necesitas: http://www.codeproject.com/Articles/32330/A-Useful-WMI-Tool-How-To-Find-USB-to-Serial-Adapto y usa el WMI Code Creator, que hace las consultas por ti, es como una especie de wizard, muy util para empezar, ya que es muy facil acceder a zonas sensibles del sistema.
El code creator lo encuentras aqui: https://www.microsoft.com/en-us/download/details.aspx?id=8572
Espero te sea de utilidad.
Saludos
Me gustaMe gusta
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.
Me gustaMe gusta
Vaya, no hemos intentado algo así, ¿qué modelo estas usando? Igual y si le echamos un vistazo te podemos decir que se nos ocurriría 🙂 Saludos
Me gustaMe gusta
hola como puedo contactarme contigo por favor
Me gustaMe gusta
Hola, puedes hacer a través de nuestra pagina de Facebook. Saludos
Me gustaMe gusta
hola como puedo tomar el mismo serialPort que abri en un form1 y tomar ese mismo serialPort en otro form2 en C#, visual basic 2012
Me gustaMe gusta
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.
Me gustaMe gusta
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.
Me gustaMe gusta
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.
Me gustaMe gusta
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!
Me gustaMe gusta
Corrección: Cable USB a serial
Me gustaMe gusta
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.
Me gustaMe gusta
Buen dia , el enlace del programa esta caido
Me gustaMe gusta
El enlace actualizado: https://app.box.com/s/7p6ypshi78bl01y0kr9s
Me gustaMe gusta
Muchas gracias amigo
Me gustaMe gusta