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# TimerCtrl: Control timer para ejecutar rutinas periódicas

Con el control timer se pueden desencadenar eventos periódicos a intervalos de tiempo definidos en las propiedades del objeto.

csharp5El intervalo es definido con una precisión de mili-segundos. Para habilitar su ejecución debemos establecer la propiedad Enabled a True. Definimos el intervalo de ejecución a 1000 milisegundos (1 segundo), cada vez que transcurre ese intervalo se ejecuta la función void Timer1Tick(object sender, EventArgs e).

Añadimos una etiqueta de texto a nuestro formulario que mostrará la fecha-hora actual en forma de cadena.

Cada vez que se ejecute la función del Timer actualiza la etiqueta de texto de forma que vemos como se actualiza cada segundo, este objeto puede ser muy útil por ejemplo para actualizar el contenido de una ventana.


void Timer1Tick(object sender, EventArgs e)
{
label1.Text = DateTime.Now.ToString();
}

Podemos ejecutar o detener el Timer usando los métodos Start o Stop.


 /*
  * Created by SharpDevelop.
  * User: i.landajuela
  * Date: 10/09/2016
  * Time: 18:32
  * 
  * To change this template use Tools | Options | Coding | Edit Standard Headers.
  */
 using System;
 using System.Collections.Generic;
 using System.Drawing;
 using System.Windows.Forms;
 
 namespace TimerCtrl
 {
     /// <summary>
     /// Description of MainForm.
     /// </summary>
     public partial class MainForm : Form
     {
         int second = 0;
         
         public MainForm()
         {
             //
             // The InitializeComponent() call is required for Windows Forms designer support.
             //
             InitializeComponent();
             
             //
             // TODO: Add constructor code after the InitializeComponent() call.
             //
         }
         
         void MainFormLoad(object sender, EventArgs e)
         {
             //timer1.Interval=1000;
             timer1.Start();
     
         }
         
         void Timer1Tick(object sender, EventArgs e)
         {
             label1.Text = DateTime.Now.ToString();
             second=second+1;
             if (second>=10)
             {
                 timer1.Stop();
                 MessageBox.Show("Exiting timer...");
             }
         }
         
     }
 }