You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP32-S3中xQueueReceive断言失败问题求助(UART+LoRa模块)

解决ESP32 UART事件队列断言错误问题

问题根源

你的代码核心问题是队列句柄的传递方式错误:

  • init_uart函数的参数是QueueHandle_t uart_queue,这是C语言的值传递,函数内部的uart_queue只是全局变量的一个副本。
  • uart_driver_install调用时传入&uart_queue,修改的是这个局部副本的地址,全局的uart_queue变量始终是初始的NULL。
  • 当uart_task里用NULL的队列句柄调用xQueueReceive时,FreeRTOS的断言会触发,因为pxQueue参数不允许为空。

解决方案

修改init_uart的参数为队列句柄的指针,让函数能直接修改全局的队列句柄变量,确保uart_driver_install创建的队列句柄能被全局变量正确接收。

修改后的代码片段

rylr998.c 中的init_uart函数

void init_uart(QueueHandle_t *uart_queue) {
  uart_config_t uart_config = {
      .baud_rate = RYLR998_UART_BAUD_RATE,
      .data_bits = RYLR998_UART_DATA_BITS,
      .parity = RYLR998_UART_PARITY,
      .stop_bits = RYLR998_UART_STOP_BITS,
      .flow_ctrl = RYLR998_UART_FLOW_CTRL,
      .source_clk = RYLR998_UART_SOURCE_CLK,
  };
  // 直接传入指针,无需取地址,让uart_driver_install修改全局变量的值
  ESP_ERROR_CHECK(uart_driver_install(UART_NUM, BUF_SIZE, BUF_SIZE, 20, uart_queue, 0));
  ESP_ERROR_CHECK(uart_param_config(UART_NUM, &uart_config));
  ESP_ERROR_CHECK(uart_set_pin(UART_NUM, RYLR998_UART_TX_GPIO_NUM, RYLR998_UART_RX_GPIO_NUM, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE));
  ESP_LOGI(TAG, "UART Interface Configuration !!!COMPLETED!!!");
}

main.c 中的调用与任务代码

QueueHandle_t uart_queue;

void app_main(void) {
  // 传入全局队列句柄的地址,让init_uart能修改它
  init_uart(&uart_queue);
  vTaskDelay(pdMS_TO_TICKS(50));
  xTaskCreate(uart_task, "uart_task", TASK_MEMORY * 2, NULL, 12, NULL);
}

void uart_task(void *pvParameters) {
  uart_event_t event;
  uint8_t *incoming_uart_data = (uint8_t *)malloc(BUF_SIZE);
  ESP_LOGW(TAG, "!!!DEBUGGING!!! ENTERING 'uart_task'");
  while (1) {
    // 现在uart_queue已经是有效的队列句柄,不会触发断言
    if (xQueueReceive(uart_queue, (void *)&event, (TickType_t)portMAX_DELAY)) {
      // 事件处理逻辑
    }
  }
  // 资源释放
  free(incoming_uart_data);
  vTaskDelete(NULL);
}

额外注意事项

  • 确保UART_NUM、BUF_SIZE等宏定义是正确的,对应RYLR998模块的UART端口。
  • 任务结束时记得释放动态分配的内存并删除任务,避免内存泄漏。

内容的提问来源于stack exchange,提问作者Andy Duarte

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 21:22:44