C# SerialConsoleApp3: Gestión línea serie

Esta vez vamos evitar usar el manejador de evento o método delegado usando SerialDataReceivedEventHandler. En vez de eso vamos a tomar el control del intervalo de lectura del buffer del puerto serie. Primero añadimos el espacio de nombres System.Timers para usar la clase Timer en nuestra nueva clase COMTimer.

Clase COMTimer

La clase COMTimer solo tiene dos atributos, una clase Timer y un booleano que nos informa de si el intervalo de tiempo de espera ha expirado, el objetivo es que podamos consultar la propiedad bTimeOut en cualquier momento y comprobar si el periodo definido en mili-segundos ha transcurrido (no bloquea la ejecución de nuestro programa principal).

Constructor

Inicializamos la bTimeOut a false (se pondrá true cuando expire el intervalo). También definimos algunos atributos de la clase Timer.

  • AutoReset: indica si Timer debe generar el evento Elapsed solo una vez (false) o repetidamente (true).
  • Enabled: indica si Timer debe generar el evento Elapsed.
  • Interval: Obtiene o establece el intervalo, expresado en milisegundos, en el que se generará el evento Elapsed.
  • Elapsed: Se produce cuando transcurre el intervalo. Definimos el método OnTimeoutCOMEvt que será invocado cuanto el intervalo transcurra.

Evento OnTimeoutCOMEvt

Cuando el intervalo de tiempo expire el método OnTimeoutCOMEvt es invocado, establece bTimeOut a true y para la instancia _objCOMTimer de la clase Timer  con el método Stop.

Start

Clase COMPort

Hemos definido un nuevo método de la clase COMPort que viene a sustituir el método delegado EvtCOMDataRx. Recibe como parámetro el periodo de espera para recibir un nuevo byte (en ms).  Inicia el timer y a continuación entra en un bucle infinito hasta que expira el tiempo o hay algo para leer por el buffer serie.

Uso de la clase COMPort

En vez de usar Console.Read para para ejecución del programa al final usamos Console.KeyAvailable para saber si hay pulsación de teclado para salir de la aplicación, mientras tanto trata de leer (le pasamos 1 ms de intervalo de Tout)

Anuncios

C# SerialConsoleApp1: Gestión básica de la línea serie

Conector DB9 (9 pines). Para conexiones en serie, ya que permite una transmisión asíncrona de datos según lo establecido en la norma RS-232

Hoy en día la mayoría de los temarios y contenidos de cursos de lenguajes de programación se dirigen a aplicaciones y servicios en la nube o interfaces gráficos de escritorio, pocas veces se tratan temas como protocolos de comunicación entre máquinas a bajo nivel.

El protocolo serie (RS232) aún hoy es un sistema de comunicaciones muy común en maquinas industriales, es conocido, confiable y además ya existe un montón de código desarrollado en cualquier lenguaje de programación.

Por desgracia hoy día la mayoría de máquinas no traen por defecto este puerto (en los PCs industriales sin embargo es común que vengan con varios puertos COM), en su lugar usan un puerto COM emulado mediante controladores del sistema operativo sobre un cable USB (por ejemplo un dispositivo Arduino).

Inclusión del espacio de nombres

Para trabajar con los puertos COM debemos añadir las siguientes líneas al comienzo del programa (más sobre System.IO en MSDN).

Primer paso: Obtención de puertos COM del sistema

Lo primero es crear una clase básica que albergara todas nuestras funciones para trabajar con el puerto serie. La clase inicial sólo contendrá un método público para imprimir por consola una enumeración de los puertos disponibles en el sistema operativo.

Para obtener los puertos hemos empleado el método SerialPort.GetPortNames. Este método estático retorna un array de cadenas con los nombres de los puertos serie.

Como no tengo otra cosa he conectado mi placa Arduino al PC y este es el resultado.

Abriendo el puerto COM

Lo siguiente es diseñar un método para configurar y abrir el puerto serie, la función recibe los parámetros de configuración de la línea.

Lo más interesante de esta función es la definición del evento DataReceived. Hacemos que DataReceived apunte a un método nuestro (EvtCOMDataRx) que será invocado cada vez que la línea serie indique que ha recibido nuevos datos (handle o manejador), de esta forma no tenemos que estar constantemente preocupados de si han llegado nuevos datos o no.

Enviando datos de prueba de Arduino a nuestro programa

Para no perder el tiempo he usado un proyecto super básico que ilustra como enviar una cadena desde nuestra placa Arduino al PC.

 

Cuando ejecuto mi aplicación C# puedo ver los datos enviados en mi PC!

Posts relacionados

Enlaces externos