ESP32 在 IDF v5.3.1版本下实现TCP 客户端(Client)驱动代码(稳定)

实现效果:客户端收到什么就原封不动返回给服务端

网路调试助手下载:

【免费】NetAssist-V5.0.2资源-CSDN文库https://download.csdn.net/download/qq_34885669/90427558

一、ESP32 实现TCP Client 期准备

  1. NVS 初始化:为 WiFi 模块提供配置存储。
  2. 网络接口初始化:调用 esp_netif_init()esp_event_loop_create_default(),为后续网络连接奠定基础。
  3. 创建默认网络接口:根据 STA 或 AP 模式创建对应的网络接口实例。
  4. WiFi 驱动初始化:调用 esp_wifi_init() 并配置 WiFi 模式及参数。
  5. 启动 WiFi:通过 esp_wifi_start() 启动 WiFi 模块,并利用事件回调获取 IP 地址。
  6. TCP/IP 协议栈启动:lwIP 初始化完成后,可以使用 socket API 实现 TCP 功能。

        完成上述准备后,ESP32 就能正常使用 TCP 协议进行数据传输了。确保每个步骤正确完成,是实现稳定网络通信的关键。     

        本文重点是实现TCP 客户端驱动代码,所以对于上面的WiFi和网络接口的初始化请参考我的其他2片博客:

ap模式:

ESP32 在IDF_V5.3.1版本下实现AP无线热点模式!(带WIFI事件处理)-CSDN博客https://blog.csdn.net/qq_34885669/article/details/145736280

sta模式:   

ESP32 在 IDF_V5.3.1 版本下实现 STA 模式!(带WIFI事件处理)-CSDN博客https://blog.csdn.net/qq_34885669/article/details/145747965

 二、TCP Client 驱动代码编写(AP模式为例) 

1.创建初始化AP模式的线程

        初始化AP模式,需要注意的点就是:一定要确保AP模式初始化完全成功后,才可以去创建TCP 客户端相关的任务!如下所示:

    xTaskCreate(wifi_ap_test, "wifi_sta_test", 4096, &apInitFlag, 4, NULL);
    while(!apInitFlag) //确保AP已经初始化成功,
    {
       delay_ms(10);
    }

         程序会一直等待AP模式初始化,直到AP模式完全初始化成功!(apInitFlag标志是以形参方式传进去的)

2.初始化并创建TCP 客户端


void lwip_tcp_client_init(const uint8_t *serverAddr,in_port_t serverPort)
{
    esp_err_t ret = 0;
    int32_t recv_data_len = 0;
    ESP_LOGI(TAG_TCP,"lwip_tcp_client_init: serverAddr=%s port=%d",serverAddr,serverPort);
start_tcpclientsocket:
    //创建socket套接字
    tcp_client_sock_fd = socket(AF_INET, SOCK_STREAM, 0);
    //设置服务器端的参数
    target_server_addrInfo.sin_family = AF_INET;
    target_server_addrInfo.sin_addr.s_addr = inet_addr(serverAddr);
    target_server_addrInfo.sin_port = htons(serverPort); //将16位主机字节序的端口号转换为网络字节序(32位就用htonl)
    //连接服务器
    ret = connect(tcp_client_sock_fd,(struct sockaddr *)&target_server_addrInfo,sizeof(struct sockaddr ));
    if(ret < 0) 
    {
        ESP_LOGE(TAG_TCP,"lwip_tcp_client_init: disconnected server! serverAddr=%s port=%d ret=%d",serverAddr,serverPort,ret);
        closesocket(tcp_client_sock_fd);
        delay_ms(1000);
        goto start_tcpclientsocket;
    }
    else if(ret == 0) 
    {
        clientTcpState |= 0x80;
        ESP_LOGI(TAG_TCP,"TCP Client connected Server ok ! serverAddr=%s port=%d",serverAddr,serverPort);
    }
    while(1)
    {
        if(clientTcpState & 0x80)
        {
            //memset(tcp_recvbuf,'\0',sizeof(tcp_recvbuf));
            recv_data_len = recv(tcp_client_sock_fd,(void *)tcp_recvbuf,sizeof(tcp_recvbuf),0);
            if(recv_data_len <= 0)
            {
                if(recv_data_len ==0)
                    ESP_LOGE(TAG_TCP,"Server closed the connection");
                else
                    ESP_LOGE(TAG_TCP,"socket error");
                closesocket(tcp_client_sock_fd);
                clientTcpState &= ~0x80;
                ESP_LOGE(TAG_TCP,"lwip_tcpClientRecvDataThread:Client disconnected server!(recv_data_len=%d)  clientTcpState=0x%X",recv_data_len,clientTcpState);
            }
            else if(recv_data_len > 0)
            {
                tcp_recvbuf[recv_data_len] = '\0';
                memcpy(tcp_sendbuf,tcp_recvbuf,recv_data_len);
                tcp_sendbuf[recv_data_len] = '\0';
                clientTcpState |= 0x40; //收到数据
                xSemaphoreGive(recvDataSem);
                //ESP_LOGI(TAG_TCP,"recvData=%s  len=%d",tcp_recvbuf,recv_data_len);
            }
        }
        else if(!(clientTcpState & 0x80))
        {
            closesocket(tcp_client_sock_fd);
            goto start_tcpclientsocket;
        }
        else
        {
            delay_ms(1);
        }
    }
    closesocket(tcp_client_sock_fd);
}

3.创建TCP发送数据处理任务线程

xTaskCreate(lwip_tcpClientSendDataThread, "lwip_tcpClientSendDataThread", 4096, NULL, LWIP_TCP_SEND_THREAD_PRIO, NULL);

         发送数据处理线程服务函数:


void lwip_tcpClientSendDataThread(void *pvParameters)
{
    esp_err_t ret = 0;
    while(1)
    {
        ret = xSemaphoreTake(recvDataSem,portMAX_DELAY);
        if(ret == pdPASS)
        {
            if(clientTcpState & 0x80) //
            {
                if(clientTcpState & 0x40) //
                {
                    clientTcpState &= ~0x40;
                    ret = sendto(tcp_client_sock_fd,tcp_sendbuf,strlen(tcp_sendbuf),0,(struct sockaddr *)&target_server_addrInfo,sizeof(target_server_addrInfo)); //发送接收的数据
                    if(ret < 0)
                    {
                        ESP_LOGE(TAG_TCP,"lwip_tcpClientSendDataThread:Client send data to server error! ret=%d",ret);
                        closesocket(tcp_client_sock_fd);
                        clientTcpState &= ~0x80;
                    }
                    else
                    {
                        memset(tcp_sendbuf,'\0',sizeof(tcp_sendbuf));
                        clientTcpState |= 0x20;
                    }           
                }
            }
        }
    }
    closesocket(tcp_client_sock_fd);
}

4.TCP Client 测试

        电脑连接上ESP32 创建的AP热点,确保电脑已经获取到IP

        然后使用网络调试助手,创建一个TCP Server 服务端,等待ESP32自动连接

随后便可以进行收发数据测试:

附录:完整的实现 ESP32 TCP Client 代码  

 bsp_tcpClient.h

#ifndef __BSP_TCP_CLIENT_H
#define __BSP_TCP_CLIENT_H

#include <string.h>
#include <sys/socket.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/event_groups.h"
#include "esp_wifi.h"
#include "esp_event.h"
#include "esp_log.h"

void tcp_client_test();

#endif

 bsp_tcpClent.c

#include "bsp_tcpClient.h"
#include "bsp_delay.h"
#include "bsp_wifi_ap.h"

const char *TAG_TCP = "BSP_TCP";

#define TCP_RX_BUFSIZE  1024*10    /* 最大接收数据长度 */
#define LWIP_TCP_SEND_THREAD_PRIO   ( tskIDLE_PRIORITY + 3 ) /* 发送数据线程优先级 */
#define LWIP_TCP_RECV_THREAD_PRIO   ( tskIDLE_PRIORITY + 2 ) /* 发送数据线程优先级 */

SemaphoreHandle_t recvDataSem;
socklen_t tcp_client_sock_fd;                
static struct  sockaddr_in local_server_addrInfo = {0};
static struct  sockaddr_in target_server_addrInfo = {0};
/* 接收数据缓冲区 */
uint8_t tcp_recvbuf[TCP_RX_BUFSIZE] = {0}; 
uint8_t tcp_sendbuf[TCP_RX_BUFSIZE] = {0}; 

//ESP32 tcp状态:bit7:是否成功连接服务器  bit6:是否收到服务端的数据  bit5:是否发送完数据到服务器 bit4:  bit3:    bit2:  bit1: bit0:
uint8_t clientTcpState = 0;

void lwip_tcp_client_init(const uint8_t *serverAddr,in_port_t serverPort)
{
    esp_err_t ret = 0;
    int32_t recv_data_len = 0;
    ESP_LOGI(TAG_TCP,"lwip_tcp_client_init: serverAddr=%s port=%d",serverAddr,serverPort);
start_tcpclientsocket:
    //创建socket套接字
    tcp_client_sock_fd = socket(AF_INET, SOCK_STREAM, 0);
    //设置服务器端的参数
    target_server_addrInfo.sin_family = AF_INET;
    target_server_addrInfo.sin_addr.s_addr = inet_addr(serverAddr);
    target_server_addrInfo.sin_port = htons(serverPort); //将16位主机字节序的端口号转换为网络字节序(32位就用htonl)
    //连接服务器
    ret = connect(tcp_client_sock_fd,(struct sockaddr *)&target_server_addrInfo,sizeof(struct sockaddr ));
    if(ret < 0) 
    {
        ESP_LOGE(TAG_TCP,"lwip_tcp_client_init: disconnected server! serverAddr=%s port=%d ret=%d",serverAddr,serverPort,ret);
        closesocket(tcp_client_sock_fd);
        delay_ms(1000);
        goto start_tcpclientsocket;
    }
    else if(ret == 0) 
    {
        clientTcpState |= 0x80;
        ESP_LOGI(TAG_TCP,"TCP Client connected Server ok ! serverAddr=%s port=%d",serverAddr,serverPort);
    }
    while(1)
    {
        if(clientTcpState & 0x80)
        {
            //memset(tcp_recvbuf,'\0',sizeof(tcp_recvbuf));
            recv_data_len = recv(tcp_client_sock_fd,(void *)tcp_recvbuf,sizeof(tcp_recvbuf),0);
            if(recv_data_len <= 0)
            {
                if(recv_data_len ==0)
                    ESP_LOGE(TAG_TCP,"Server closed the connection");
                else
                    ESP_LOGE(TAG_TCP,"socket error");
                closesocket(tcp_client_sock_fd);
                clientTcpState &= ~0x80;
                ESP_LOGE(TAG_TCP,"lwip_tcpClientRecvDataThread:Client disconnected server!(recv_data_len=%d)  clientTcpState=0x%X",recv_data_len,clientTcpState);
            }
            else if(recv_data_len > 0)
            {
                tcp_recvbuf[recv_data_len] = '\0';
                memcpy(tcp_sendbuf,tcp_recvbuf,recv_data_len);
                tcp_sendbuf[recv_data_len] = '\0';
                clientTcpState |= 0x40; //收到数据
                xSemaphoreGive(recvDataSem);
                //ESP_LOGI(TAG_TCP,"recvData=%s  len=%d",tcp_recvbuf,recv_data_len);
            }
        }
        else if(!(clientTcpState & 0x80))
        {
            closesocket(tcp_client_sock_fd);
            goto start_tcpclientsocket;
        }
        else
        {
            delay_ms(1);
        }
    }
    closesocket(tcp_client_sock_fd);
}


void lwip_tcpClientSendDataThread(void *pvParameters)
{
    esp_err_t ret = 0;
    while(1)
    {
        ret = xSemaphoreTake(recvDataSem,portMAX_DELAY);
        if(ret == pdPASS)
        {
            if(clientTcpState & 0x80) //
            {
                if(clientTcpState & 0x40) //
                {
                    clientTcpState &= ~0x40;
                    ret = sendto(tcp_client_sock_fd,tcp_sendbuf,strlen(tcp_sendbuf),0,(struct sockaddr *)&target_server_addrInfo,sizeof(target_server_addrInfo)); //发送接收的数据
                    if(ret < 0)
                    {
                        ESP_LOGE(TAG_TCP,"lwip_tcpClientSendDataThread:Client send data to server error! ret=%d",ret);
                        closesocket(tcp_client_sock_fd);
                        clientTcpState &= ~0x80;
                    }
                    else
                    {
                        memset(tcp_sendbuf,'\0',sizeof(tcp_sendbuf));
                        clientTcpState |= 0x20;
                    }           
                }
            }
        }
    }
    closesocket(tcp_client_sock_fd);
}

void tcp_client_test()
{
    uint8_t apInitFlag = 0;
    ESP_LOGI(TAG_TCP,"tcp_client_test");
    recvDataSem = xSemaphoreCreateBinary(); 
    xTaskCreate(wifi_ap_test, "wifi_sta_test", 4096, &apInitFlag, 4, NULL);
    while(!apInitFlag) //确保AP已经初始化成功,
    {
       delay_ms(10);
    }
    xTaskCreate(lwip_tcpClientSendDataThread, "lwip_tcpClientSendDataThread", 4096, NULL, LWIP_TCP_SEND_THREAD_PRIO, NULL);
    lwip_tcp_client_init((uint8_t *)"192.168.4.2",8080);
    
    while (1)
    {
        delay_ms(1000);
    }
    
}

附:ESP32 IDF v5.3.1版本下实现TCP 服务端

ESP32 IDF v5.3.1版本下实现TCP 服务端(Server)驱动代码(稳定可靠!支持多线程、多客户端同时连接)-CSDN博客https://blog.csdn.net/qq_34885669/article/details/145898833?sharetype=blogdetail&sharerId=145898833&sharerefer=PC&sharesource=qq_34885669&spm=1011.2480.3001.8118

-- Adding linker script C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/soc/esp32s3/ld/esp32s3.peripherals.ld CMake Error at main/CMakeLists.txt:36 (target_link_libraries): The plain signature for target_link_libraries has already been used with the target "__idf_main". All uses of target_link_libraries with a target must be either all-keyword or all-plain. The uses of the plain signature are here: * main/CMakeLists.txt:33 (target_link_libraries) -- Components: app_trace app_update bootloader bootloader_support bt cmock console cxx driver efuse esp-ppbuffer esp-tls esp_adc esp_app_format esp_bootloader_format esp_coex esp_common esp_driver_ana_cmpr esp_driver_cam esp_driver_dac esp_driver_gpio esp_driver_gptimer esp_driver_i2c esp_driver_i2s esp_driver_isp esp_driver_jpeg esp_driver_ledc esp_driver_mcpwm esp_driver_parlio esp_driver_pcnt esp_driver_ppa esp_driver_rmt esp_driver_sdio esp_driver_sdm esp_driver_sdmmc esp_driver_sdspi esp_driver_spi esp_driver_touch_sens esp_driver_tsens esp_driver_uart esp_driver_usb_serial_jtag esp_eth esp_event esp_gdbstub esp_hid esp_http_client esp_http_server esp_https_ota esp_https_server esp_hw_support esp_jpeg esp_lcd esp_local_ctrl esp_mm esp_netif esp_netif_stack esp_painter esp_partition esp_phy esp_pm esp_psram esp_ringbuf esp_rom esp_system esp_timer esp_vfs_console esp_wifi espcoredump esptool_py fatfs freertos hal heap http_parser idf_test ieee802154 json log lwip main mbedtls mqtt newlib nvs_flash nvs_sec_provider openthread partition_table perfmon protobuf-c protocomm pthread sdmmc soc spi_flash spiffs tcp_transport touch_element ulp unity usb vfs wear_levelling wifi_provisioning wpa_supplicant xtensa -- Component paths: C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/app_trace C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/app_update C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/bootloader C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/bootloader_support C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/bt C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/cmock C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/console C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/cxx C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/driver C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/efuse C:/Users/shang/Desktop/hello_opencv/components/esp-ppbuffer C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp-tls C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_adc C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_app_format C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_bootloader_format C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_coex C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_common C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_driver_ana_cmpr C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_driver_cam C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_driver_dac C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_driver_gpio C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_driver_gptimer C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_driver_i2c C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_driver_i2s C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_driver_isp C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_driver_jpeg C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_driver_ledc C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_driver_mcpwm C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_driver_parlio C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_driver_pcnt C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_driver_ppa C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_driver_rmt C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_driver_sdio C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_driver_sdm C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_driver_sdmmc C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_driver_sdspi C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_driver_spi C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_driver_touch_sens C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_driver_tsens C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_driver_uart C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_driver_usb_serial_jtag C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_eth C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_event C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_gdbstub C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_hid C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_http_client C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_http_server C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_https_ota C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_https_server C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_hw_support C:/Users/shang/Desktop/hello_opencv/components/esp_jpeg C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_lcd C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_local_ctrl C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_mm C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_netif C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_netif_stack C:/Users/shang/Desktop/hello_opencv/components/esp_painter C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_partition C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_phy C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_pm C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_psram C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_ringbuf C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_rom C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_system C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_timer C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_vfs_console C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esp_wifi C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/espcoredump C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/esptool_py C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/fatfs C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/freertos C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/hal C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/heap C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/http_parser C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/idf_test C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/ieee802154 C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/json C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/log C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/lwip C:/Users/shang/Desktop/hello_opencv/main C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/mbedtls C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/mqtt C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/newlib C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/nvs_flash C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/nvs_sec_provider C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/openthread C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/partition_table C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/perfmon C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/protobuf-c C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/protocomm C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/pthread C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/sdmmc C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/soc C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/spi_flash C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/spiffs C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/tcp_transport C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/touch_element C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/ulp C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/unity C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/usb C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/vfs C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/wear_levelling C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/wifi_provisioning C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/wpa_supplicant C:/ESP32IDF/Espressif/frameworks/esp-idf-v5.3.1/components/xtensa -- Configuring incomplete, errors occurred! See also "C:/Users/shang/Desktop/hello_opencv/build/CMakeFiles/CMakeOutput.log". cmake failed with exit code 1, output of the command is in the C:\Users\shang\Desktop\hello_opencv\build\log\idf_py_stderr_output_41508 and C:\Users\shang\Desktop\hello_opencv\build\log\idf_py_stdout_output_41508这个是什么错误
最新发布
06-05
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值