函数“uart_isr_register”的隐式声明,尽管包含库和espressif看到该函数并且可以向我显示定义

问题描述 投票:0回答:1

这是我在这里的第一篇文章,所以如果我做错了什么,请告诉我。我正在尝试在 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 吗?”所以我现在不知道该怎么办。

visual-studio-code include esp32 uart espressif-idf
1个回答
0
投票

错误“隐式声明函数”发生在声明函数之前调用函数时,而不是“找不到库”时。声明可以在使用该函数之前在您自己的代码中或在头文件中完成。

您期望

uart_isr_register()
drivers/uart.h
中声明 - 但事实并非如此。

您可以通过查看该文件的内容来确认这一点。 ESP-IDF 是开源的,因此您可以在其 Github 存储库中检查该文件。

根据 ESP-IDF 的文档,在 ESP-IDF 5.0 中已删除,因为 UART 驱动程序现在注册中断本身。您可以通过在存储库中搜索

uart_isr_register
轻松找到它。解决方案就是删除这行代码,因为不再需要它。

© www.soinside.com 2019 - 2024. All rights reserved.