问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

ESP32串口通信配置与实验指南

创作时间:
作者:
@小白创作中心

ESP32串口通信配置与实验指南

引用
CSDN
1.
https://blog.csdn.net/weixin_56634270/article/details/145698921

本文将详细介绍如何在ESP32上配置和使用串口通信功能。通过本文,你将学习到如何使用ESP-IDF框架配置串口参数、设置引脚、安装驱动以及发送数据等基本操作。

1. 串口通信基础知识

在开始配置之前,建议先了解串口通信的基本概念。可以参考凡亿在知乎上的文章《串口通信基础知识》,该文章对串口通信的原理和基本配置有非常清晰的讲解。

2. 基本配置

最基本的串口通信配置包括:

  • 一个起始位
  • 8位数据位
  • 无奇偶校验
  • 一个停止位

在ESP32中,这些配置可以通过uart_param_config函数完成。该函数的原型如下:

esp_err_t uart_param_config(uart_port_t uart_num, const uart_config_t *uart_config)

其中,uart_config是一个结构体,包含以下成员:

typedef struct {
    int baud_rate;                      /*!< UART baud rate*/
    uart_word_length_t data_bits;       /*!< UART byte size*/
    uart_parity_t parity;               /*!< UART parity mode*/
    uart_stop_bits_t stop_bits;         /*!< UART stop bits*/
    uart_hw_flowcontrol_t flow_ctrl;    /*!< UART HW flow control mode (cts/rts)*/
    uint8_t rx_flow_ctrl_thresh;        /*!< UART HW RTS threshold*/
    uart_sclk_t source_clk;             /*!< UART source clock selection */
} uart_config_t;

3. 配置串口参数

根据上述基本配置要求,我们可以创建一个uart_config_t结构体实例:

const uart_config_t usart_dev = {
    .baud_rate = 115200,               // 波特率为115200
    .data_bits = UART_DATA_8_BITS,     // 数据位为8bits
    .parity = UART_PARITY_DISABLE,     // 无校验位
    .stop_bits = UART_STOP_BITS_1,     // 停止位为1
    .flow_ctrl = UART_HW_FLOWCTRL_DISABLE, // 无流控制
    .source_clk = UART_SCLK_APB,       // 时钟线选择
    .rx_flow_ctrl_thresh = 122
};

然后使用uart_param_config函数进行配置:

uart_param_config(UART_NUM_0, &usart_dev);

4. 设置引脚

接下来需要设置串口使用的引脚。使用uart_set_pin函数进行配置:

esp_err_t uart_set_pin(uart_port_t uart_num, int tx_io_num, int rx_io_num, int rts_io_num, int cts_io_num)

我们只需要配置TX和RX引脚,RTS和CTS引脚不需要配置,因此使用UART_PIN_NO_CHANGE表示不改变:

uart_set_pin(UART_NUM_0, GPIO_NUM_2, GPIO_NUM_3, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);

5. 安装驱动

完成参数配置和引脚设置后,需要安装串口驱动。使用uart_driver_install函数:

uart_driver_install(UART_NUM_0, RX_BUF_SIZE * 2, TX_BUF_SIZE * 2, 20, NULL, 0);

参数说明:

  • 第一个参数是串口号
  • 第二个参数是接收数据缓冲区大小
  • 第三个参数是发送数据缓冲区大小
  • 第四个参数是通道大小
  • 第五个参数是通道回调函数
  • 第六个参数是中断分配标志位

6. 初始化函数

将上述配置步骤封装到一个初始化函数中:

void SerialPort_Init(void)
{
    const uart_config_t usart_dev = {
        .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_APB,
        .rx_flow_ctrl_thresh = 122
    };
    uart_param_config(UART_NUM_0, &usart_dev);
    uart_set_pin(UART_NUM_0, GPIO_NUM_2, GPIO_NUM_3, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
    uart_driver_install(UART_NUM_0, RX_BUF_SIZE * 2, TX_BUF_SIZE * 2, 20, NULL, 0);
}

7. 发送数据

完成初始化后,就可以使用uart_write_bytes函数发送数据了。在app_main函数中调用初始化函数并发送数据:

#include "uart_dev.h"
char my_buffer[] = "hello world";

extern "C" void app_main(void)
{
    SerialPort_Init();   // 初始化
    while (true)
    {
        uart_write_bytes(UART_NUM_0, my_buffer, sizeof(my_buffer)); // 发送"hello world"
    }
}

8. 实验验证

由于没有TTL串口转换模块,使用原子逻辑分析仪进行测试。根据ASCII码表,"hello world"的ASCII码应该正确显示。实验结果如下:

实验成功,串口发送功能正常工作。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号