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
相关产品推荐
相关产品推荐

