// Definición de un arreglo de bytes para almacenar los datos a transmitir
byte Tx[8];
// Variable para almacenar el valor del CRC
unsigned int CRC = 0;
// Variables booleanas para controlar flags y condiciones
bool flag, p10;
// Función para calcular el CRC de los datos
void CheckCRC() {
// Inicialización del CRC
CRC = 0x0000FFFF;
// Bucle para recorrer los primeros 6 elementos del arreglo Tx
for (int i = 0; i <= 5; i++) {
CRC = CRC ^ Tx[i]; // XOR entre el byte actual y el CRC
for (int j = 0; j < 8; j++) {
flag = bitRead(CRC, 0);
CRC = CRC >> 1;
if (flag == 1) CRC = CRC ^ 0xA001; // Aplicación del polinomio CRC16
}
}
// Almacenamiento del CRC en los últimos dos elementos del arreglo Tx
Tx[6] = CRC;
Tx[7] = CRC >> 8;
}
// Función para transmitir los datos a través de los puertos seriales
void transmision() {
// Bucle para enviar cada byte del arreglo Tx a través de los puertos seriales
for (int i = 0; i < 8; i++) {
Serial1.write(Tx[i]);
Serial2.write(Tx[i]);
Serial.write(Tx[i]);
}
}
void setup() {
// Configuración de los puertos seriales y del pin 10 como entrada con pull-up
Serial1.begin(19200, SERIAL_8E1);
Serial2.begin(19200, SERIAL_8E1);
Serial.begin(9600, SERIAL_8E1);
pinMode(10, INPUT_PULLUP);
}
void loop() {
// Transmisión de datos analógicos
Tx[0] = 0x01;
Tx[1] = 0x06;
Tx[2] = 0x01;
Tx[3] = 0x00;
Tx[4] = analogRead(0) >> 8; // Lectura analógica y desplazamiento de bits
Tx[5] = analogRead(0);
CheckCRC(); // Cálculo del CRC
transmision(); // Transmisión de datos
delay(1000);
// Transmisión de datos digitales sin condición
p10 = digitalRead(10);
Tx[0] = 0x01;
Tx[1] = 0x05;
Tx[2] = 0x08;
Tx[3] = 0x00;
Tx[4] = 0x00;
Tx[5] = 0x00;
CheckCRC();
transmision();
delay(1000);
// Transmisión de datos digitales con condición
p10 = digitalRead(10);
Tx[0] = 0x01;
Tx[1] = 0x05;
Tx[2] = 0x08;
Tx[3] = 0x00;
if (p10 == HIGH) {
Tx[4] = 0xFF;
Tx[5] = 0x00;
CheckCRC();
transmision();
delay(1000);
}
}