【ESP32】ESP-IDF开发 | UART通用异步收发传输器+串口收发例程

news2025/2/22 15:44:04

1. 简介

        UART可以说是开发者使用得最多的外设之一了,打印log几乎都是使用串口来实现的。UART是一种异步全双工的通信方式,异步传输的特性使得它仅需2根线就可以完成全双工的传输,但这也要求发送端和接收端的速率、停止位、奇偶校验位等都要相同,通信才能成功。

        一个典型的UART帧开始于一个起始位,紧接着是有效数据,然后是奇偶校验位(可有可无),最后是停止位。 ESP32上的UART控制器支持多种字符长度和停止位。另外,控制器还支持软硬件流控和 DMA,可以实现无缝高速的数据传输。

2. 硬件架构

        ESP32中的UART有两个时钟源:80MHz APB_CLK和参考时钟REF_TICK,时钟源进来后会通过分频器调整到对应的频率,分频后的时钟会分别进到发送块和接收块。

        发送器和接收器都各自有一个FIFO来缓存数据,每个FIFO有128字节的空间,ESP32中3个UART设备会共享一块1KB大小的内存作为FIFO空间。获取FIFO数据除了通过CPU来实现,还可以通过内部DMA实现,以提高效率。

        UART设备也支持硬件流控和软件流控,以支持像RS-485、红外遥控等协议的开发。

3. 流控

3.1 硬件流控

        硬件流控主要通过输出信号rtsn_out和输入信号dsrn_in进行数据流控制。

        输出信号rtsn_out为高电平表示请求对方发送数据,rtsn_out为低电平表示通知对方中止数据发送直到rtsn_out恢复高电平。

        当UART检测到输入信号ctsn_in的沿变化时会产生UART_CTS_CHG_INT中断并且在发送完当前数据后停止接下来的数据发送。

        输出信号dtrn_out为高电平表示发送方数据已经准备完毕,UART在检测到输入信号dsrn_in 的沿变化时会产生UART_DSR_CHG_INT中断。软件在检测到中断后,通过读取UART_DSRN可以获取dsrn_in的输入信号电平,从而判断当前是否可以接收数据。

3.2 软件流控 

        软件流控主要通过在发送数据流中插入特殊字符以及在接收数据流中检测特殊字符来实现数据流控功能。

        软件可以通过置位UART_FORCE_XOFF来强制停止发送器发送数据,也可以通过置位UART_FORCE_XON来强制发送器发送数据。

        UART还可以通过传输特殊字符进行软件流控,当UART 接收的数据字节数超过UART_XOFF的阈值时,可以通过发送UART_XOFF_CHAR来告知对方停止发送数据。

        软件也可以在任意时候发送流控字符。置位UART_SEND_XOFF,发送器会在发送完当前数据之后插入发送一个UART_XOFF_CHAR;置位 UART_SEND_XON,发送器会在发送完当前数据之后插入发送一个UART_XON_CHAR。

4. 例程

        例程中使用ESP32的串口1和串口2,相互连接并实现数据收发。

#include "driver/gpio.h"
#include "driver/uart.h"
#include "freertos/FreeRTOS.h"
#include "esp_log.h"

#include <string.h>

#define TAG "app"

void app_main()
{
    uart_config_t uart_cfg = {0};

    uart_cfg.baud_rate = 115200,
    uart_cfg.data_bits = UART_DATA_8_BITS;  // 8位数据
    uart_cfg.parity = UART_PARITY_DISABLE;  // 无校检
    uart_cfg.stop_bits = UART_STOP_BITS_1;  // 1位停止位
    uart_cfg.flow_ctrl = UART_HW_FLOWCTRL_DISABLE;  // 无硬件流控
    uart_cfg.source_clk = UART_SCLK_DEFAULT;  // 默认时钟源,APB时钟

    /* 初始化串口1 */
    ESP_ERROR_CHECK(uart_driver_install(UART_NUM_1, 1024 * 2, 0, 0, NULL, 0));
    ESP_ERROR_CHECK(uart_param_config(UART_NUM_1, &uart_cfg));
    ESP_ERROR_CHECK(uart_set_pin(UART_NUM_1, 17, 18, -1, -1));

    /* 初始化串口2 */
    ESP_ERROR_CHECK(uart_driver_install(UART_NUM_2, 1024 * 2, 0, 0, NULL, 0));
    ESP_ERROR_CHECK(uart_param_config(UART_NUM_2, &uart_cfg));
    ESP_ERROR_CHECK(uart_set_pin(UART_NUM_2, 21, 22, -1, -1));

    const char *str = "Hello, World!";
    while (1) {
        /* 串口1发送 */
        int send_len = uart_write_bytes(UART_NUM_1, str, strlen(str));
        ESP_LOGI(TAG, "Send %d bytes, data: %s", send_len, str);
        uart_wait_tx_done(UART_NUM_1, portMAX_DELAY);
        /* 串口2接收 */
        char buf[128] = {0};
        int read_len = uart_read_bytes(UART_NUM_2, buf, 128, 100 / portTICK_PERIOD_MS);
        if (read_len >= 0) {
            ESP_LOGI(TAG, "[UART2] Receive %d bytes, data: %s", read_len, buf);
        } else {
            ESP_LOGE(TAG, "[UART2] Receive data timeout");
        }

        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
}

        先初始化uart_config_t结构体,我设置的是常见的115200波特率,无校检,1位停止位,时钟为APB时钟。

        uart_driver_install注册串口设备,参数1为串口号;参数2和3是接收和发送缓冲区大小,缓冲区的大小必须大于FIFO的大小,发送缓冲区可以为0,我设置接收缓冲区2KB,无发送缓冲;参数4和5是消息队列的大小和句柄,可以通过它来接收串口的事件数据;参数6是注册标志,一般默认为0即可。

        uart_param_config配置串口通信参数;uart_set_pin配置串口引脚,参数依次为发送管脚、接收管脚、RTS管脚和CTS管脚,管脚不用的话设置为-1

        uart_write_bytes发送数据,如果发送缓冲区为0,那么所有数据压入发送FIFO就会返回;如果发送缓冲区不为0,那么所有数据复制进缓冲区时就会返回。其实无论哪一种情况,函数返回都不能保证数据一定完全发送了,所以最好后面调uart_wait_tx_done等串口完全发送再执行下一步操作。

        使用uart_read_bytes接收串口数据,最后一个参数可以设置等待时长,我这里是等待100ms。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2163937.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

.NET 高级音频处理利器 NAudio 库

目录 前言 项目介绍 项目说明 常用类 常用接口 项目示例 1、创建项目 2、NuGet安装 NAudio 与 NAduio.Core包 3、使用说明 4、录制文件代码 5、播放文件代码 6、注意 项目总结 最后 前言 NAudio 是一个开源音频库&#xff0c;用于在 C# 应用程序中处理音频。 它…

IoTDB 论文入选三大数据库顶会:ICDE、SIGMOD、VLDB 收录自研成果!

2024 三大顶会收录“成就” 随着数据库领域三大国际顶级会议 ICDE、SIGMOD、VLDB 2024 会议落幕&#xff0c;我们骄傲的宣布 Apache IoTDB 团队成员的多篇论文均被收录&#xff01;其研究成果均已在 IoTDB 实现&#xff0c;或基于 IoTDB 进行了性能评估。 以下整理收录论文名称…

过来人谈谈:我是如何师通过软考高级系统架构设计师的?

一丶关于教材内容 虽然系统架构设计师要考的内容远远不止于考试教材&#xff0c;但是熟读教材内容依然有必要的。 2022年&#xff0c;我利用一些碎片时间走马观花式地翻了一遍教材内容&#xff08;《系统架构设计师教程》和《系统架构设计师考试全程指导》&#xff09;&#…

网络事件管理

网络事件管理是运行组织 IT 网络不可或缺的一部分&#xff0c;网络事件管理的最终目标很简单&#xff1a;在发生中断时尽快恢复服务或功能。但是为了高效和一致地进行&#xff0c;IT 运营团队需要时刻保持警惕&#xff0c;不断了解网络事件&#xff0c;并且必须系统地遵循一套程…

除氟剂在芯片行业的应用

除氟剂在芯片行业的应用主要体现在对含氟废水的处理上。芯片生产过程中&#xff0c;特别是在湿法工序中&#xff0c;常用氢氟酸或BOE&#xff08;Buffered Oxide Etch&#xff0c;缓冲氧化物刻蚀液&#xff09;等化学物质进行刻蚀和清洗&#xff0c;这些过程会产生含有氟离子的…

如何避免U盘重要数据泄露?U盘加密方法推荐

随着科技的不断发展&#xff0c;U盘已经成为我们日常生活中不可或缺的存储工具。然而&#xff0c;由于U盘体积小巧、携带方便&#xff0c;一旦丢失或被他人恶意使用&#xff0c;重要数据泄露的风险极大。为了避免这种情况发生&#xff0c;我们需要对U盘进行加密&#xff0c;确保…

什么是组态、组态的应用场景介绍

随着计算机技术和工业自动化水平迅速提高&#xff0c;而车间现场种类繁杂的控制设备和过程监控装置使得传统的工业控制软件无法满足用户的各种需求。在“组态”概念出现之前&#xff0c;工程技术人员需要通过编写程序来实现某一任务&#xff0c;不但工作量大、周期长&#xff0…

C++之 string(中)

C之 string string类对象的容量操作 resize 将有效字符的个数该成n个&#xff0c;多出的空间用字符c填充 虽然在string里用的不多&#xff0c;但是在vector里面常见 这里有三种情况&#xff1a; 1&#xff09;resize小于当前的size 2)resize大于当前的size,小于capacity …

自适应企业网站建站系统源码 带完整的安装代码包以及搭建部署教程

系统概述 传统的建站方式往往需要耗费大量的时间和资源&#xff0c;而且对于非专业人士来说&#xff0c;操作难度较大。为了满足企业快速建站的需求&#xff0c;自适应企业网站建站系统源码应运而生。该源码的开发团队致力于打造一款功能齐全、易于操作的建站系统&#xff0c;…

PingCastle:一款针对活动目录AD的安全强化工具

关于PingCastle PingCastle是一款针对活动目录AD的安全强化工具&#xff0c;可以帮助广大研究人员提升活动目录的安全性&#xff0c;该工具甚至可以做到在 20% 的时间内实现 80% 的AD安全性。 Ping Castle 是一种旨在使用基于风险评估和成熟度框架的方法快速评估活动目录AD 安…

power bi制作各季度收入累加柱状图——日期表、calculate、datesytd

一、数据介绍&#xff1a; 2017-2019年订单销售收入数据&#xff08;订单日期&#xff0c;销售收入&#xff09; 二、效果展示&#xff1a; 三、操作步骤&#xff1a; 1、建立日期表 &#xff08;1&#xff09;建立原因 本次度量值编写需要运用到datesytd这一时间智能函数…

2024 IDEA软件 部署tomcat 十二步 运行web页面(html类似的)(中英文对照版本)新手小白易上手

目录 一、准备工作&#xff08;三必备&#xff09;&#xff1a; 1、自己的web项目 2、idea软件&#xff08;我是2023.1.2版本&#xff09; 3、tomcat X.X版本 二 、正式开始步骤&#xff0c;不废话&#xff01;&#xff01; 1、 点击菜单栏中 “File”&#xff08;文件&…

2024年双十一值得入手的好物有哪些?五大性价比拉满闭眼入好物盘点

随着2024年双十一购物狂欢节的临近&#xff0c;消费者们纷纷开始关注各类好物&#xff0c;期待在这一天能够以最优惠的价格入手心仪的商品&#xff0c;在这个特殊的时刻&#xff0c;我们为大家盘点了五大性价比拉满的闭眼入好物&#xff0c;这些产品不仅品质卓越&#xff0c;而…

geoserver发布shp地图

创建新的 存储仓库 file:///var/lib/tomcat9/webapps/geoserver/shp/shengdao/省道.shp 发布图层后&#xff0c;可以看到这个图层的重要attribute 复制&#xff0c;或者 创建新的样式style 这个属性比较讨厌 是 中文的 省 <sld:TextSymbolizer><sld:Label><og…

尚品汇-H5移动端整合系统(五十五)

目录&#xff1a; &#xff08;1&#xff09;运行前端页面 &#xff08;2&#xff09;启动前端页面 &#xff08;3&#xff09;添加搜索分类接口 &#xff08;4&#xff09;购物车模块修改 &#xff08;5&#xff09;登录模块 &#xff08;6&#xff09;订单模块 &#…

ubuntu安装libtorch

Ubuntu20.04安装libtorch 〇、前期准备1、查看NVIDIA显卡算力和CUDA版本支持的算力2、查看CUDA与显卡驱动的版本对应 一、NVIDIA显卡驱动安装1、下载显卡驱动2、安装驱动A. 安装依赖B. 禁用nouveau驱动C. 显卡驱动安装 3、参考 二、CUDA安装1、下载安装CUDA2、测试CUDA是否安装…

今年双11哪些东西值得买?分享五款实用耐用的好物,不再乱花钱!

随着一年一度的1111购物节脚步渐近&#xff0c;是否还在为挑选商品而犹豫不决&#xff1f;别担心&#xff0c;我们贴心整理了一份双十一必买好物推荐&#xff0c;专为追求品质生活的您量身打造。跟随这份清单&#xff0c;让您的数字生活更加丰富多彩&#xff0c;无需多虑&#…

四川财谷通信息技术有限公司抖音小店领域的新势力

在当今这个数字化浪潮汹涌的时代&#xff0c;电子商务已成为推动经济发展的重要引擎&#xff0c;而短视频平台抖音的崛起&#xff0c;更是为电商行业注入了前所未有的活力与机遇。在这片充满无限可能的蓝海中&#xff0c;四川财谷通信息技术有限公司凭借其敏锐的市场洞察力和强…

zabbix监控某特定进程是否挂掉

我现在已经在被监控机器&#xff08;A&#xff09;上装好了zabbix-agent&#xff0c;同时也在zabbix-server网页端添加了机器A 1&#xff0c;确定好要监控的进程 假如我想监控机器A上面的salt-minion这个进程&#xff0c;首先通过ps -ef 找到这个进程的命令启动行。 2&#x…

828华为云征文 | 云服务器Flexus X实例,Docker集成搭建FC-web模拟器

828华为云征文 | 云服务器Flexus X实例&#xff0c;Docker集成搭建FC-web模拟器 华为云端口放行 服务器放行对应端口9995 Docker安装并配置镜像加速 1、购买华为云 Flexus X 实例 Flexus云服务器X实例-华为云 (huaweicloud.com) 2、docker安装 yum install -y docker-ce3、验证…