Desarrollo de Máquinas de Báscula Autónoma: Control de Interruptores Físicos y Relés de 8 Canales

  1. 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.
  2. La confgiuración de los interruptores se almacena en un archivo XML.
  3. 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");
            }
        }
    }

  1. 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);
            }

  1. 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);
            }

        }

  1. 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>    }

Etiquetas: C# SerialPort XML Relés Control de Hardware

Publicado el 9-17 06:33