Page 1 of 1

uart vfs not working in 5.4

Posted: Tue Apr 22, 2025 7:25 am
by Jojojojojohnson
I have recently installed 5.4.1 espidf version, previously on 5.3.1. I have noticed that the uart vfs is not working as intended.
The build was successfull, but i noticed that when reading the uart device file, there are missing bytes.


example:
if the message received "hello world\n"
vfs would contain "hel" (not consistent)

reverting this back to 5.3.1 eliminates this issue.

Code: Select all

[/code
int uart_init(struct uart_config_t *uart)
{
    int ret_val = 0;
    esp_err_t ret = ESP_OK;

    /* Configure parameters of an UART driver,
     * communication pins and install the driver */
    uart_config_t uart_config = {
        .baud_rate = uart->baudrate,
        .data_bits = UART_DATA_8_BITS,
        .parity = uart->parity,
        .stop_bits = UART_STOP_BITS_1,
        .flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
        .source_clk = UART_SCLK_APB,
    };

  
    
        ESP_LOGW(TAG, "REGISTER NORMAL UART PORT: %d", uart->uart_port);

        /* Install UART driver without interrupt enabled */
        if (!uart_is_driver_installed(uart->uart_port))
        {
            ret = uart_driver_install(uart->uart_port, BUFFER_SIZE * 2, 0, 0, NULL, 0);
        }
    

    if (ret != ESP_OK)
    {
        ret_val = -UART_DRIVER_INSTAL_FAIL;
        ESP_LOGE(TAG, "UART DRIVER INSTALL FAILED %d", ret_val);
        return ret_val;
    }
    uart_param_config(uart->uart_port, &uart_config);
    if (ret != ESP_OK)
    {
        ret_val = -UART_PARAM_CONFIG_FAIL;
        ESP_LOGE(TAG, "UART PARAMETER CONFIGURATION FAILED %d", ret_val);
        return ret_val;
    }

    // Set UART pins (using UART0 default pins ie no changes.)
    uart_set_pin(uart->uart_port, uart->tx_pin, uart->rx_pin, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);

    /* Using Virtual File System */
    uart_vfs_dev_use_driver(uart->uart_port);

    uart_vfs_dev_port_set_rx_line_endings(uart->uart_port, ESP_LINE_ENDINGS_LF);

    return ret_val;
}


void get_uart_vfs_buffer(struct uart_config_t *uart, char *buf, int len)
{
    FILE *uart_file;
    uart_file = fopen(uart->vfs_name, "r");

    fgets(buf, len, uart_file);

    fclose(uart_file);
}


void somethread(){
...
    while(1){
           get_uart_vfs_buffer(&uart_struct, buf, ESTIMATED_SIZE);
           }
}

]

Re: uart vfs not working in 5.4

Posted: Tue Apr 22, 2025 9:44 am
by Jojojojojohnson
Tested this on espidf 5.3.3, does not work either.

Re: uart vfs not working in 5.4

Posted: Wed Apr 30, 2025 6:48 am
by haberturdeur
Hi,
Just to clarify the rest of the data is lost fully, not just received in the next call to read?

I tried replicating your issue with the following code, but was unable to.

Does your code look something like this?

Code: Select all

#include <stdio.h>
#include <inttypes.h>
#include "hal/uart_types.h"
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_chip_info.h"
#include "esp_flash.h"
#include "esp_system.h"
#include "driver/uart.h"
#include "driver/uart_vfs.h"
#include "driver/gpio.h"
#include "esp_log.h"

#define BUFFER_SIZE 1024
#define UART_DRIVER_INSTAL_FAIL 1
#define UART_PARAM_CONFIG_FAIL 2

const char *TAG = "main";

struct uart_config_t {
    unsigned baudrate;
    uart_parity_t parity;
    uart_port_t uart_port;
    gpio_num_t tx_pin;
    gpio_num_t rx_pin;
    const char *vfs_name;
};

int uart_init(struct uart_config_t *uart)
{
    int ret_val = 0;
    esp_err_t ret = ESP_OK;

    /* Configure parameters of an UART driver,
     * communication pins and install the driver */
    uart_config_t uart_config = {
        .baud_rate = uart->baudrate,
        .data_bits = UART_DATA_8_BITS,
        .parity = uart->parity,
        .stop_bits = UART_STOP_BITS_1,
        .flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
        .source_clk = UART_SCLK_APB,
    };
  
    
    ESP_LOGW(TAG, "REGISTER NORMAL UART PORT: %d", uart->uart_port);

    /* Install UART driver without interrupt enabled */
    if (!uart_is_driver_installed(uart->uart_port))
    {
        ret = uart_driver_install(uart->uart_port, BUFFER_SIZE * 2, 0, 0, NULL, 0);
    }
    

    if (ret != ESP_OK)
    {
        ret_val = -UART_DRIVER_INSTAL_FAIL;
        ESP_LOGE(TAG, "UART DRIVER INSTALL FAILED %d", ret_val);
        return ret_val;
    }
    uart_param_config(uart->uart_port, &uart_config);
    if (ret != ESP_OK)
    {
        ret_val = -UART_PARAM_CONFIG_FAIL;
        ESP_LOGE(TAG, "UART PARAMETER CONFIGURATION FAILED %d", ret_val);
        return ret_val;
    }

    // Set UART pins (using UART0 default pins ie no changes.)
    uart_set_pin(uart->uart_port, uart->tx_pin, uart->rx_pin, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);

    /* Using Virtual File System */
    uart_vfs_dev_use_driver(uart->uart_port);

    uart_vfs_dev_port_set_rx_line_endings(uart->uart_port, ESP_LINE_ENDINGS_LF);

    return ret_val;
}


void get_uart_vfs_buffer(struct uart_config_t *uart, char *buf, int len)
{
    FILE *uart_file;
    uart_file = fopen(uart->vfs_name, "r");

    fgets(buf, len, uart_file);

    fclose(uart_file);
}

void app_main(void)
{
    struct uart_config_t uart_struct = {
        .baudrate = 115200,
        .parity = UART_PARITY_DISABLE,
        .uart_port = UART_NUM_0,
        .tx_pin = UART_PIN_NO_CHANGE,
        .rx_pin = UART_PIN_NO_CHANGE,
        .vfs_name = "/dev/uart/0",
    };

    while(1){
        char buf[BUFFER_SIZE] = {0};
        get_uart_vfs_buffer(&uart_struct, buf, 100);
        puts(buf); 
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
}
Thank you

Re: uart vfs not working in 5.4

Posted: Tue May 20, 2025 6:34 am
by Jojojojojohnson
Hi,
Just to clarify the rest of the data is lost fully, not just received in the next call to read?

I tried replicating your issue with the following code, but was unable to.

Does your code look something like this?

Code: Select all

#include <stdio.h>
#include <inttypes.h>
#include "hal/uart_types.h"
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_chip_info.h"
#include "esp_flash.h"
#include "esp_system.h"
#include "driver/uart.h"
#include "driver/uart_vfs.h"
#include "driver/gpio.h"
#include "esp_log.h"

#define BUFFER_SIZE 1024
#define UART_DRIVER_INSTAL_FAIL 1
#define UART_PARAM_CONFIG_FAIL 2

const char *TAG = "main";

struct uart_config_t {
    unsigned baudrate;
    uart_parity_t parity;
    uart_port_t uart_port;
    gpio_num_t tx_pin;
    gpio_num_t rx_pin;
    const char *vfs_name;
};

int uart_init(struct uart_config_t *uart)
{
    int ret_val = 0;
    esp_err_t ret = ESP_OK;

    /* Configure parameters of an UART driver,
     * communication pins and install the driver */
    uart_config_t uart_config = {
        .baud_rate = uart->baudrate,
        .data_bits = UART_DATA_8_BITS,
        .parity = uart->parity,
        .stop_bits = UART_STOP_BITS_1,
        .flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
        .source_clk = UART_SCLK_APB,
    };
  
    
    ESP_LOGW(TAG, "REGISTER NORMAL UART PORT: %d", uart->uart_port);

    /* Install UART driver without interrupt enabled */
    if (!uart_is_driver_installed(uart->uart_port))
    {
        ret = uart_driver_install(uart->uart_port, BUFFER_SIZE * 2, 0, 0, NULL, 0);
    }
    

    if (ret != ESP_OK)
    {
        ret_val = -UART_DRIVER_INSTAL_FAIL;
        ESP_LOGE(TAG, "UART DRIVER INSTALL FAILED %d", ret_val);
        return ret_val;
    }
    uart_param_config(uart->uart_port, &uart_config);
    if (ret != ESP_OK)
    {
        ret_val = -UART_PARAM_CONFIG_FAIL;
        ESP_LOGE(TAG, "UART PARAMETER CONFIGURATION FAILED %d", ret_val);
        return ret_val;
    }

    // Set UART pins (using UART0 default pins ie no changes.)
    uart_set_pin(uart->uart_port, uart->tx_pin, uart->rx_pin, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);

    /* Using Virtual File System */
    uart_vfs_dev_use_driver(uart->uart_port);

    uart_vfs_dev_port_set_rx_line_endings(uart->uart_port, ESP_LINE_ENDINGS_LF);

    return ret_val;
}


void get_uart_vfs_buffer(struct uart_config_t *uart, char *buf, int len)
{
    FILE *uart_file;
    uart_file = fopen(uart->vfs_name, "r");

    fgets(buf, len, uart_file);

    fclose(uart_file);
}

void app_main(void)
{
    struct uart_config_t uart_struct = {
        .baudrate = 115200,
        .parity = UART_PARITY_DISABLE,
        .uart_port = UART_NUM_0,
        .tx_pin = UART_PIN_NO_CHANGE,
        .rx_pin = UART_PIN_NO_CHANGE,
        .vfs_name = "/dev/uart/0",
    };

    while(1){
        char buf[BUFFER_SIZE] = {0};
        get_uart_vfs_buffer(&uart_struct, buf, 100);
        puts(buf); 
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
}
Thank you

Hi yes this is what i mostly have. Im using the uart port 2 of the esp32wrrom-32. baudrate at 50000, but i have also tried at 115200 still getting the same results.

my headers actually,

Code: Select all

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_log.h"
#include "driver/uart_vfs.h"
#include "driver/uart.h"
#include <stdio.h>
i read the data in the vfs as per the line ending specified in the configuration.

I will get the lines form the get_uart_vfs_buffer() but the data is always incomplete.
example: expected: hello world
actual: hel wrld

To answer your question, no, the remaining data is not in the next call.

Re: uart vfs not working in 5.4

Posted: Wed Jun 11, 2025 7:49 am
by rpasichnyk
Looks like the issue has been fixed in the release/v5.4 branch and will be included in the next v5.4.x release.

https://github.com/espressif/esp-idf/co ... 4acf1ebac2
https://github.com/espressif/esp-idf/co ... d2f5d000fd
https://github.com/espressif/esp-idf/co ... e3af1079fe

Re: uart vfs not working in 5.4

Posted: Thu Jun 19, 2025 1:34 am
by Jojojojojohnson
I have tried the espidf on the 5.4 release branch, still the same issue. the uart vfs data is still incomplete.