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好很多,说明应该不一定是硬件的问题。希望老师帮忙看一下,帮助分析一下问题所在,谢谢。