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

ESP32串口通信配置详解

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

ESP32串口通信配置详解

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

本文将详细介绍如何在ESP32上配置串口通信。通过本文,你将学习到如何使用ESP-IDF框架配置串口参数、设置引脚以及安装驱动,并通过一个简单的发送数据实验验证配置的正确性。

首先查看官方文档:通用异步接收器/发送器 (UART) - ESP32-C3 - — ESP-IDF 编程指南 v5.4 文档。使用串口需要进行以下几个配置,本章我们不使用中断的情况下就只需要关注前4个部分的操作。

我们一步步来首先看一下什么是串口通信,这边建议查看凡亿的文章讲的非常清晰:https://zhuanlan.zhihu.com/p/478710212

那么最基本的常用的串口通讯需要进行的基本配置就是:

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

因此想要通信我们必须配置这些内容,也就是ESP32的官方文档中写的配置通信参数需要使用它的配置函数 esp_err_t uart_param_config(uart_port_t uart_num, const uart_config_t *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;

那么我们做如下配置:

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_NUM_0, &usart_dev);  

按照官方文档中所写的我们现在应该进行的是设置引脚使用的是这个引脚:

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)

我们做如下配置:

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

看看这个函数的原型:我们不需要配置RTS和CTS所以做了上面的配置

 * @param uart_num   UART port number, the max port number is (UART_NUM_MAX -1).
 * @param tx_io_num  UART TX pin GPIO number.
 * @param rx_io_num  UART RX pin GPIO number.
 * @param rts_io_num UART RTS pin GPIO number.
 * @param cts_io_num UART CTS pin GPIO number.  

第三步我们进行安装驱动:

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

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

综上所述完成了初始化的所有配置完整的配置代码如下:

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

接下来我们进行串口发送功能的实验,根据官方的文档我们使用uart_write_bytes()函数就可以实现发送数据了。

我们在主函数中这样写代码:

#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
    }
}

ok,那我们完成了串口的发送功能,但是手里没有TTL的串口转换模块,但是手里正好有一个原子的逻辑分析仪,那么我们就来测试一下吧,看看是否能成功发送数据呢。

那么根据ASCLL码的转化表应该是什么呢?答案是:hello world。那么ok实验成功

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