好吧,碰到问题只能自己解决,把所有代码 文档走一遍

好讨厌啊,只想要个小小功能,要学着要学那

算了底层都一样就那几种 

异常与处理   不同版本间API不同(选择相应版本IDF5.4 文档5.4);2CMAKELISTS.TXT 添加依赖,3SDKCONFIG 打开相应的功能

​​​​​​​

对着文档写即可,错误了对照示例 

新建 工程 

工程名(文件夹:exam1)

        CMakeLists.txt(版本信息,工具路径)

        main(文件夹)

                文件(exam1.c)

                CMakeLists.txt

最小模式 (idf.py create-object 项目名)

两个文件夹,两个CMAKELIST.TXT 一个主文件 

CMakeLists.txt
        cmake_minimum_required(VERSION 3.16)

        include($ENV{IDF_PATH}/tools/cmake/project.cmake)
        project(hello)

CMakeLists.txt

        idf_component_register(SRCS "hello.c")

编辑  - 运行 -监视 

idf.py build  flash monitor 

示例代码 - 文档 - 

串口打印输出 hello(支持标准库 fgets getopt (v)

#include <stdio.h>
#include "freertos/FreeRTOS.h"
void app_main(void)
{
    while(1){
        printf("hello");
        vTaskDelay(pdMS_TO_TICKS(200));  //延时函数 sleep
    }
    
    
}

 gpio(v)

#include <stdio.h>  
#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
void app_main(void)
{
    printf("gpio test");
    gpio_config_t io_cfg = {
        .intr_type = GPIO_INTR_DISABLE,
        .mode = GPIO_MODE_OUTPUT,
        .pin_bit_mask = 1ULL<<2,
        .pull_down_en = 0,
        .pull_up_en = 0,
    
    };
    gpio_config(&io_cfg);

    while(1){
         gpio_set_level(2,1);
         vTaskDelay(pdMS_TO_TICKS(200));
         gpio_set_level(2,0);
         vTaskDelay(pdMS_TO_TICKS(200));
         

    }
   

    
}
 
//CMakeLists.txt 添加  REQUIRES esp_driver_gpio

idf_component_register(SRCS "gpiotest.c"
	REQUIRES esp_driver_gpio)
// uart_repl_example_main
 esp_rom_gpio_connect_out_signal(DEFAULT_UART_RX_PIN, UART_PERIPH_SIGNAL(1, SOC_UART_TX_PIN_IDX), false, false);

    esp_rom_gpio_connect_in_signal(DEFAULT_UART_RX_PIN, UART_PERIPH_SIGNAL(0, SOC_UART_RX_PIN_IDX), false);

I2C(

#include <stdio.h>
#include <stdint.h>
#include "freertos/FREERTOS.h"
//#include "driver/i2c_master.h"
#include "driver/i2c_master.h"
//#include "clk_tree_defs.h"

void  app_main()
{
    i2c_master_bus_handle_t handle;
    i2c_master_bus_config_t m_config = {
        .clk_source = I2C_CLK_SRC_DEFAULT,
        .i2c_port = 0,
        .scl_io_num = 11,
        .sda_io_num = 12,
        .glitch_ignore_cnt = 7,
        .flags.enable_internal_pullup = true,
    };
    i2c_new_master_bus(&m_config,&handle);

    i2c_device_config_t dev_cfg = {
        .dev_addr_length = I2C_ADDR_BIT_LEN_7,
        .device_address = 0x58,
        .scl_speed_hz = 10000,

    };
    i2c_master_dev_handle_t dev_handle;
    i2c_master_bus_add_device(handle,&dev_cfg,&dev_handle);

    uint8_t data = 10;
    i2c_master_transmit(dev_handle,&data,1,-1);
    
    i2c_master_bus_rm_device(dev_handle);
    i2c_del_master_bus(handle);

}


//CMakeLists.txt
idf_component_register(SRCS "i2ctest.c"
                    INCLUDE_DIRS ".")

ADC(c)

//idf5.4
// examples\peripherals\dac\dac_oneshot\main\dac_oneshot_example_main.c 
//https://docs.espressif.com/projects/esp-idf/zh_CN/v5.4.2/esp32/api-reference/peripherals/dac.html

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "esp_adc/adc_oneshot.h"

//ADC_CHANNEL_8   // GPIO25, same as DAC channel 0
//ADC_CHANNEL_9   // GPIO26, same as DAC channel 1


void app_main()
{
  
    adc_oneshot_unit_handle_t hadc1;
    adc_oneshot_unit_init_cfg_t init_cfg = {
        .unit_id= ADC_UNIT_1,
    };
    ESP_ERROR_CHECK(adc_oneshot_new_unit(&init_cfg,&hadc1));

    adc_oneshot_chan_cfg_t cfg = {
        .atten = ADC_ATTEN_DB_12,
        .bitwidth = ADC_BITWIDTH_DEFAULT,
    };
    
    adc_oneshot_config_channel(hadc1,ADC_CHANNEL_8,&cfg);

    int data;
    while(1)
    {
        ESP_ERROR_CHECK(adc_oneshot_read(hadc1,ADC_CHANNEL_8,&data));
        printf("%d\n",data);

        vTaskDelay(pdMS_TO_TICKS(200));

    }


}

DAC

//
#include <stdio.h>
#include "driver/dac_oneshot.h"
#include "freertos/FreeRTOS.h"


// DAC_CHAN_0 = 0,     /*!< DAC channel 0 is GPIO25(ESP32) / GPIO17(ESP32S2) */
// DAC_CHAN_1 = 1,     /*!< DAC channel 1 is GPIO26(ESP32) / GPIO18(ESP32S2) */


void app_main(void)
{
    dac_oneshot_handle_t handle;
    dac_oneshot_config_t cfg={
        .chan_id = DAC_CHAN_0,
        //.ulp_mode = false;
    };

    
    dac_oneshot_new_channel(&cfg,&handle);

    for(;;)
    for(int val=0;val<250;val++)
    {
        dac_oneshot_output_voltage(handle,val);
        vTaskDelay(10/portTICK_PERIOD_MS);

    }

}

PWM 

//

TOUCH (touch_sens.h only idf5.5  ; touch sensor idf 5.4

#include <stdio.h>
#include <freertos/FreeRTOS.h>
#include "driver/touch_sensor.h"
//#include "driver/touch_sens.h"  //5.5 not for 5.4



#define TOUCH_THRESH_NO_USE  0
#define TOUCHPAD_FILTER_TOUCH_PEROID 10
#define TOUCH_NUM  2

void app_main(void )
{
    uint32_t data;
    uint16_t fvalue;
    
    touch_pad_init();
    touch_pad_set_voltage(TOUCH_HVOLT_2V7,TOUCH_LVOLT_0V5,TOUCH_HVOLT_ATTEN_1V);


    touch_pad_config(2);


    //touch_pad_filter_start(TOUCHPAD_FILTER_TOUCH_PEROID);

    while(1)
    {
        touch_pad_read_raw_data(2,&data);
        //touch_pad_read_filtered(2,&fvalue);
        //printf("raw %d filter: %d",data,fvalue);
        //touch_pad_read(TOUCH_NUM,&fvalue);


        vTaskDelay(pdMS_TO_TICKS(100));

    }




}

uart (连接IO 22 ->23 )

//
#include <stdio.h>
#include <string.h>
#include "esp_log.h"
#include "driver/uart.h"

// connect io  22 ->23 

void app_main(void)
{
    int uart_buff_size = 2048;
   // QueueHandle_t uart_queue;
    uart_driver_install(UART_NUM_2,uart_buff_size,0,0,NULL,0);

    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,
    };

    uart_param_config(UART_NUM_2,&uart_config);
    uart_set_pin(UART_NUM_2,22,23,-1,-1);

    char *str = "test string\n";
    char in_str[200];
    while(1)
    {
        uart_write_bytes(UART_NUM_2,str,strlen(str));
        
        int len = uart_read_bytes(UART_NUM_2,in_str,199,20/portTICK_PERIOD_MS);
        in_str[len] = '\0';
        ESP_LOGI("uart recv","%s",in_str);

        
    }

    //uart_driver_delete();

temperature(only support  esp p4  readme.txt 

 

nvs(V) blob   unsize binary data  :nvs document esp32

#include <stdio.h>
#include <freertos/FreeRTOS.h>
#include <driver/i2s_std.h>
#include "nvs_flash.h"

void app_main()
{
    nvs_handle_t hnvs; 
    nvs_flash_init();
    nvs_open("storage",NVS_READWRITE,&hnvs); 

    //int32_t restart_count = 0;
    int32_t data = 0;
    nvs_set_i32(hnvs,"data",32);
    
    nvs_get_i32(hnvs,"data",&data);
    printf(" %ld\n",data);
    

    nvs_close(hnvs);




}

I2S

#include <stdio.h>
#include <freertos/FreeRTOS.h>
#include <driver/i2s_std.h>

#define SPK_BCLK  4
#define SPK_WS 5
#define SPK_DOUT 18

#define MIC_BCLK 22
#define MIC_WS 23
#define MIC_DIN 26

i2s_chan_handle_t rx_chan,tx_chan;
uint32_t rbuf[1024];

void app_main()
{

    //----------------------------RX
    i2s_chan_config_t rx_chan_cfg = I2S_CHANNEL_DEFAULT_CONFIG(I2S_NUM_0,I2S_ROLE_MASTER);
    i2s_new_channel(&rx_chan_cfg,NULL,&rx_chan);

    i2s_std_config_t  rx_cfg = {
        .clk_cfg = I2S_STD_CLK_DEFAULT_CONFIG(44100),

        .slot_cfg = I2S_STD_MSB_SLOT_DEFAULT_CONFIG(I2S_DATA_BIT_WIDTH_16BIT,I2S_SLOT_MODE_MONO),
    
        .gpio_cfg = {
            .mclk = I2S_GPIO_UNUSED,
            .dout= I2S_GPIO_UNUSED,
            .bclk = MIC_BCLK,
            .ws = MIC_WS,
            .din = MIC_DIN,
            .invert_flags = {
                false,false,false,
            },
            

        },

        
        
    };
    rx_cfg.slot_cfg.slot_mask = I2S_STD_SLOT_LEFT;
    i2s_channel_init_std_mode(rx_chan,&rx_cfg);
    
    i2s_channel_enable(rx_chan);

    //----------------------------TX
    i2s_chan_config_t tx_chan_cfg = I2S_CHANNEL_DEFAULT_CONFIG(I2S_NUM_1,I2S_ROLE_MASTER);
    i2s_new_channel(&tx_chan_cfg,&tx_chan,NULL);

    i2s_std_config_t  tx_cfg = {
              .clk_cfg = I2S_STD_CLK_DEFAULT_CONFIG(44100),

        .slot_cfg = I2S_STD_MSB_SLOT_DEFAULT_CONFIG(I2S_DATA_BIT_WIDTH_16BIT,I2S_SLOT_MODE_MONO),
    
        .gpio_cfg = {
            .mclk = I2S_GPIO_UNUSED,
            .dout= I2S_GPIO_UNUSED,
            .bclk = SPK_BCLK,
            .ws = SPK_WS,
            .din = SPK_DOUT,
            .invert_flags = {
                false,false,false,
            },
        },
    };

    tx_cfg.slot_cfg.slot_mask = I2S_STD_SLOT_LEFT;
    i2s_channel_init_std_mode(tx_chan,&tx_cfg);

    i2s_channel_enable(tx_chan);

          size_t r_bytes =0;
          size_t w_bytes = 0;
    while(1)
    {

        i2s_channel_read(rx_chan,rbuf,1024,&r_bytes,1000);
        i2s_channel_write(tx_chan,rbuf,r_bytes,&w_bytes,1000);
        
    }
    

}

BLUETOOTH (依赖项与menuconfig 

#include <stdint.h>
#include <string.h>
#include <inttypes.h>
#include "esp_log.h"

#include "nvs.h"
#include "nvs_flash.h"

#include "esp_bt.h"
#include "esp_bt_main.h"
#include "esp_bt_device.h"
#include "esp_gap_bt_api.h"
#include "esp_log_buffer.h"

#include <freertos/FreeRTOS.h>

static bool get_name_from_eir(uint8_t *eir, char *bdname, uint8_t *bdname_len);

char *SPP_TAG = "gap";



esp_bd_addr_t peer_bd_addr = {0};
static uint8_t peer_bdname_len;
static char peer_bdname[ESP_BT_GAP_MAX_BDNAME_LEN + 1];

void bt_app_gap_cb(esp_bt_gap_cb_event_t event,esp_bt_gap_cb_param_t *param)
{ //HFP FP spp initor EXAMPLE 

    switch (event)
    {
    case ESP_BT_GAP_DISC_RES_EVT:  //DISCOVER RESULT EVENT 
    ESP_LOG_BUFFER_HEX("LOG_TAG", param->disc_res.bda, ESP_BD_ADDR_LEN);
    ESP_LOGI(SPP_TAG, "ESP_BT_GAP_DISC_RES_EVT");
    ESP_LOG_BUFFER_HEX(SPP_TAG, param->disc_res.bda, ESP_BD_ADDR_LEN);
        /* Find the target peer device name in the EIR data */
        for (int i = 0; i < param->disc_res.num_prop; i++){
            if (param->disc_res.prop[i].type == ESP_BT_GAP_DEV_PROP_EIR
                && get_name_from_eir(param->disc_res.prop[i].val, (char*)peer_bdname, &peer_bdname_len)){
                ESP_LOG_BUFFER_CHAR(SPP_TAG, peer_bdname, peer_bdname_len);
                // if (strlen(remote_device_name) == peer_bdname_len
                //     && strncmp(peer_bdname, remote_device_name, peer_bdname_len) == 0) {
                //     memcpy(peer_bd_addr, param->disc_res.bda, ESP_BD_ADDR_LEN);
                //     /* Have found the target peer device, cancel the previous GAP discover procedure. And go on
                //      * dsicovering the SPP service on the peer device */
                //     esp_bt_gap_cancel_discovery();
                    
                  //  esp_spp_start_discovery(peer_bd_addr);
                }
            }
        

    // for (int i = 0; i < param->disc_res.num_prop; i++){
    //             if (param->disc_res.prop[i].type == ESP_BT_GAP_DEV_PROP_EIR
                  
    //                 && get_name_from_eir(param->disc_res.prop[i].val, peer_bdname, &peer_bdname_len)){
    //                 if (strcmp(peer_bdname, remote_device_name) == 0) {
    //                     memcpy(peer_addr, param->disc_res.bda, ESP_BD_ADDR_LEN);
    //                     ESP_LOGI(BT_HF_TAG, "Found a target device address:");
    //                     ESP_LOG_BUFFER_HEX(BT_HF_TAG, peer_addr, ESP_BD_ADDR_LEN);
    //                     ESP_LOGI(BT_HF_TAG, "Found a target device name: %s", peer_bdname);
    //                     printf("Connect.\n");
    //                    // esp_hf_client_connect(peer_addr);
    //                     esp_bt_gap_cancel_discovery();
    //                 }
    //             }
    //     }
     //   break;
        
        /* code */

        break;
    case ESP_BT_GAP_DISC_STATE_CHANGED_EVT:  //DISCOVER STATE CHANGED
        ESP_LOGI("GAP","ESP_BT_GAP_DISC_STATE_CHANGED_EVT");
        break;
    
    case ESP_BT_GAP_RMT_SRVCS_EVT: //REMOTE SERVICE EVENT 
         ESP_LOGI("GAP","ESP_BT_GAP_RMT_SRVCS_EVT");
        break;
    
    case ESP_BT_GAP_RMT_SRVC_REC_EVT:  //REMOTE SERVICE RECORD EVENT
        ESP_LOGI("GAP","ESP_BT_GAP_RMT_SRVC_REC_EVT");
        break;
    default:
        printf("event: %d",event);
        break;
    }
     return ;

}


#define GAP_TAG "ble"
// ESP_LOG_BUFFER_HEX(BT_HF_TAG, param->conn_stat.remote_bda, ESP_BD_ADDR_LEN);
void app_main(void)
{
    char bda_str[18] = {0};
    nvs_flash_init();
    esp_err_t ret ; 
    esp_bt_controller_mem_release(ESP_BT_MODE_BLE);  //底功耗与传统蓝牙 无法同时使用 需舍掉一个
    
    //初始化控制器
    esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT();
    esp_bt_controller_init(&bt_cfg);
    esp_bt_controller_enable(ESP_BT_MODE_CLASSIC_BT);

    //初始化blueroid  api (connect dis connect )
    esp_bluedroid_config_t bdroid = BT_BLUEDROID_INIT_CONFIG_DEFAULT();
    esp_bluedroid_init_with_cfg(&bdroid);
    esp_bluedroid_enable();

    esp_bt_gap_register_callback(bt_app_gap_cb);



    esp_bt_gap_set_scan_mode(ESP_BT_CONNECTABLE,ESP_BT_GENERAL_DISCOVERABLE);
    esp_bt_gap_start_discovery(ESP_BT_INQ_MODE_GENERAL_INQUIRY,10,0);


}



static bool get_name_from_eir(uint8_t *eir, char *bdname, uint8_t *bdname_len)
{
    uint8_t *rmt_bdname = NULL;
    uint8_t rmt_bdname_len = 0;

    if (!eir) {
        return false;
    }

    rmt_bdname = esp_bt_gap_resolve_eir_data(eir, ESP_BT_EIR_TYPE_CMPL_LOCAL_NAME, &rmt_bdname_len);
    if (!rmt_bdname) {
        rmt_bdname = esp_bt_gap_resolve_eir_data(eir, ESP_BT_EIR_TYPE_SHORT_LOCAL_NAME, &rmt_bdname_len);
    }

    if (rmt_bdname) {
        if (rmt_bdname_len > ESP_BT_GAP_MAX_BDNAME_LEN) {
            rmt_bdname_len = ESP_BT_GAP_MAX_BDNAME_LEN;
        }

        if (bdname) {
            memcpy(bdname, rmt_bdname, rmt_bdname_len);
            bdname[rmt_bdname_len] = '\0';
        }
        if (bdname_len) {
            *bdname_len = rmt_bdname_len;
        }
        return true;
    }

    return false;
}

CMakelists.txt

idf_component_register(SRCS "bluetest.c"
                    INCLUDE_DIRS ".")

elf error ->

idf.py menuconfig

component-config> Bluetooth->Bluetooth  enable  
        Bluedroid Options -> Classic Bluetooth enable 

    char* dev_name = "ESP_DEVICE2.2";
    esp_bt_gap_set_device_name(dev_name);

WIFI 

#include <stdio.h>
#include <string.h>
#include "esp_log.h"
#include "esp_err.h"

#include "nvs_flash.h"
#include "esp_event.h"
#include "esp_wifi.h"

#include "freertos/FreeRTOS.h"

#define TAG "WIFI"

#define WIFI_CONNECTED_BIT BIT0
#define WIFI_FAIL_BIT BIT1

char* SSID = "CMCC-xxxx";
char* password  ="xxxxx";

esp_netif_t *netif_t = NULL;
esp_event_handler_instance_t ip_event_handler;
esp_event_handler_instance_t wifi_event_handler;

EventGroupHandle_t wifi_event_group = NULL;

uint8_t wifi_try = 0;
void wifi_event_cb(void *arg,esp_event_base_t event_base,int32_t event_id,void *event_data)
{// example wifi station example main
    switch(event_id)
    {
        case WIFI_EVENT_WIFI_READY:
            ESP_LOGI(TAG,"READY");
            break;
        case WIFI_EVENT_SCAN_DONE:
            ESP_LOGI(TAG,"SCAN DONE");
            break;
        case WIFI_EVENT_STA_START:
            ESP_LOGI(TAG,"STA START");
            esp_wifi_connect();
            break;
        case WIFI_EVENT_STA_STOP:
            ESP_LOGI(TAG,"STA STOP");
            break;
        case WIFI_EVENT_STA_CONNECTED:
            ESP_LOGI(TAG,"STA CONNECTED");
            break;
        case WIFI_EVENT_STA_DISCONNECTED:
            ESP_LOGI(TAG,"DISCONNECTED");
            if(wifi_try <3)
            {
                esp_wifi_connect();
                wifi_try++;
            }
            else
            xEventGroupSetBits(wifi_event_group,WIFI_FAIL_BIT);

            break;
        case WIFI_EVENT_STA_AUTHMODE_CHANGE:
            ESP_LOGI(TAG,"authmode change");
            break;
        default:
            ESP_LOGI(TAG,"NOT HANDLED EVENT");
            break;

    }
}


void app_main(void)
{
    nvs_flash_init();
    wifi_event_group = xEventGroupCreate();

    esp_netif_init();
    esp_event_loop_create_default();

    esp_wifi_set_default_wifi_sta_handlers();
    netif_t = esp_netif_create_default_wifi_sta();

    wifi_init_config_t wcfg  = WIFI_INIT_CONFIG_DEFAULT();
    esp_wifi_init(&wcfg);

    esp_event_handler_instance_register(WIFI_EVENT,ESP_EVENT_ANY_ID,&wifi_event_cb,NULL,&wifi_event_handler);
    esp_event_handler_instance_register(IP_EVENT,ESP_EVENT_ANY_ID,&wifi_event_cb,NULL,&ip_event_handler);

    //wifi config
    wifi_config_t cfg = {
        .sta.threshold.authmode = WIFI_AUTH_WPA2_PSK,
    };

    strncpy((char*)cfg.sta.ssid ,SSID,sizeof(cfg.sta.ssid));
    strncpy((char*)cfg.sta.password , password,sizeof(cfg.sta.password));

    ESP_ERROR_CHECK(esp_wifi_set_ps(WIFI_PS_NONE));
    ESP_ERROR_CHECK(esp_wifi_set_storage(WIFI_STORAGE_RAM));

    esp_wifi_set_mode(WIFI_MODE_STA);
    esp_wifi_set_config(WIFI_IF_STA,&cfg);
    esp_wifi_start();

    EventBits_t bits = xEventGroupWaitBits(wifi_event_group,WIFI_CONNECTED_BIT|WIFI_FAIL_BIT,pdFALSE,pdFALSE,portMAX_DELAY);
    printf("wait bits");
    if(bits& WIFI_CONNECTED_BIT)
        ESP_LOGI(TAG,"CONNECTED WIFI");
    else
        ESP_LOGI(TAG,"FAILED");

    

    // DEINIT RELEASE
//     vEventGroupDelete(wifi_event_group);
//     esp_wifi_disconnect();
//     esp_wifi_stop();
//     esp_wifi_deinit();
//     esp_netif_destroy(netif_t);
//   //  esp_event_handler_instance_unregister(IP_EVENT,ESP_EVENT_ANY_ID,wifi_event_handler);
//     esp_event_handler_instance_unregister(WIFI_EVENT,ESP_EVENT_ANY_ID,wifi_event_handler) ;

    



}

最简单的方式(官方提供的)

通过 ESP-IDF 连接 Wi-Fi 入门指南 - 哔哩哔哩

添加依赖项文件   idf_component.yml (idf.py create-manifest)

dependencies:

  protocol_examples_common:

    path: ${IDF_PATH}/examples/common_components/protocol_examples_common

HTTP (protocol/http

#include <stdio.h>

#include "esp_log.h"
#include "nvs_flash.h"
#include "esp_wifi.h"
#include "esp_event.h"


#include "freertos/FreeRTOS.h"
#include "protocol_examples_common.h"
#include "esp_http_client.h"

#include "lwip/sockets.h"
#include "lwip/sys.h"
#include "lwip/netdb.h"
#include "lwip/dns.h"

#define WEB_SERVER "example.com"
#define WEB_PORT "80"
#define WEB_PATH "/"

char *TAG = "http";
char *REQUEST = "GET " WEB_PATH "HTTP/1.0\r\n"
"Host: " WEB_SERVER ":" WEB_PORT "\r\n"
"User_Agent:esp-idf/1.0 esp32\r\n"
"\r\n";

void app_main(void)
{
    nvs_flash_init();
    esp_netif_init();
    esp_event_loop_create_default();
    example_connect();

    const struct addrinfo hints = {
        .ai_family = AF_INET,
        .ai_socktype = SOCK_STREAM,
    };
 
    struct addrinfo *res;
    struct in_addr *addr;
    int s,r;
    char recv_buf[64];
    while(1)
    {
        int err = getaddrinfo(WEB_SERVER, WEB_PORT, &hints, &res);

        if(err != 0 || res == NULL) {
            ESP_LOGE(TAG, "DNS lookup failed err=%d res=%p", err, res);
            vTaskDelay(1000 / portTICK_PERIOD_MS);
            continue;
        }

        /* Code to print the resolved IP.

           Note: inet_ntoa is non-reentrant, look at ipaddr_ntoa_r for "real" code */
        addr = &((struct sockaddr_in *)res->ai_addr)->sin_addr;
        ESP_LOGI(TAG, "DNS lookup succeeded. IP=%s", inet_ntoa(*addr));

        s = socket(res->ai_family, res->ai_socktype, 0);
        if(s < 0) {
            ESP_LOGE(TAG, "... Failed to allocate socket.");
            freeaddrinfo(res);
            vTaskDelay(1000 / portTICK_PERIOD_MS);
            continue;
        }
        ESP_LOGI(TAG, "... allocated socket");

        if(connect(s, res->ai_addr, res->ai_addrlen) != 0) {
            ESP_LOGE(TAG, "... socket connect failed errno=%d", errno);
            close(s);
            freeaddrinfo(res);
            vTaskDelay(4000 / portTICK_PERIOD_MS);
            continue;
        }

        ESP_LOGI(TAG, "... connected");
        freeaddrinfo(res);

        if (write(s, REQUEST, strlen(REQUEST)) < 0) {
            ESP_LOGE(TAG, "... socket send failed");
            close(s);
            vTaskDelay(4000 / portTICK_PERIOD_MS);
            continue;
        }
        ESP_LOGI(TAG, "... socket send success");

        struct timeval receiving_timeout;
        receiving_timeout.tv_sec = 5;
        receiving_timeout.tv_usec = 0;
        if (setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &receiving_timeout,
                sizeof(receiving_timeout)) < 0) {
            ESP_LOGE(TAG, "... failed to set socket receiving timeout");
            close(s);
            vTaskDelay(4000 / portTICK_PERIOD_MS);
            continue;
        }
        ESP_LOGI(TAG, "... set socket receiving timeout success");

        /* Read HTTP response */
        do {
            bzero(recv_buf, sizeof(recv_buf));
            r = read(s, recv_buf, sizeof(recv_buf)-1);
            for(int i = 0; i < r; i++) {
                putchar(recv_buf[i]);
            }
        } while(r > 0);

        ESP_LOGI(TAG, "... done reading from socket. Last read return=%d errno=%d.", r, errno);
        close(s);
        for(int countdown = 10; countdown >= 0; countdown--) {
            ESP_LOGI(TAG, "%d... ", countdown);
            vTaskDelay(1000 / portTICK_PERIOD_MS);
        }
        ESP_LOGI(TAG, "Starting again!");
    }


}

异常与错误处理 

menuconfig 相应项未打开 

CMakeLists.txt PRIV_REQUIRES(nvs_flash )

idf_component_register(SRCS "xxx.c")未明确写明名称

依赖项 

错误输出 

ESP_LOGI("ERROR",FOMAT,。。)

bluetooth address 输出 ESP_LOG_BUFFER_HEX("ADDRSS",BDA_ADDRSS,6)

更多推荐