这是我在这里的第一篇文章,所以如果我做错了什么,请告诉我。我正在尝试在 ESP32S3 上创建基于中断的 UART 接收任务。这应该很简单,但不幸的是,我遇到了一个问题。当我在 Visual Studio Code 中结合 Espressif IDE 编译代码时,出现以下错误:“隐式声明函数‘uart_isr_register’;您的意思是‘gpio_isr_register’吗?”据我所知,此错误通常在找不到库时发生。不过,我已将其包含在“#include“driver/uart.h”行中,如果我查看定义,它会在 UART 代码中完美找到它。”
在我包含的库下面:
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_log.h"
#include "driver/uart.h"
#include "string.h"
#include "driver/gpio.h"
#include "stdbool.h"
#include "esp_attr.h"
这里是发生错误的函数:
void serialComInit(void){
const uart_config_t uart_config = {
.baud_rate = 115200,
.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_DEFAULT,
};
// We won't use a buffer for sending data.
struct receiveDataObj rxObject[1];
uart_param_config(UART_NUM_1, &uart_config);
uart_set_pin(UART_NUM_1, TXD_PIN, RXD_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
uart_driver_install(UART_NUM_1, RX_BUF_SIZE * 2, 0, 0, NULL, 0);
uart_isr_register(UART_NUM_1, uart_rx_intr_handler, rxObject, ESP_INTR_FLAG_IRAM, NULL);
uart_enable_rx_intr(UART_NUM_1);
}
其指向的函数如下所示:
void IRAM_ATTR uart_rx_intr_handler(struct receiveDataObj *rxPtr){
static const char *RX_TASK_TAG = "RX_TASK";
esp_log_level_set(RX_TASK_TAG, ESP_LOG_INFO);
uint8_t* data = (uint8_t*) malloc(RX_BUF_SIZE+1);
while (1) {
rxPtr->rxBytes = uart_read_bytes(UART_NUM_1, data, RX_BUF_SIZE, portMAX_DELAY);
if (rxPtr->rxBytes > 0) {
data[rxPtr->rxBytes] = 0;
rxPtr->incomingData = (char*)malloc(rxPtr->rxBytes + 1);
if (rxPtr->incomingData) {
memcpy(rxPtr->incomingData, data, rxPtr->rxBytes);
rxPtr->incomingData[rxPtr->rxBytes] = '\0'; // Null-terminate the string
}
ESP_LOGI(RX_TASK_TAG, "Read %d bytes: '%s'", rxPtr->rxBytes, data);
//ESP_LOG_BUFFER_HEXDUMP(RX_TASK_TAG, data, rxBytes, ESP_LOG_INFO);
if(strstr(rxPtr->incomingData, "+CMQTTRXSTART:") != NULL ){
ESP_LOGI("COMS","RECEIVED MQTT COMMAND");
mqttCommand = true;
}
}
}
free(data);
}
我尝试过将函数放在不同的文件中。我已经添加了 ifndef 的。排除了 gpio 库,但这只会导致错误“您是说 ledc_isr_register 吗?”所以我现在不知道该怎么办。
错误“隐式声明函数”发生在声明函数之前调用函数时,而不是“找不到库”时。声明可以在使用该函数之前在您自己的代码中或在头文件中完成。
您期望
uart_isr_register()
在 drivers/uart.h
中声明 - 但事实并非如此。
您可以通过查看该文件的内容来确认这一点。 ESP-IDF 是开源的,因此您可以在其 Github 存储库中检查该文件。
根据 ESP-IDF 的文档,在 ESP-IDF 5.0 中已删除,因为 UART 驱动程序现在注册中断本身。您可以通过在存储库中搜索
uart_isr_register
轻松找到它。解决方案就是删除这行代码,因为不再需要它。