关于ESPIDF框架下的https使用

前言:

ESPIDF框架下ESP32 没有内置证书存储,因此开发者必须手动提供所需的证书,以便设备能够验证服务器的身份。

官方给的例子很丰富,比如https部分,但是代码量比较大,难以消化,对刚入手espidf比较不友好。

连接wifi就不多说了,这里直接一步到位,总结出最精炼步骤:

 

一、https结构体配置

虽然这里是esp_http_client_config_t, 但其实也包含了https

在需要证书的情况下,就这四个就够了。图中最后一步是初始化客户端。

其余参数具体什么含义这里不多讲了,这些都能简单搜到

里面的事件处理函数:

根据需要写你想写的就行,官方的例子写了很多事件。

token的获取这里不多叙述了,具体就是先通过访问url,获取到信息,解析出token。也要用到证书。有了证书是再多访问一次的事。

二、证书 获取

这里单独拿出来讲,个人认为是它是最不友好的一点。

什么是证书这里不多介绍了,都能搜到。

首先你的证书最好是完整的,什么是完整的?

服务器证书 + 中间件书 + 根证书

 如何获取?

首先是服务器证书和中间证书:

比如我要拿esp32访问菜鸟教程,使用espidf框架编程,肯定要手动获取证书。我们先获取服务器证书和中间证书:

菜鸟网址:https://www.runoob.com/

我们打开powershell执行如下指令就行:

 openssl s_client -connect www.runoob.com:443 -showcerts

为什么是443, https默认就是443端口

没有openssl, 自行搜索就行,教程很多。

接下来会看到:

这种长文本。第一个出现的长文本就是服务器证书,第二个是中间证书,一般不会出现第三个。

那我们的根证书呢?

根证书获取:

以chrome浏览器为例:

按如下点击:

记住框起来的名字。

现在win + R键, 输入certmgr.msc

然后按如下点击找到他:

鼠标右键他,并如下点击

然后点击下一步,

然后选择base64编码

这些你随便整,只要你找得到:

然后导出:

随后你发现它是这种长相:

太丑陋了,内容也不是我们想要的,我们暴改一下:

重命名后缀.txt

 

这样顺眼多了:

这样根证书就获取成功了。

证书拼接:

建一个文本文件,按服务器证书,中间证书,根证书顺序,拼接起来,像这样:

 

然后后缀改成.pem

三、证书嵌入

刚刚的文件粘贴进你的espidf main文件夹:

main目录下的cmakelists增加:

二进制文件嵌入声明:

按如下编写,表示在本文件夹下,要嵌入名字叫my_cert.pem的二进制文件到my_cert_pem变量。

在引用的时候,是填入my_cert_pem_start。

四、最后四部曲

        构建消息 -> 消息转换为标准 JSON 字符串 -> 设置请求体 -> 发送

cJSON *messages = cJSON_CreateObject();
cJSON_AddStringToObject(messages, "消息的键", "要发送的消息");

char *payload = cJSON_PrintUnformatted(messages);

esp_http_client_set_post_field(client, payload, strlen(payload));

esp_http_client_perform(client);

函数用法示意就对应上述描述。

五、完整步骤


#include <string.h>
#include "esp_http_client.h"
#include "cJSON.h"

extern const char my_cert_pem_start[] asm("_binary_my_cert_pem_start");
extern const char my_cert_pem_end[] asm("_binary_my_cert_pem_end");

static esp_err_t connect_https_example_event_handler(esp_http_client_event_t *evt) {
    if (evt->event_id == HTTP_EVENT_ON_DATA) {
        // 就一个HTTP_EVENT_ON_DATA情况足以
        // 然后开始你的操作
    }
    return ESP_OK;
}

esp_http_client_config_t config = {
    .url = "你的url + token",
    .method = HTTP_METHOD_POST,    // 选择模式,根据你需要选择
    .event_handler = connect_https_example_event_handler,
    .cert_pem = my_cert_pem_start,
};

esp_http_client_handle_t client = esp_http_client_init(&config);

cJSON *messages = cJSON_CreateObject();
cJSON_AddStringToObject(messages, "消息的键", "要发送的消息");

char *payload = cJSON_PrintUnformatted(messages);

esp_http_client_set_post_field(client, payload, strlen(payload));

esp_http_client_perform(client);

 

 

<think>嗯,用户问的是ESP32-S3-N16R8如何使用ESP-IDF框架的UART接收数据。首先,我需要确认ESP32-S3的UART配置和普通ESP32是否有区别。ESP32-S3可能有更多的UART接口,比如UART0、UART1、UART2等,但具体要看数据手册。然后,用户提到的型号中的N16R8可能指的是Flash和PSRAM的大小,但这对UART的使用影响不大。 接下来,用户需要的是接收数据的步骤。根据ESP-IDF的文档,UART的基本配置包括设置波特率、数据位、停止位、校验位等。然后是安装驱动程序,使用uart_driver_install函数,分配缓冲区,特别是接收缓冲区的大小,这很重要,因为接收数据需要足够的空间。 然后需要设置GPIO引脚,ESP32-S3的UART引脚可能有默认的,但用户可能需要根据实际硬件连接调整。比如UART_NUM_1的默认TX是GPIO4,RX是GPIO5,但用户可能用不同的引脚,所以需要配置uart_set_pin函数。 接收数据部分,常用的方法有两种:使用uart_read_bytes函数轮询,或者在任务中等待事件,比如UART_DATA事件,这通常更高效,尤其是使用FreeRTOS的通知机制。此外,中断处理也是可能的,但可能需要更复杂的配置,比如安装中断服务例程,处理FIFO溢出等错误情况。 可能需要注意的问题包括正确设置接收缓冲区大小,避免数据丢失。还有,DMA的使用,如果需要大量数据传输,可以启用DMA,但ESP32-S3的UART是否支持DMA,或者配置方式是否有变化,需要查阅相关文档。 用户可能的实际应用场景是接收传感器数据或其他设备的信息,所以需要确保配置正确,比如波特率匹配,GPIO引脚连接正确。此外,错误处理也很重要,比如检查返回值,处理UART_FRAME_ERROR等。 可能用户遇到的常见问题包括接收不到数据,可能是引脚配置错误,波特率不匹配,或者缓冲区不足。需要提示用户检查这些部分。另外,ESP-IDF的版本差异也可能影响API的使用,建议用户确认自己使用的版本,并参考官方例程。 总结回答的结构应该是先配置UART参数,安装驱动,设置GPIO,然后处理接收数据的方法,比如事件循环或轮询,最后是释放资源。示例代码部分需要展示完整的流程,并注释关键步骤,帮助用户理解。</think>在ESP-IDF框架使用ESP32-S3-N16R8的UART接收数据,可通过以下步骤实现: --- ### 一、硬件准备 1. 确认UART引脚: - 默认UART0:TX=GPIO43, RX=GPIO44 - 其他UART可通过`uart_set_pin()`自定义引脚 2. 连接设备:确保发送端与ESP32的RX引脚正确连接 --- ### 二、软件配置流程 #### 1. 配置UART参数 ```c #include "driver/uart.h" #define UART_PORT UART_NUM_1 // 选择UART实例 #define BUF_SIZE 1024 // 接收缓冲区大小 #define RD_PIN GPIO_NUM_5 // 自定义RX引脚 #define BAUD_RATE 115200 // 波特率 uart_config_t uart_config = { .baud_rate = BAUD_RATE, .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 }; ``` #### 2. 安装驱动 ```c // 安装UART驱动,设置接收缓冲区 ESP_ERROR_CHECK(uart_driver_install( UART_PORT, // UART编号 BUF_SIZE * 2, // 接收缓冲区大小 0, // 发送缓冲区大小(0表示不使用发送) 0, // 事件队列大小 NULL, // 事件队列句柄 0 // 分配标志 )); // 设置引脚 ESP_ERROR_CHECK(uart_set_pin( UART_PORT, UART_PIN_NO_CHANGE, // TX保持默认 RD_PIN, // RX引脚 UART_PIN_NO_CHANGE, // RTS UART_PIN_NO_CHANGE // CTS )); // 应用配置 ESP_ERROR_CHECK(uart_param_config(UART_PORT, &uart_config)); ``` --- ### 三、数据接收方法 #### 方法1:轮询接收(简单场景) ```c uint8_t data[BUF_SIZE]; int length = uart_read_bytes( UART_PORT, // UART编号 data, // 数据缓冲区 BUF_SIZE, // 最大读取长度 20 / portTICK_PERIOD_MS // 超时时间(20ms) ); ``` #### 方法2:事件驱动(推荐) ```c // 创建FreeRTOS任务处理接收 void uart_event_task(void *pvParameters) { uart_event_t event; uint8_t data[BUF_SIZE]; while(1) { if(xQueueReceive(uart0_queue, &event, portMAX_DELAY)) { if(event.type == UART_DATA) { int len = uart_read_bytes( UART_PORT, data, event.size, pdMS_TO_TICKS(100) ); // 处理接收到的数据 if(len > 0) { // 添加你的数据处理逻辑 } } } } } // 在app_main中创建任务 xTaskCreate(uart_event_task, "uart_rx_task", 4096, NULL, 12, NULL); ``` --- ### 四、关键注意事项 1. **缓冲区管理**: - 接收缓冲区应足够大以避免数据溢出 - 及时调用`uart_read_bytes()`清空缓冲区 2. **错误处理**: ```c if(uart_get_buffered_data_len(UART_PORT, &buffered_size) == ESP_OK) { // 处理有效数据 } ``` 3. **中断配置**(可选): - 通过`uart_enable_rx_intr()`启用接收中断 - 自定义中断服务程序处理实时数据 --- ### 五、完整代码示例 ```c #include <stdio.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "driver/uart.h" #define UART_PORT UART_NUM_1 #define BUF_SIZE 1024 #define RD_PIN GPIO_NUM_5 #define BAUD_RATE 115200 void app_main() { // UART配置(同上文) // 创建数据处理任务 xTaskCreate(uart_event_task, "uart_rx", 4096, NULL, 12, NULL); while(1) { vTaskDelay(1000 / portTICK_PERIOD_MS); } } ``` --- ### 六、调试技巧 1. 使用`uart_write_bytes()`回传测试数据验证连接 2. 通过`idf.py monitor`查看串口输出 3. 用逻辑分析仪检查物理层信号质量 实际使用时需根据具体硬件连接调整引脚配置,建议参考官方示例:[ESP-IDF UART Example](https://github.com/espressif/esp-idf/tree/master/examples/peripherals/uart)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值