学习
实践
活动
专区
工具
TVP
写文章
专栏首页物联网思考【玩转ESP32】12、esp32串口使用

【玩转ESP32】12、esp32串口使用

1、esp32串口

ESP32芯片有三个UART控制器(UART0, UART1UART2),其中UART0GPIO3用于U0RXDGPIO1用于U0TXD)用作下载、调试串口,引脚不可改变;

UART1UART2的引脚是可以设置的。 UART1默认引脚是GPIO9用作U1RXDGPIO10用作U1TXD,但是这两个引脚也是用于外接flash的,因此在使用UART1的时候需要设置其他引脚;

UART2默认引脚是GPIO16用作U2RXDGPIO17用作U2TXD

2、API

components/driver/include/driver/uart.h中可以查看api;

在examples/peripherals/uart中也可以参考官方的各种串口例程。

2.1、安装uart驱动

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_queue属于freertos里面的队列句柄,在这里表示用于指示来自串口底层中断的队列消息。

2.2、uart参数配置

esp_err_t uart_param_config(uart_port_t uart_num, const uart_config_t *uart_config);

2.3、接收阈值设置

esp_err_t uart_set_rx_full_threshold(uart_port_t uart_num, int threshold);

2.4、串口引脚设置

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

2.5、从接收缓冲区读取数据

int uart_read_bytes(uart_port_t uart_num, uint8_t* buf, uint32_t length, TickType_t ticks_to_wait);

2.6、数据写入发送缓冲区

int uart_write_bytes(uart_port_t uart_num, const char* src, size_t size);

3、代码实现

3.1、参数定义

#define EX_UART_NUM UART_NUM_1  //串口1

#define TXD_PIN    (GPIO_NUM_17) //txd使用gpio17
#define RXD_PIN    (GPIO_NUM_16) //rxd使用gpio16

#define BUF_SIZE (128)   //缓冲区定义
static QueueHandle_t uart_queue; //队列句柄
static uint8_t  uartbuf[BUF_SIZE];

3.2、串口初始化

void uart_comm_init(void)
{
    /* Configure parameters of an UART driver,
     * communication pins and install the driver */
    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_APB,
    };
    //Install UART driver, and get the queue.
    uart_driver_install(EX_UART_NUM, BUF_SIZE * 2, BUF_SIZE * 2, 20, &uart_queue, 0);
    uart_param_config(EX_UART_NUM, &uart_config);
    uart_set_rx_full_threshold(EX_UART_NUM,126);

    //Set UART pins (using UART0 default pins ie no changes.)
    uart_set_pin(EX_UART_NUM, TXD_PIN, RXD_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);

    //Create a task to handler UART event from ISR
    xTaskCreate(uart_event_task, "uart_event_task", 2048, NULL, 12, NULL); //创建串口任务
}

3.3、串口任务函数

static void uart_event_task(void *pvParameters)
{
    uart_event_t event;
    for(;;) {
        //阻塞接收串口队列,
        //这个队列在底层发送,用户只需在应用层接收即可
        if(xQueueReceive(uart_queue, (void * )&event, (portTickType)portMAX_DELAY)) {
            switch(event.type) {//各种串口事件
                case UART_DATA:
                    ESP_LOGI(TAG, "[UART DATA]: %d", event.size);
                    uart_read_bytes(EX_UART_NUM, uartbuf, event.size, portMAX_DELAY); //阻塞接收
                    ESP_LOGI(TAG, "[DATA EVT]:");
                    uart_write_bytes(EX_UART_NUM, uartbuf, event.size);//原样发送
                    break;
                //Event of HW FIFO overflow detected
                case UART_FIFO_OVF: //硬件fifo溢出
                    ESP_LOGI(TAG, "hw fifo overflow");
                    // If fifo overflow happened, you should consider adding flow control for your application.
                    // The ISR has already reset the rx FIFO,
                    // As an example, we directly flush the rx buffer here in order to read more data.
                    uart_flush_input(EX_UART_NUM);
                    xQueueReset(uart_queue);
                    break;
                //Event of UART ring buffer full
                case UART_BUFFER_FULL: //环形缓冲区满
                    ESP_LOGI(TAG, "ring buffer full");
                    // If buffer full happened, you should consider encreasing your buffer size
                    // As an example, we directly flush the rx buffer here in order to read more data.
                    uart_flush_input(EX_UART_NUM);
                    xQueueReset(uart_queue);
                    break;
                //Event of UART RX break detected
                case UART_BREAK:
                    ESP_LOGI(TAG, "uart rx break");
                    break;
                //Event of UART parity check error
                case UART_PARITY_ERR:
                    ESP_LOGI(TAG, "uart parity error");
                    break;
                //Event of UART frame error
                case UART_FRAME_ERR:
                    ESP_LOGI(TAG, "uart frame error");
                    break;
                //UART_PATTERN_DET
                case UART_PATTERN_DET:
                    break;
                //Others
                default:
                    ESP_LOGI(TAG, "uart event type: %d", event.type);
                    break;
            }
        }
    }
    vTaskDelete(NULL);
}

4、使用总结

  1. 初始化串口参数,(队列指针、缓冲区、引脚等);
  2. 任务中阻塞等待串口队列 。

————————END————————

文章分享自微信公众号:
物联网思考

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!

作者:everythinglink
原始发表时间:2021-06-07
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • 【玩转ESP32】13、esp32 mqtt基础

    MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上,是为硬件性能低下...

    ManInRoad
  • 【玩转ESP32】14、esp32 mqtt client

    ESP-IDF提供了mqtt组件,在components/mqtt,相关的API位于components/mqtt/esp-mqtt目录下,这个组件是基于htt...

    ManInRoad
  • 【玩转ESP32】4、ESP32驱动DHT11

    把上节的blink工程复制一份,修改名称为dht11,其中CMakeLists.txt、Makefile、包括源文件名也改为dht11,然后试着编译,发现可以编...

    ManInRoad
  • 【玩转ESP32】11、esp32软件定时器

    esp32的组件(components)里面的esp_timer提供了软件定时器相关api,支持周期回调、单词回调等操作。其中软件定时器的初始化在void st...

    ManInRoad
  • 【玩转ESP32】7、ESP32连接wifi

    前言:ESP32 WIFI功能支持STA、AP、APSTA三种模式,本文聊聊在STA模式下,连接到路由器。

    ManInRoad
  • 【玩转ESP32】15、PWM调光

    ESP32的PWM功能,官方叫做LEDC(LED PWM Controller module),主要用于控制 LED,也可产生 PWM 信号用于其他设备的控制。...

    ManInRoad
  • 【玩转ESP32】2、开发资料

    要特别注意:管脚 SCK/CLK,SDO/SD0,SDI/SD1,SHD/SD2,SWP/SD3,和 SCS/CMD,即 GPIO6 至 GPIO11 用于连接...

    ManInRoad
  • 【玩转ESP32】8、ESP32 Guru Meditation Error报错定位分析

    打印了异常时,PC、PS等各个寄存器的值,其中Backtrace打印了可能异常的地方,可以根据这个定位到具体对应的代码。

    ManInRoad
  • 【玩转ESP32】16、esp32获取rssi,辅助判断硬件是否异常

    (1)通过仪器测量标定几个射频性能正常的模块; (2)获取一定距离下标准模块的rssi; (3)获取一定距离下被测量模块的rssi; (4)被测量模块和标准模块...

    ManInRoad
  • 【玩转ESP32】1、开发环境搭建

    基本上一路点击下一步即可,记得要添加环境变量,安装之后在“命令提示符”里面输入git --version,出现如下即表示正确安装成功。

    ManInRoad
  • 【玩转ESP32】9、ESP32 作为TCP客户端连接服务器(非阻塞)

    domain:为地址族,也就是 IP 地址类型,常用的有 AF_INET 和 AF_INET6; type:数据传输方式/套接字类型,常用的有 SOCK_STR...

    ManInRoad
  • 【玩转ESP32】3、点亮LED,Blink,blink,blink

    对idf里面的demo进行改造,在examples\get-started\blink里面更改GPIO口:

    ManInRoad
  • ESP32应用指南

    想当年,安信可公司推出一款低成本的WIFI模块(基于乐鑫公司的ESP8266芯片)之后,火了一段时间。这个模块是支持AT指令和SDK两种开发方式。

    全栈程序员站长
  • 【玩转ESP32】6、驱动i2c设备

    ManInRoad
  • MicroPython 玩转硬件系列4:串口小实验

    本篇介绍ESP32上通过MicroPython实现串口数据的收发。

    用户2366192
  • 【玩转ESP32】10、创建用户分区表,数据读写存储

    在终端中输入 idf.py menuconfig,进入menuconfig界面,依次选择Partition Table—>选中Custom partition ...

    ManInRoad
  • ROS2与Arduino串口和WiFi测试记录(Due和ESP32)

    ROS2与Arduino调试有成熟方案,一年多前写过一篇博文详细记录,现在相关物联网单片机课程(ESP32)已经开发和测试完成,将之前的再回顾一遍吧(本文不含R...

    zhangrelay
  • TT无人机 Arduino环境探索

    本来是一篇MATLAB控制Tello无人机的文章,可惜没有保存上。只好写一篇这样的文章了。

    云深无际
  • ESP32播放bad apple视频

    SPIFFS Upload Plugin:https://github.com/me-no-dev/arduino-esp32fs-plugin

    ManInRoad

扫码关注腾讯云开发者

领取腾讯云代金券