C# SerialConsoleApp4: Mejoras gestión línea serie, pines RTS (Request to Send) y CTS (Clear to Send)

El conector RS232 incluye dos pines físicos del conector DB9, RTS (Request To Send) y CTS (Clear To Send).

Estos dos hilos permiten al receptor y emisor avisarse el uno al otro sobre su estado.

Cuando el emisor quiere enviar información activa el pin RST que produce interrupción en el receptor, si el receptor está preparado para recibir le responde usando el pin CTS.  Este es un sistema de control del flujo de información mediante hardware.

La clase SerialPort define atributos para habilitar / deshabilitar este control, RtsEnable (Obtiene o establece un valor que indica si la señal Solicitud de envío (RTS) está habilitada durante la comunicación en serie) y DtrEnable (Obtiene o establece un valor que habilita la señal Terminal de datos preparado (DTR) durante la comunicación en serie).

Añadimos las siguientes líneas al método OpenCOMPort:

Definimos un método delegado COMPortEvtPinChanged para que reciba los cambios de estado de los pines.

 

 

 

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)