爱编程的小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日

悬赏问题

  • ¥30 电脑误删了手机的照片怎么恢复?
  • ¥15 (标签-python|关键词-char)
  • ¥15 python+selenium,在新增时弹出了一个输入框
  • ¥15 苹果验机结果的api接口哪里有??单次调用1毛钱及以下。
  • ¥20 学生成绩管理系统设计
  • ¥15 来一个cc穿盾脚本开发者
  • ¥15 CST2023安装报错
  • ¥15 使用diffusionbert生成文字 结果是PAD和UNK怎么办
  • ¥15 有人懂怎么做大模型的客服系统吗?卡住了卡住了
  • ¥20 firefly-rk3399上启动卡住了