#include <Arduino.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "driver/uart.h"
#define UART0_TX 1
#define UART0_RX 3
#define UART2_TX 17
#define UART2_RX 16
#define BUF_SIZE 1024
#define PACKET_SIZE 16
uint8_t packet_buf[PACKET_SIZE];
size_t packet_index = 0;
static QueueHandle_t uart2_queue;
void init_uart0() {
uart_config_t uart0_config = {
.baud_rate = 9600,
.data_bits = UART_DATA_8_BITS,
.parity = UART_PARITY_DISABLE,
.stop_bits = UART_STOP_BITS_1,
.flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
.source_clk = UART_SCLK_APB,
};
uart_param_config(UART_NUM_0, &uart0_config);
uart_set_pin(UART_NUM_0, UART0_TX, UART0_RX, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
uart_driver_install(UART_NUM_0, BUF_SIZE, 0, 0, NULL, 0);
}
void init_uart2() {
uart_config_t uart2_config = {
.baud_rate = 9600,
.data_bits = UART_DATA_8_BITS,
.parity = UART_PARITY_DISABLE,
.stop_bits = UART_STOP_BITS_1,
.flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
.source_clk = UART_SCLK_APB,
};
uart_param_config(UART_NUM_2, &uart2_config);
uart_set_pin(UART_NUM_2, UART2_TX, UART2_RX, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
uart_driver_install(UART_NUM_2, BUF_SIZE, BUF_SIZE, 10, &uart2_queue, 0);
}
void uart0_task(void *pvParameters) {
const uint8_t msg[PACKET_SIZE] = {
0xAA, 0xAA, 0xBB, 0xBB,
0xCC, 0xCC, 0xDD, 0xDD,
0x11, 0x22, 0x33, 0x44,
0x55, 0x66, 0x77, 0x88
};
for (;;) {
Serial.write(msg, PACKET_SIZE); // enviamos exactamente 16 bytes
vTaskDelay(pdMS_TO_TICKS(5000));
}
}
void uart2_event_task(void *pvParameters) {
uart_event_t event;
uint8_t rx_buf[64]; // temporal para leer lo que haya en la FIFO
for (;;) {
if (xQueueReceive(uart2_queue, &event, portMAX_DELAY)) {
if(event.type == UART_DATA) {
int len = uart_read_bytes(UART_NUM_2, rx_buf, sizeof(rx_buf), portMAX_DELAY);
// Acumular bytes en packet_buf
for(int i=0; i<len; i++) {
packet_buf[packet_index++] = rx_buf[i];
if(packet_index == PACKET_SIZE) {
// Tenemos un paquete completo
Serial.printf("Paquete completo recibido: ");
for(int j=0; j<PACKET_SIZE; j++)
Serial.printf("%02X ", packet_buf[j]);
Serial.println();
// Reset para el siguiente paquete
packet_index = 0;
}
}
}
}
}
}
void setup() {
Serial.begin(9600);
init_uart2();
xTaskCreate(uart0_task, "uart0_task", 2048, NULL, 5, NULL);
xTaskCreate(uart2_event_task, "uart2_event_task", 4096, NULL, 5, NULL);
Serial.println("UART0 -> envía, UART2 -> recibe con interrupciones");
}
void loop() {
// aquí no necesitamos hacer nada, las tareas FreeRTOS se ejecutan por separado
}