0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

[esp32教程] 5、UART使用

板凳说 来源:板凳说 作者:板凳说 2023-06-13 09:04 次阅读

0、前期准备

1、参考首篇文章搭建好esp32环境

2、准备好一块esp32开发开发板(本作者使用了esp32c3作为开发平台)

1、知识储备

1.1 概述

UART称为通用异步收发器,可以进行全双工/半双工数据通讯数据通讯,通讯距离取决于上拉驱动能力、波特率,一般只在电路板上使用,如果需要长距离通讯可以外接RS232(最长通讯距离15M)、RS485电平转换芯片,但是要注意如果外接的是RS485电平芯片,只能进行半双工通讯,在理想情况下使用9600波特率,其通讯距离可达1200M。

1.2 功能架构

​ 乐鑫EPS32C3带有2个UART控制器,不仅可以用来进行数据通讯,还能来用驱动红外发射管。(目前本文只用来作uart通讯)

1.3 uart配置流程介绍

LEDC的配置流程可分为以下3步

1、uart配置:设置波特率、数据位、停止位、奇偶校验位和流控

2、引脚绑定:设置UART使用哪几个引脚

3、 注册uart中断驱动(可选--建议进行该配置,本文给出例子就使用该方式)

1、uart配置

uart的配置主要是给 uart_config_t 结构体赋值,然后通过uart_param_config函数进行uart设置

以下对uart_config_t 结构体进行说明

typedef struct {
    int baud_rate;                      //波特率
    uart_word_length_t data_bits;       //数据位
    uart_parity_t parity;               //奇偶校验位
    uart_stop_bits_t stop_bits;         //停止位
    uart_hw_flowcontrol_t flow_ctrl;    //硬件流控
    uint8_t rx_flow_ctrl_thresh;        //硬件流控的RTS阈值
    union {
        uart_sclk_t source_clk;         //时钟
        bool use_ref_tick  __attribute__((deprecated)); 
    };
} uart_config_t;

例子:

// uart1配置
// 115200 8 1 无奇偶校验位 无流控
uart_config_t uart_conf = {
    .baud_rate = 115200,
    .data_bits = UART_DATA_8_BITS,
    .stop_bits = UART_STOP_BITS_1,
    .parity = UART_PARITY_DISABLE,
    .flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
    .source_clk = UART_SCLK_APB,
};

uart_param_config(UART_NUM_1, &uart_conf);
2、引脚绑定

设置UART使用哪几个引脚

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_num:串口编号 可查看uart.h,进行选择
//     tx_io_num:发送引脚编号,不需要可填:UART_PIN_NO_CHANGE
//     rx_io_num: 接收引脚编号,不需要可填:UART_PIN_NO_CHANGE
//     rts_io_num:rts引脚编号,不需要可填:UART_PIN_NO_CHANGE
//     cts_io_num:cts引脚编号,不需要可填:UART_PIN_NO_CHANGE

例子:

// 引脚绑定
uart_set_pin(UART_NUM_1, TX_PIN, RX_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
3、 注册uart中断驱动(配置可选)

通过注册uart中断,可以不用开一个任务实时的去读取串口,判断串口有没有数据发送过来,提高系统实时性。

中断驱动uart_driver_install函数参数说明如下:

esp_err_t uart_driver_install(uart_port_t uart_num, int rx_buffer_size, int tx_buffer_size, int queue_size, QueueHandle_t *uart_queue, int intr_alloc_flags);
// 参数 :uart_num:串口编号 可查看uart.h,进行选择
//     rx_buffer_size:uart接收数组大小
//     tx_buffer_size: uart发送数组大小
//     queue_size: uart接收消息队列大小,和新建的消息队列大小一致
//     uart_queue:uart接收消息队列句柄
//     intr_alloc_flags:中断标志位

例子:

QueueHandle_t uart_queue = NULL;    
uart_queue = xQueueCreate(8, 512);
uart_driver_install(UART_PORT, RX_BUFF_SIZE, RX_BUFF_SIZE, 8, &uart_queue, 0);
4、 其他函数

本文只介绍发送和接收两个函数,更多函数可参考乐鑫官网

int uart_read_bytes(uart_port_t uart_num, void *buf, uint32_t length, TickType_t ticks_to_wait);
//参数 : uart_num:串口编号 可查看uart.h,进行选择
//       buf:接收数组名
//       length:接收到的数据长度
//       ticks_to_wait:读取等待的RTOS 滴答个数
//返回 : -1:表示错误
//      其他:表示从uart的接收fifo读取到的数据

int uart_write_bytes(uart_port_t uart_num, const void *src, size_t size);
//参数 : uart_num:串口编号 可查看uart.h,进行选择
//       src:发送数组名
//       size:发送的数据长度
//返回 : -1:表示错误
//      其他:表示uart发送给发送fifo的数据

2、新建工程

idf.py create-project project_uart # 新建工程
cd project_uart
idf.py set-target esp32c3 # 设置工程使用的芯片

2、查看原理图确定uart引脚

uart.png

3、编写程序

#include < freertos/FreeRTOS.h >
#include < freertos/queue.h >
#include < freertos/task.h >

#include < driver/gpio.h >
#include < driver/uart.h >
#include < esp_log.h >

#include < string.h >

#define LOG_EVENT_TAG "uart"

QueueHandle_t uart_queue = NULL;

#define RX_BUFF_SIZE 1024

#define UART_PORT UART_NUM_2
#define RX_PIN GPIO_NUM_1
#define TX_PIN GPIO_NUM_0

uint8_t uart_buff[RX_BUFF_SIZE];

void UartEventHandle(void* param);

void init_uart(void) {
    uart_config_t uart_conf = {
        .baud_rate = 115200,
        .data_bits = UART_DATA_8_BITS,
        .stop_bits = UART_STOP_BITS_1,
        .parity = UART_PARITY_DISABLE,
        .flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
        .source_clk = UART_SCLK_APB,
    };

    uart_param_config(UART_PORT, &uart_conf);
    uart_set_pin(UART_PORT, TX_PIN, RX_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);

    uart_queue = xQueueCreate(8, 512);
    uart_driver_install(UART_PORT, RX_BUFF_SIZE, RX_BUFF_SIZE, 8, &uart_queue, 0);

    xTaskCreate(UartEventHandle, "uart_event_hanle", 1024, NULL, 5, NULL);
}

void UartEventHandle(void* param) {
    uart_event_t event;
    memset(&uart_data, 0, sizeof(UartData));
    uart_data.rx_status = pdFALSE;
    while (pdTRUE) {
        if (xQueueReceive(uart_queue, (void*)&event, portMAX_DELAY)) {
            switch (event.type) {
                case UART_DATA:
                    memset(&uart_data, 0, sizeof(UartData));
                    uart_data.rx_status = pdFALSE;
                    if (event.size <= sizeof(uart_data.buff)) {
                        uart_data.rx_status = pdTRUE;
                        uart_data.rx_uart_len = event.size;
                        uart_read_bytes(UART_PORT, uart_buff, event.size, portMAX_DELAY);
                        ESP_LOGI(LOG_EVENT_TAG, "uart_buff: %s", uart_buff);
                    }

                    break;
                case UART_FIFO_OVF:
                case UART_BUFFER_FULL:
                    uart_flush_input(UART_PORT);
                    xQueueReset(uart_queue);
                    break;
                default:
                    ESP_LOGI(LOG_EVENT_TAG, "uart event type: %d", event.type);
                    break;
            }
        }
    }
}

void app_main(void) {
    init_uart();

    while (1) {
        vTaskDelay(1000 / portTICK_RATE_MS);
    }
}

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 控制器
    +关注

    关注

    112

    文章

    16332

    浏览量

    177803
  • uart
    +关注

    关注

    22

    文章

    1235

    浏览量

    101354
  • 开发板
    +关注

    关注

    25

    文章

    5032

    浏览量

    97371
  • FreeRTOS
    +关注

    关注

    12

    文章

    484

    浏览量

    62139
  • ESP32
    +关注

    关注

    18

    文章

    971

    浏览量

    17201
收藏 人收藏

    评论

    相关推荐

    ESP32UART串口通信概览

    ESP32ESP-IDF 教学(九)—— 串口通信(UART)文章目录ESP32ESP-IDF 教学(九)—— 串口通信(
    发表于 12-09 07:52

    如何通过uartesp32-wroom-32d(uart0) 发送数据到esp32-s3(uart1) ?

    我有一个关于 uart 通信的问题。我有两个 esp32,它们是 esp32-devkit-c_v4(esp32-wroom-32d) 和 ESP3
    发表于 02-28 08:32

    ESP32模组的主要特性

    WT-ESP32-DevKitC V4是一款基于ESP32的小型开发板,集WIFI+蓝牙方案于一体,板上模组绝大部分管脚均已引出,开发人员可根据实际需求,轻松通过跳线连接多种外围器件,或将开发板直接
    发表于 11-04 14:54 3994次阅读

    ESP32开发套件 ESP32-DevKitC

    今天推出的一款套件是来自全球创客届大名鼎鼎的乐鑫科技官方提供的经典ESP32开发套件 - ESP32-DevKitC。 它基于乐鑫ESP32控制器(32-bit MCU 2.4 GHz Wi-Fi
    的头像 发表于 01-06 16:55 8400次阅读

    ESP32-WROOM-32E和ESP32-WROOM-32UE模组的区别

    ESP32-WROOM系列模组基于 ESP32-D0WD 双核芯片设计,适用于基于 Wi-Fi 和蓝牙连接的应用场景,具备强大的双核性能。而其中的ESP32
    发表于 06-01 16:41 1.9w次阅读
    <b class='flag-5'>ESP32</b>-WROOM-32E和<b class='flag-5'>ESP32</b>-WROOM-32UE模组的区别

    esp32和arduino的区别,esp32能否替代arduino

    很多创客爱好者甚至有些技术工程师在理解esp32和arduino的时候总是问一句这两块板子哪个更好用?他们可能潜意识中就觉得arduino和esp32是竞品的关系,但实际是这样吗?今天我们就深入
    发表于 06-24 17:11 2.7w次阅读

    ESP32 开发之旅② Arduino For ESP32说明

    文章目录1. Arduino Core For ESP32是什么?2.Arduino core for ESP32库3.与ESP8266库类比3.1 WiFi —— ESP
    发表于 11-13 19:51 33次下载
    <b class='flag-5'>ESP32</b> 开发之旅② Arduino For <b class='flag-5'>ESP32</b>说明

    ESP32 SDIO 使用教程

    ESP32 SDIO 使用教程本文旨在说明如何使用标准的 ESP32-WROOM-32D 开发板进行 SDIO 的通信。本文档适用于所有需要与 ESP32 SDIO slave 通信的方案
    发表于 11-23 17:51 233次下载
    <b class='flag-5'>ESP32</b> SDIO 使用教程

    ESP32ESP-IDF 教学(九)—— 串口通信(UART

    ESP32ESP-IDF 教学(九)—— 串口通信(UART)文章目录ESP32ESP-IDF 教学(九)—— 串口通信(
    发表于 11-26 13:21 44次下载
    <b class='flag-5'>ESP32</b> 之 <b class='flag-5'>ESP</b>-IDF 教学(九)—— 串口通信(<b class='flag-5'>UART</b>)

    ESP32系列芯片的规格

    ESP32是一款2.4GHz Wi-Fi和蓝牙组合芯片,采用TSMC超低功耗40nm设计技术它旨在实现最佳功率和射频性能,显示出鲁棒性、多功能性和灵活性在各种应用和电源场景中的可靠性。ESP32系列芯片包括ESP32-D0WDQ
    发表于 04-25 16:21 7次下载

    ESP32上的自定义UART协议开源

    电子发烧友网站提供《ESP32上的自定义UART协议开源.zip》资料免费下载
    发表于 02-13 16:38 4次下载
    <b class='flag-5'>ESP32</b>上的自定义<b class='flag-5'>UART</b>协议开源

    ESP32 PWM驱动电机

    18 PWM控制B电机 4 A1 15 A2 17 B1 5 B2PWM控制电机方法参考—— PWM如何控制直流电机 驱动芯片TB6612FNG ESP32使用PWM frommachineimportP
    发表于 03-20 11:37 4次下载
    <b class='flag-5'>ESP32</b> PWM驱动电机

    ESP32ESP32通过Internet进行通信

    电子发烧友网站提供《ESP32ESP32通过Internet进行通信.zip》资料免费下载
    发表于 06-15 09:58 4次下载
    <b class='flag-5'>ESP32</b>到<b class='flag-5'>ESP32</b>通过Internet进行通信

    ESP32学习笔记:串口

    ESP32 芯片有3 个UART 接口,UART0,UART1,UART2,支持异步通信和 IrDA,通信速度最高可达
    的头像 发表于 07-13 17:09 7043次阅读
    <b class='flag-5'>ESP32</b>学习笔记:串口

    esp32s3使用多串口

    ESP32-S3 有三个 UART(通用异步收发器)控制器,即 UART0、UART1、UART2,支持异步通信(RS232 和 RS48
    的头像 发表于 11-06 11:29 4787次阅读
    <b class='flag-5'>esp32</b>s3使用多串口