爱编程的小didi 2023-06-21 10:42 采纳率: 20%
浏览 8
已结题

ESP8266 rtos中,串口日志打印和串口发送数据的问题?

为什么ESP8266 RTOS中,串口打印日志ESP_LOGI要比串口发送uart_write_bytes要优先?
比如在如下任务中:

static void uart_event_task(void *pvParameters)
{
    uart_event_t event;
    uint8_t *dtmp = (uint8_t *) malloc(RD_BUF_SIZE);

    for (;;) {
        // Waiting for UART event.
        if (xQueueReceive(uart0_queue, (void *)&event, (portTickType)portMAX_DELAY)) {
            bzero(dtmp, RD_BUF_SIZE);
            ESP_LOGI(TAG, "uart[%d] event:", EX_UART_NUM);

            switch (event.type) {
                // Event of UART receving data
                // We'd better handler data event fast, there would be much more data events than
                // other types of events. If we take too much time on data event, the queue might be full.
                case UART_DATA:
                    ESP_LOGI(TAG, "[UART DATA]: %d", event.size);
                   // uart_read_bytes(EX_UART_NUM_1, dtmp, event.size, portMAX_DELAY);

                    uart_read_bytes(EX_UART_NUM, dtmp, event.size, portMAX_DELAY);
                    ESP_LOGI(TAG, "[DATA EVT]:");
                    uart_write_bytes(EX_UART_NUM, (const char *) dtmp, event.size);
                    ESP_LOGI(TAG, "[DATA EVT1111111]:");

                    break;

                // Event of HW FIFO overflow detected
                case UART_FIFO_OVF:
                    ESP_LOGI(TAG, "hw fifo overflow");
                    // If fifo overflow happened, you should consider adding flow control for your application.
                    // The ISR has already reset the rx FIFO,
uart_flush_input(EX_UART_NUM);
                    xQueueReset(uart0_queue);
                    break;

                // Event of UART ring buffer full
                case UART_BUFFER_FULL:
                    ESP_LOGI(TAG, "ring buffer full");
                    // If buffer full happened, you should consider encreasing your buffer size
                    // As an example, we directly flush the rx buffer here in order to read more data.
                    uart_flush_input(EX_UART_NUM);
                    xQueueReset(uart0_queue);
                    break;

                case UART_PARITY_ERR:
                    ESP_LOGI(TAG, "uart parity error");
                    break;

                // Event of UART frame error
                case UART_FRAME_ERR:
                    ESP_LOGI(TAG, "uart frame error");
                    break;

                // Others
                default:
                    ESP_LOGI(TAG, "uart event type: %d", event.type);
                    break;
            }
        }
    }

    free(dtmp);
    dtmp = NULL;
    vTaskDelete(NULL);
}

当我发送如下数据时

img

发现日志打印都是先打印的,但是如果按照函数,日志信息的打印和我发送的数据应该是交叉的,为什么是把所有日志信息打印出来后,再打印我发送的数据呢?

  • 写回答

2条回答 默认 最新

  • 泡沫o0 2023年度博客之星上海赛道TOP 1 2023-06-21 10:55
    关注

    这个问题可能是由于ESP_LOGI和uart_write_bytes的不同实现方式导致的。这两个函数可能在不同的优先级环境中运行,或者他们可能使用不同的缓冲机制。

    ESP_LOGI函数可能立即将日志信息写入到输出设备(例如串口或文件),而uart_write_bytes可能将要发送的数据首先放入一个队列或缓冲区,然后由另一个线程或任务在适当的时候发送出去。因此,ESP_LOGI的日志输出可能会比uart_write_bytes的数据发送更早出现。

    另外,ESP_LOGI可能会立即触发中断并直接将日志写入UART,而uart_write_bytes可能会等待DMA或其他硬件资源可用。

    这只是可能的解释,实际的情况可能会因硬件、RTOS配置、驱动程序等因素而有所不同。如果你需要更详细的信息,可能需要查看ESP8266 RTOS和相关驱动程序的源代码,以了解这两个函数的具体实现方式。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月29日
  • 已采纳回答 6月21日
  • 创建了问题 6月21日

悬赏问题

  • ¥15 有偿求指导实证代码。cfps清洗合并后,无论是构建平衡面板还是非平衡面板,都是只剩几百个样本量。求指导一下哪里出问题了,不要潦草回复
  • ¥15 mutlinichenet
  • ¥50 Qt5.14.2怎样使用qlistwidget存储指针类数据并更新?
  • ¥15 STM32多路复用器ADC采样
  • ¥20 Linux(ubuntu)操作相关问题
  • ¥15 python深度学习代码求跑
  • ¥100 对接美团闪购医药接口相关问题
  • ¥15 嵌入式软件电子烟开发
  • ¥15 职场 Excel 查重问题
  • ¥15 求怎么用idea2021.3.2创建web项目并配置tomcat