UART read until CR \n
Posted: Wed Feb 03, 2021 2:10 pm
Hello,
I use ESP32 as a bridge between Arduino based Robot and ROS2 on PC.
Arduino provides sensor data of robot by sending data via UART to ESP32
ESP32 needs to read each single line and process/translate this message for ROS2.
Currently, I read UART like this
with BUF_SIZE of 256
In general it works, however I receive multiple messages with one uart_read_bytes
Each message starts with $ and type identifier, $RS means sensor value, $EV means raised event of robot.
How can I read each sentence individually? I don't want to send a fixed length as some messages are much shorter than others.
Is there a simple way to read until '\n'?
Sure I can read individual chars until '\n' occurs but I wonder if there is some pre-build solution for this.
Greetings
I use ESP32 as a bridge between Arduino based Robot and ROS2 on PC.
Arduino provides sensor data of robot by sending data via UART to ESP32
ESP32 needs to read each single line and process/translate this message for ROS2.
Currently, I read UART like this
Code: Select all
uart_config_t uart_config = {
.baud_rate = UART_BAUD_RATE,
.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,
};
int intr_alloc_flags = 0;
#if CONFIG_UART_ISR_IN_IRAM
intr_alloc_flags = ESP_INTR_FLAG_IRAM;
#endif
ESP_ERROR_CHECK(uart_driver_install(UART_PORT_NUM, BUF_SIZE , 0, 0, NULL, intr_alloc_flags));
ESP_ERROR_CHECK(uart_param_config(UART_PORT_NUM, &uart_config));
ESP_ERROR_CHECK(uart_set_pin(UART_PORT_NUM, UART_TXD, UART_RXD, UART_RTS, UART_CTS));
// Configure a temporary buffer for the incoming data
uint8_t *data = (uint8_t *)malloc(BUF_SIZE);
while (1)
{
// Read data from the UART
int len = uart_read_bytes(UART_PORT_NUM, data, BUF_SIZE, 20 / portTICK_RATE_MS);
// Write data back to the UART
if (len > 0)
{
data[len] = 0;
ESP_LOGI(TAG, "Data received: %i", len);
xQueueSend(uartQueue, data, (TickType_t)0);
}
}
In general it works, however I receive multiple messages with one uart_read_bytes
Code: Select all
$EV|1|25
$RS|0|1|1|1|1|1|0|1|1
$RS|0|8|0.00|0.00|0.00|0.00|0.00|0.00|0|0|0|0.00|0.00|0
$RS|0|15|11|0|0|0
$RS|0|19|-132.52|7.38|-2.51|-0.11|-0.29|0.05|-0.12|-0.04|0.99|-32304.00|-32145.00|31016.00
$RS|0|20|0|0
How can I read each sentence individually? I don't want to send a fixed length as some messages are much shorter than others.
Is there a simple way to read until '\n'?
Sure I can read individual chars until '\n' occurs but I wonder if there is some pre-build solution for this.
Greetings