Index
1. Introduction: Serial Communication
2. Configuration
3. Code example
1.-Puerto serie
En el contexto de nuestros dispositivos basados en Arduino, la comunicación serie tiene las siguientes características:
- Comunicación asíncrona: los PLC emisor y receptor se configuran con la misma velocidad de transmisión (bits por segundo) para la comunicación. A pesar de ello, no comparten señal de reloj sino que, aparte de ello, ambos dispositivos generan relojes de forma independiente en función de la velocidad de transmisión previamente configurada.
- Bits de inicio y parada: cada bit de información enviado en una comunicación serie asíncrona está enmarcado por un bit de inicio al principio y uno o varios bits de parada al final.
- Half-Duplex y Full-Duplex: en la comunicación Half-Duplex el dispositivo no puede transmitir y recibir simultáneamente, sino que se turna para una y otra acción. En cambio, en la comunicación Full-Duplex, los dispositivos pueden transmitir y recibir al mismo tiempo.
- Codificación ASCII: los datos enviados a través del puerto serie suelen estar codificados con el estándar ASCII.
- Software Serial: además de la comunicación Serial común, también puede utilizar la opción Software Serial cuando la primera no pueda aplicarse.
2.-Configuración
En el caso de la comunicación Half-Duplex, los mensajes se envían siempre en el mismo formato:
Y, en la configuración de Arduino IDE para Serial, puedes ver que tienes que seguir la siguiente Sintaxis y Parámetros (la configuración tiene que ser establecida en la sección de configuración y puedes inicializar tantos puertos seriales como tenga su dispositivo de trabajo):
Si se juntan ambas imágenes, en primer lugar, puedes ver que hay que establecer la velocidad de baudios, que es la velocidad de comunicación del puerto, y tiene que ser la misma en el Tx y Rx si tienen que comunicarse a través del mismo canal de frecuencia. Después de eso, tienes que establecer los parámetros de configuración:
- 8 bits de datos: aquí tienes que establecer con cuántos bits de datos tienes que trabajar.
- 1 Bit de Paridad: aquí tienes que escribir e (para par), o (para impar) o n (para nada). Es importante establecer esto correctamente porque el bit de paridad es un bit binario que indica si el número de bits con el valor 1 en un grupo de bits es par, impar o ninguno. Este es un importante método de detección de errores (compara los 1 con el bit de paridad para comprobar si la transmisión tiene éxito).
- 1/2 Bits de Parada: es importante establecer 1 o 2 bits de parada. Es importante saber que con 1 bit, la eficiencia es del 80%, y con 2 bits baja a 72,7%; pero, a veces, este bit extra puede ser una forma útil de añadir un poco de tiempo extra, especialmente a altas velocidades de baudios y/o usando UART suave, donde se requiere tiempo para procesar el byte recibido.
Si no se establecen los parámetros de configuración del Serial aparte de la velocidad de la tasa de baudios que siempre se requiere, se establecerá la configuración de los parámetros por defecto, que es SERIAL_8N1 (8 -> bits de datos, N -> ninguno, sin paridad, 1 -> bit de parada). En lo que respecta a la velocidad en baudios, es importante ajustar siempre la velocidad correcta según el dispositivo de trabajo (puede consultar las velocidades en baudios soportadas por cada pantalla o dispositivo en sus propias hojas de datos).
3.-Ejemplo de código
Aquí podemos ver un ejemplo que utiliza los Puertos Serie 0, 1 y 2. Hay que tener en cuenta que los dispositivos de nuestra familia principal disponen de varios puertos serie:
- Familia M-Duino: Serial 0 (cuidado, es el mismo que se usa para subir el código, y no puedes usarlo simultáneamente mientras subes el código o usas el monitor Serial) y Serial1.
- Familia PLC ESP32: Serie1 y Serie2.
- Familia Ardbox: no disponen de puerto serie por hardware, debes utilizar el puerto serie por software como puedes ver en el post anterior.
Código del remitente:
/*
Copyright (c) 2019 Boot&Work Corp., S.L. All rights reserved
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
void setup() {
Serial1.begin(9600,SERIAL_8N1); //the default configuration
//Serial.begin(38400,SERIAL_5E1); //even parity
//Serial2.begin(19200, SERIAL_5O1); //odd parity
Serial1.println("This is Serial");
//Serial.println("This is Serial 1");
//Serial2.println("This is Serial 2");
}
void loop() {
// put your main code here, to run repeatedly:
if (Serial1.available()) {
byte tx = 0x5;
// Echo the byte to the serial port again
Serial1.write(tx);
}
Código del receptor:
/*
Copyright (c) 2019 Boot&Work Corp., S.L. All rights reserved
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
void setup() {
Serial1.begin(9600,SERIAL_8N1); //the default configuration
//Serial.begin(38400,SERIAL_5E1); //even parity
//Serial2.begin(19200, SERIAL_5O1); //odd parity
Serial1.println("This is Serial");
//Serial.println("This is Serial 1");
//Serial2.println("This is Serial 2");
}
void loop() {
// Print received byte when available
if (Serial1.available()) {
byte rx = Serial1.read();
// Hexadecimal representation
Serial.print("HEX: ");
Serial.print(rx, HEX);
// Decimal representation
Serial.print(", DEC: ");
Serial.println(rx, DEC);
}
}
Cómo configurar el Puerto Serie en Arduino IDE industrial