I'm testing your ISR UART code and it work but ONLY ONE TIME!
After it hold and not receive nothing. Why??
Next question:
How save in string variable received data??
Code: Select all
String Received_Data = ??? (dtmp)Thanks in advice
Code: Untitled.cpp Select all
/*
* https://docs.espressif.com/projects/esp-idf/en/latest/api-reference/peripherals/uart.html#uart-api-setting-communication-pins
*/
#include "driver/uart.h"
#define NUMERO_PORTA_SERIALE UART_NUM_2
#define BUF_SIZE (1024 * 2)
#define RD_BUF_SIZE (1024)
static QueueHandle_t uart2_queue;
static const char * TAG = "";
#define U2RXD 33
#define U2TXD 32
void setup() {
Serial.begin(115200);
//Configuro la porta Serial2 (tutti i parametri hanno anche un get per effettuare controlli)
uart_config_t Configurazione_UART2 = {
.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
};
uart_param_config(NUMERO_PORTA_SERIALE, &Configurazione_UART2);
//Firma: void esp_log_level_set(const char *tag, esp_log_level_tlevel)
esp_log_level_set(TAG, ESP_LOG_INFO);
//Firma: esp_err_tuart_set_pin(uart_port_tuart_num, int tx_io_num, int rx_io_num, int rts_io_num, int cts_io_num)
uart_set_pin(NUMERO_PORTA_SERIALE, U2TXD, U2RXD, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
//Firma: uart_driver_install(UART_NUM_2, uart_buffer_size, uart_buffer_size, 10, &uart_queue, 0));
// uart_driver_install(Numero_porta, RXD_BUFFER, TXD_Buffer, event queue handle and size, flags to allocate an interrupt)
uart_driver_install(NUMERO_PORTA_SERIALE, BUF_SIZE, BUF_SIZE, 20, &uart2_queue, 0);
//Create a task to handler UART event from ISR
xTaskCreate(UART_ISR_ROUTINE, "UART_ISR_ROUTINE", 2048, NULL, 12, NULL);
}
void loop() {
Serial.println("Waiting data from SERIAL 2....");
delay(1000);
}
static void UART_ISR_ROUTINE(void *pvParameters){
uart_event_t event;
size_t buffered_size;
uint8_t* dtmp = (uint8_t*) malloc(RD_BUF_SIZE);
Serial.println("INSIDE ISR");
if(xQueueReceive(uart2_queue, (void * )&event, (portTickType)portMAX_DELAY)) {
bzero(dtmp, RD_BUF_SIZE);
ESP_LOGI(TAG, "uart[%d] event:", EX_UART_NUM);
if (event.type==UART_DATA){
//ESP_LOGI(TAG, "[UART DATA]: %d", event.size);
uart_read_bytes(NUMERO_PORTA_SERIALE, dtmp, event.size, portMAX_DELAY);
Serial.println("DATA= ");
//ESP_LOGI(TAG, "[DATA EVT]:");
//uart_write_bytes(NUMERO_PORTA_SERIALE, (const char*) dtmp, event.size);
}// if event.type
}//if xQuequeReceive
free(dtmp);
dtmp = NULL;
vTaskDelete(NULL);
}
