- La supervisión directa del puerto serie para estos interruptores no es efectiva. Es necesario enviar datos al puerto serie y luego monitorear para determinar qué botón ha sido presionado.
- La confgiuración de los interruptores se almacena en un archivo XML.
- Clase para la lectura de archivos XML:
public class LectorXml
{
public static string ObtenerElementoPorNombre(string rutaArchivoXml, string nombreElemento)
{
try
{
string resultado = null;
XmlDocument documento = new XmlDocument();
documento.Load(rutaArchivoXml);
XmlNodeList nodos = documento.GetElementsByTagName(nombreElemento);
foreach (XmlNode nodo in nodos)
{
resultado = nodo.InnerText;
}
return resultado;
}
catch
{
throw new Exception("Error al abrir el archivo");
}
}
}
- Apertura del puerto serie para el interruptor:
SerialPort puertoSerie = new SerialPort();
if (puertoSerie.IsOpen == true)
{
puertoSerie.Close();
}
string rutaArchivoIni = rutaApp + "wmsconfig" + "\\" + "ConfiguracionInterruptor.xml";
if (File.Exists(rutaArchivoIni))
{
puertoSerie.BaudRate = Convert.ToInt32(LectorXml.ObtenerElementoPorNombre(rutaArchivoIni, "TasaBaudios"));
puertoSerie.DataBits = Convert.ToInt32(LectorXml.ObtenerElementoPorNombre(rutaArchivoIni, "BitsDatos"));
puertoSerie.StopBits = (StopBits)Convert.ToInt32(LectorXml.ObtenerElementoPorNombre(rutaArchivoIni, "BitsParada"));
puertoSerie.Parity = (Parity)Convert.ToInt32(LectorXml.ObtenerElementoPorNombre(rutaArchivoIni, "Paridad"));
var nombrePuerto = LectorXml.ObtenerElementoPorNombre(rutaArchivoIni, "NombrePuerto");
if (null != nombrePuerto)
puertoSerie.PortName = nombrePuerto;
}
puertoSerie.BaudRate = 9600;
puertoSerie.DataBits = 8;
puertoSerie.StopBits = StopBits.One;
//puertoSerie.PortName = "COM1";
puertoSerie.Parity = Parity.None;
try
{
puertoSerie.Open();//abrir puerto serie
puertoSerie.DtrEnable = true;//configurar DTR en alto
puertoSerie.RtsEnable = true;//configurar RTS en alto
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
- Implementación de un temporizador que envía datos continuamente al puerto serie y lo monitorea:
DispatcherTimer temporizador; temporizador = new DispatcherTimer(); temporizador.Interval = TimeSpan.FromMilliseconds(1000); temporizador.Tick += temporizador_Tick; temporizador.Start(); puertoSerie.DataReceived -= new SerialDataReceivedEventHandler(eventoDatosRecibidos); puertoSerie.DataReceived += new SerialDataReceivedEventHandler(eventoDatosRecibidos);
private void temporizador_Tick(object sender, EventArgs e)
{
if (puertoSerie.IsOpen == true)
{
mensajeRecibido = "";
byte[] datosEnvio = new byte[] { 0x21, 0x02, 0x00, 0x00, 0x00, 0x08, 0x7E, 0xAC };
//enviar datos
puertoSerie.Write(datosEnvio, 0, datosEnvio.Length);
}
}
- Determinación si se preesionó el botón de inicio o finalización:
//evento para recibir datos de botones
private void eventoDatosRecibidos(object sender, SerialDataReceivedEventArgs e)
{
Thread.Sleep(100); //milisegundos, esperar tiempo suficiente para garantizar integridad de datos int longitud
int longitud = puertoSerie.BytesToRead;
string datosRecibidos = string.Empty;
if (longitud != 0)
{
byte[] buffer = new byte[longitud];
puertoSerie.Read(buffer, 0, longitud);
for (int i = 0; i < buffer.Length; i++)
{
mensajeRecibido += buffer[i].ToString("X2"); //mostrar en hexadecimal
}
ts2 = new TimeSpan(DateTime.Now.Ticks);
if (mensajeRecibido!=null)
{
if (mensajeRecibido.Contains("21020104AB8B"))
{// MessageBox.Show("botón de inicio");
}<br></br> }<br></br> }<br></br> }