ESP32S3 IDF串口用9600接收到数据后即刻发送数据,之间存在10mS的间隔的问题

ESP32S3,freeRTOS下串口用9600接收到数据后即刻发送数据,之间存在10mS的间隔的问题,这个问题想了很久,实验的很多次,都是存在这个问题,还请高手帮忙解决,也可能是我自己的问题,一下子没想出来问题出在哪里:
在这里插入图片描述
上图就是ESP32S3在VSCODE IDF程序下,串口9600下收到即刻发送的串口数据逻辑分析仪看到的数据,收到数据后过了10ms才发送。
用同样的硬件在Arduino写一个串口程序,在9600下延时时间好不少,看下面图片
在这里插入图片描述
在Arduino下面这个时间差在2mS左右,好很多。
然后在STM32,也是freeRTOS下,就非常的好,看图
在这里插入图片描述
看STM32的情况,实在太好了,几乎不存在延时的情况,这样对串口通信的时间效率提高很多的,每秒的刷新了可以高很多。
相同的情况,在STC芯片也有过测试,也是非常快的,没有截图。
ESP32S3的程序如下:


```c
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/uart.h"
#include "driver/gpio.h"
#include "sdkconfig.h"
#include "esp_log.h"

#define ECHO_TEST_TXD (CONFIG_EXAMPLE_UART_TXD)
#define ECHO_TEST_RXD (CONFIG_EXAMPLE_UART_RXD)
#define ECHO_TEST_RTS (UART_PIN_NO_CHANGE)
#define ECHO_TEST_CTS (UART_PIN_NO_CHANGE)

#define ECHO_UART_PORT_NUM      (CONFIG_EXAMPLE_UART_PORT_NUM)
#define ECHO_UART_BAUD_RATE     (CONFIG_EXAMPLE_UART_BAUD_RATE)
#define ECHO_TASK_STACK_SIZE    (CONFIG_EXAMPLE_TASK_STACK_SIZE)

static const char *TAG = "UART TEST";

#define BUF_SIZE (1024)

static void echo_task(void *arg)
{
    /* Configure parameters of an UART driver,
     * communication pins and install the driver */
    uart_config_t uart_config = {
        .baud_rate = ECHO_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(ECHO_UART_PORT_NUM, BUF_SIZE * 2, 0, 0, NULL, intr_alloc_flags));
    ESP_ERROR_CHECK(uart_param_config(ECHO_UART_PORT_NUM, &uart_config));
    ESP_ERROR_CHECK(uart_set_pin(ECHO_UART_PORT_NUM, ECHO_TEST_TXD, ECHO_TEST_RXD, ECHO_TEST_RTS, ECHO_TEST_CTS));

    // Configure a temporary buffer for the incoming data
    uint8_t *data = (uint8_t *) malloc(5);

    while (1) {
        // Read data from the UART
        int len = uart_read_bytes(ECHO_UART_PORT_NUM, data, (5), 0 / portTICK_RATE_MS);
        // Write data back to the UART
        uart_write_bytes(ECHO_UART_PORT_NUM, (const char *) data, len);
        if (len) {
            data[len] = '\0';
            //ESP_LOGI(TAG, "Recv str: %s", (char *) data);
            uint8_t data[5] = {'A','B','C','D','E'};
                    uart_write_bytes(ECHO_UART_PORT_NUM, (const char *) data, 5);
            uint8_t data1[5] = {'1','2','3','4','5'};
                    uart_write_bytes(ECHO_UART_PORT_NUM, (const char *) data1, 5);
            uint8_t data2[5] = {'a','c','d','e','f'};
                    uart_write_bytes(ECHO_UART_PORT_NUM, (const char *) data2, 5);

        }
        vTaskDelay(1 / portTICK_PERIOD_MS);
    }
}

void app_main(void)
{
    xTaskCreate(echo_task, "uart_echo_task", ECHO_TASK_STACK_SIZE, NULL, 10, NULL);
}

这样的程序是在示例程序简单改了一下,从收到数据即可发送之间就是存在10ms的延时,这对实际使用存在很大的问题,但在Arduino好很多,说明应该不一定是硬件的问题。希望老师帮忙看一下,帮助分析一下问题所在,谢谢。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值