Puertos con C#. Envio y Recepción de Datos.

Aprenderemos a abrir el puerto, enviar datos y recibirlos. La recepción de datos puede ser de forma síncrona o asíncrona. Yo voy a enfocar todo el artículo a la forma de recepción síncrona, ya que necesito leer la trama y dejar de leer cuando este todo recepcionado, así que tendremos que ir analizando cada byte que recibimos.

En primer lugar abrimos el puerto:

    public void AbrirPuertoSerie(string Puerto,int Velocidad)
        {

            try
            {

                if (_PuertoSerie.IsOpen)
                    _PuertoSerie.Close();
                _PuertoSerie.PortName = Puerto;
                _PuertoSerie.BaudRate = Velocidad;

                _PuertoSerie.Parity = System.IO.Ports.Parity.None;
                _PuertoSerie.DataBits = 8;
                _PuertoSerie.StopBits = System.IO.Ports.StopBits.One;
                _PuertoSerie.Handshake = System.IO.Ports.Handshake.None;

                _PuertoSerie.RtsEnable = false;
                _PuertoSerie.DtrEnable = true;

                //_PuertoSerie.DataReceived += new SerialDataReceivedEventHandler(com_DataReceived);
                //_PuertoSerie.ErrorReceived += new SerialErrorReceivedEventHandler(com_ErrorReceived);

                _PuertoSerie.Open();

            }
            catch (ArgumentOutOfRangeException Ex)
            {
                _Errores.add("AbrirPuertoSerie. " + Ex.Message);
            }
            catch (InvalidOperationException Ex)
            {
                _Errores.add("AbrirPuertoSerie. " + Ex.Message);
            }
            catch (ArgumentException Ex)
            {
                _Errores.add("AbrirPuertoSerie. " + Ex.Message);
            }
            catch (IOException Ex)
            {
                _Errores.add("AbrirPuertoSerie. " + Ex.Message);
            }
            catch (Exception ex)
            {
                _Errores.add("AbrirPuertoSerie. " + ex.Message);
            }

        }

Una vez abierto ya podremos hacer el envío de los datos.

Los datos, la trama, la construiremos con un List<byte> que es lo más cómodo de utilizar y el envío se produce sin errores. He tenido muchos problemas al enviar los datos como char, inexplicable.
Sigue leyendo

Puertos con C#. Tramas y CRC.

Cuando necesitamos conectar con un dispositivo externo a través del puerto COM empiezan las peleas. Según el fabricante del dispositivo con el que queremos comunicarnos necesitamos construir una trama u otra. Cada una de las tramas con las que me he encontrado son de su padre y de su madre, algunas tramas exigen LSB(byte menos significativo)  y MSB(byte más significativo), otras CheckSum o CRC.  Las que piden  CRC suelen tener un algoritmo específico, CRC – 16,  CRC-CCITT, etc…

Otra cosa curiosa es el tema de la transparencia, método por el cual cuando te encuentras un carácter reservado dentro de la trama si va acompañado por un byte de escape hace que no utilicemos dicho carácter reservado como carácter especial, Inicio de datos, Fin de campo, etc…, sino como un carácter normal dentro de la trama, por ejemplo parte de una frase.

Pero gracias a la gente que publica su sapiencia en la red al final encuentras lo necesario para construirlas. El motivo de este artículo es intentar hacer un resumen para que aquel que se encuentre con las situaciones que yo me he encontrado no tenga que leer 35 post distintos, además de servirme a mí para futuras consultas.

Construir tramas

Según las especificaciones tendremos que construir una cosa u otra. Normalmente las tramas vienen definidas por un inicio y un fin, el inicio es llamado STX, 2 HEX, y el final de la trama un ETX,  3 HEX. Nosotros vamos a especificar una de ejemplo:

STX LBS MBS FLD Campo01 FLD CampoN CHK ETX

Sigue leyendo