当前位置: 首页 > article >正文

SOC-ESP32S3部分:18-串口

飞书文档https://x509p6c8to.feishu.cn/wiki/NqrMw6X8Si6sSqkyPbxcFRxGnid

UART全称是通用异步接收器/发送器,ESP32-S3 芯片有 3 个 UART 控制器。每个 UART 控制器可以独立配置波特率、数据位长度、位顺序、停止位位数、奇偶校验位等参数。

串口文档参考:

https://docs.espressif.com/projects/esp-idf/zh_CN/v5.4/esp32s3/api-reference/peripherals/uart.html

串口的使用分三步:

  1. 配置串口参数
  2. 设置串口管脚
  3. 安装驱动程序

配置串口参数

串口参数配置一般有两种方式,使用结构体一次性配置所有参数,或者使用API函数,逐个设置,可以根据具体情况灵活使用。

一次性配置有参数

调用函数 uart_param_config并向其传递 uart_config_t结构体,

uart_param_config用于配置 UART 的参数,包括波特率、数据位、校验位、停止位、流控和时钟源。
esp_err_t uart_param_config(uart_port_t uart_num, const uart_config_t *uart_config);参数说明
uart_num (uart_port_t):指定要配置的 UART 端口号。ESP32 支持多个 UART 端口,通常使用 UART_NUM_0、UART_NUM_1 或 UART_NUM_2。
uart_config (const uart_config_t *):指向 uart_config_t 结构体的指针,包含要配置的 UART 参数。
返回值
ESP_OK: 成功配置 UART 参数。

uart_config_t 结构体应包含所有必要的参数。请参考以下示例。

    //配置 UART 参数,包括波特率、数据位、校验位、停止位、流控和时钟源。const 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_DEFAULT,};//应用 UART 参数配置。uart_param_config(UART_NUM_0, &uart_config);

分步依次配置每个参数

调用下表中的专用函数,能够单独配置特定参数。如需重新配置某个参数,也可使用这些函数。 

配置参数函数
波特率uart_set_baudrate()
传输位调用 uart_set_word_length() 设置 uart_word_length_t
奇偶控制调用 uart_parity_t 设置 uart_set_parity()
停止位调用 uart_set_stop_bits() 设置 uart_stop_bits_t
硬件流控模式调用 uart_set_hw_flow_ctrl() 设置 uart_hw_flowcontrol_t
通信模式调用 uart_set_mode() 设置 uart_mode_t

设置串口管脚

通信参数设置完成后,可以配置其他 UART 设备连接的 GPIO 管脚。调用函数uart_set_pin,指定配置 Tx、Rx、RTS 和 CTS 信号的 GPIO 管脚编号。在ESP32S3中,串口IO可以通过软件配置到指定IO上,这使得我们在设计硬件电路时,非常灵活。

我们的板卡中,会使用GPIO43 GPIO44作为串口的TX和RX

uart_set_pin用于配置 UART 的引脚,该函数允许你指定 UART 的 TX(发送)和 RX(接收)引脚,
以及其他可选的 RTS(请求发送)和 CTS(清除发送)硬件流控引脚。函数原型
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_port_t):
指定要配置的 UART 端口号。ESP32 支持多个 UART 端口,
通常使用 UART_NUM_0、UART_NUM_1 或 UART_NUM_2。tx_io_num (int):
指定 TX(发送)引脚的 GPIO 编号。rx_io_num (int):
指定 RX(接收)引脚的 GPIO 编号。rts_io_num (int):
指定 RTS(请求发送)引脚的 GPIO 编号。如果不需要使用 RTS 引脚,可以设置为 UART_PIN_NO_CHANGEcts_io_num (int):
指定 CTS(清除发送)引脚的 GPIO 编号。如果不需要使用 CTS 引脚,可以设置为 UART_PIN_NO_CHANGE返回值
ESP_OK: 成功配置 UART 引脚。

使用参考

例如:设置串口0,对应的IO为TX: IO4, RX: IO5
uart_set_pin(UART_NUM_0, 4, 5, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);

安装驱动程序

通信管脚设置完成后,请调用 uart_driver_install 安装驱动程序并指定以下参数:

  • UART 控制器编号
  • Tx 环形缓冲区的大小
  • Rx 环形缓冲区的大小
  • 指向事件队列句柄的指针
  • 事件队列大小
  • 分配中断的标志

该函数将为 UART 驱动程序分配所需的内部资源。

uart_driver_install 用于安装和初始化 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_num (uart_port_t):指定要初始化的 UART 端口号。ESP32 支持多个 UART 端口,通常使用 UART_NUM_0、UART_NUM_1 或 UART_NUM_2。
rx_buffer_size (int):接收缓冲区的大小(以字节为单位)。如果设置为 0,则不使用接收缓冲区。
tx_buffer_size (int):发送缓冲区的大小(以字节为单位)。如果设置为 0,则不使用发送缓冲区。
queue_size (int):事件队列的大小。如果设置为 0,则不使用事件队列。
uart_queue (QueueHandle_t *):指向 QueueHandle_t 类型的指针,用于存储事件队列的句柄。如果 queue_size 为 0,则此参数可以为 NULL。
intr_alloc_flags (int):
中断分配标志,用于配置中断的属性。常见的取值包括:
ESP_INTR_FLAG_LEVEL1: 设置中断优先级为 1。
ESP_INTR_FLAG_LEVEL2: 设置中断优先级为 2。
ESP_INTR_FLAG_LEVEL3: 设置中断优先级为 3。
ESP_INTR_FLAG_LEVEL4: 设置中断优先级为 4。
ESP_INTR_FLAG_LEVEL5: 设置中断优先级为 5。
ESP_INTR_FLAG_LEVEL6: 设置中断优先级为 6。
ESP_INTR_FLAG_IRAM: 将中断处理程序和相关数据放在 IRAM 中,确保在 flash 休眠模式下仍能正常工作。
ESP_INTR_FLAG_SHARED: 允许多个中断源共享同一个中断处理程序。
返回值
ESP_OK: 成功安装 UART 驱动程序。

使用参考

例如:配置接收缓冲区大小为 1024,不使用发送缓冲区,不使用消息队列。
uart_driver_install(UART_NUM_0, 1024, 0, 0, NULL, 0);例如:配置接收缓冲区大小为 1024,发送缓冲区大小为512,使用消息队列,消息队列大小为10。
QueueHandle_t uart_queue;
uart_driver_install(UART_NUM_0, 1024, 512, 10, &uart_queue, 0);
使用队列参考:
esp-idf/examples/peripherals/uart/uart_events

最终程序

我们创建了两个任务,一个用于发送,一个用于接收

  • 发送任务每间隔2S往UART0发送字符串Hello world
  • 接收任务轮询读取接收缓冲区的数据,一旦读取到数据马上进行打印

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_log.h"
#include "driver/uart.h"
#include "string.h"
#include "driver/gpio.h"static const char *TAG = "UART"; // 定义日志标签static const int RX_BUF_SIZE = 1024;#define TXD_PIN (GPIO_NUM_43)
#define RXD_PIN (GPIO_NUM_44)
#define UART_NUM (UART_NUM_1)void init(void)
{//配置 UART 参数,包括波特率、数据位、校验位、停止位、流控和时钟源。const 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_DEFAULT,};//应用 UART 参数配置。uart_param_config(UART_NUM, &uart_config);//设置 UART 引脚,指定 TX 和 RX 引脚,其他引脚保持不变。uart_set_pin(UART_NUM, TXD_PIN, RXD_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);//安装 UART 驱动程序,配置接收缓冲区大小为 RX_BUF_SIZE * 2,不使用发送缓冲区。uart_driver_install(UART_NUM, RX_BUF_SIZE * 2, 0, 0, NULL, 0);
}static void tx_task(void *arg)
{while (1) {//发送字符串 "Hello PC"。char data[] = {"Hello PC"};const int len = strlen(data);//发送指定长度的数据到 UART。uart_write_bytes(UART_NUM, data, len);vTaskDelay(2000 / portTICK_PERIOD_MS);}
}static void rx_task(void *arg)
{uint8_t* data = (uint8_t*) malloc(RX_BUF_SIZE + 1);while (1) {// 从 UART 读取数据,最多读取 RX_BUF_SIZE 字节,等待时间最多 1000 毫秒(1 秒)。const int rxBytes = uart_read_bytes(UART_NUM, data, RX_BUF_SIZE, 1000 / portTICK_PERIOD_MS);if (rxBytes > 0) {//在接收到的数据末尾添加空字符,使其成为有效的 C 字符串。data[rxBytes] = 0;ESP_LOGI(TAG, "Read %d bytes: %s", rxBytes, data);}vTaskDelay(10 / portTICK_PERIOD_MS);}free(data);
}void app_main(void)
{init();//rx_task: 任务名称为 "uart_rx_task",堆栈大小为 2048 字节。xTaskCreate(rx_task, "uart_rx_task", 1024 * 2, NULL, 1, NULL);//tx_task: 任务名称为 "uart_tx_task",堆栈大小为 2048 字节。 xTaskCreate(tx_task, "uart_tx_task", 1024 * 2, NULL, 1, NULL);while (1){vTaskDelay(pdMS_TO_TICKS(1000));}
}

然后把板卡的串口线接上,下图蓝色的线:

运行后,打开串口调试软件就可以接收到来自板卡的数据。

串口助手点击发送后,调试端会打印出接收到的hello ESP32数据,当然了,因为ESP32S3默认使用UART0作为日志口,所以UART0也会打印启动日志和hello ESP32

如果你不希望这个串口打印日志信息,那你可以绑定GPIO_NUM_43和GPIO_NUM_44到其它串口,例如UART_NUM_1上。

#define TXD_PIN (GPIO_NUM_43)
#define RXD_PIN (GPIO_NUM_44)
#define UART_NUM (UART_NUM_1)

相关文章:

SOC-ESP32S3部分:18-串口

飞书文档https://x509p6c8to.feishu.cn/wiki/NqrMw6X8Si6sSqkyPbxcFRxGnid UART全称是通用异步接收器/发送器,ESP32-S3 芯片有 3 个 UART 控制器。每个 UART 控制器可以独立配置波特率、数据位长度、位顺序、停止位位数、奇偶校验位等参数。 串口文档参考&#xf…...

CSS 样式表的四种应用方式及css注释的应用小结

CSS样式表的四种应用方式及注释应用小结 一、样式表应用方式 内联样式&#xff08;行内样式&#xff09; <div style"color: #ff0000; font-size: 16px;">示例文本</div>特点&#xff1a;直接写在HTML标签的style属性中优先级&#xff1a;最高&#xff…...

五、web安全--XSS漏洞(2)--XSS相关payload

XSS 主要是针对网页客户端的一种攻击&#xff0c;那么就要执行 JavaScript 代码&#xff0c;那么无疑需要用到 JavaScript 语言以及在 HTML 中可以解析 JavaScript 代码的标签。 1、标签类 &#xff08;1&#xff09;script <script></script>标签是最直接的 xS…...

AI架构师的新工具箱:ChatGPT、Copilot、AutoML、模型服务平台

AI架构师不仅要懂架构、懂AI服务,还需要具备使用AI工具提升工作效率的能力。新一代AI工具已经成为架构师不可或缺的“工具箱”,帮助他们更高效地进行设计、部署、编码与优化。 以下介绍几类代表性工具,并说明它们在实际架构工作中的应用场景。 一、ChatGPT:生成架构设计文…...

关于智能体接入后端,在Apifox能够传参数给智能体的测试

from flask import Flask, request, jsonify, render_template import requests import json # 用于解析嵌套的 JSON 字符串app Flask(__name__)COZE_BOT_ID 7508736911423963162 COZE_API_KEY pat_cHXqrFzcvtktfmmlp4pjF3O2qmjioQW46uU8UNbUugyvSlFZclklpunc53DbR8ws COZE…...

有铜半孔工艺的制造难点与工艺优化

技术难点剖析 有铜半孔工艺在制造过程中面临多重挑战&#xff0c;主要集中在材料加工精度、孔壁完整性及良率控制三个方面&#xff1a; 铜层翘起与毛刺残留 半孔成型时&#xff0c;铣刀高速切割可能导致孔壁铜层被拉扯&#xff0c;产生翘起或残留铜屑&#xff0c;影响导电性能…...

python分步合并处理excel数据

文章目录 概要整体架构流程技术名词解释技术细节小结概要 客户需求 1. 背景与目标 用户需要将三个包含农业实验数据的Excel表格(AK、AN、AP)合并为一个结构化数据集,用于后续分析。每个表格包含相同类型的字段(如对照组与PSB处理组的样本数、均值、标准差),但需通过字…...

MC0309魔法项链

思路&#xff1a; 以数位贡献的思路来写这题&#xff0c; 统计每一位上为 1 的个数&#xff1a; 对于第 k 位&#xff0c;统计有多少个数在这一位上为 1&#xff0c;记作 cnts[k] 枚举每个数&#xff0c;逐位分析它对整体的贡献&#xff08;即与其它数交互时的和&#xff09;…...

为 Ubuntu 安装的软件创建桌面图标

如何为 Ubuntu 安装的软件创建桌面图标&#xff08;.desktop 启动器&#xff09; 在 Ubuntu 或其他 Linux 发行版中&#xff0c;我们常常通过压缩包&#xff08;如 .tar.gz&#xff09;或官方二进制方式安装软件。这种安装方式虽然灵活方便&#xff0c;但默认并不会将软件添加…...

uni-app 中开发问题汇总

uni-app 中 echarts 中的点击事件失效&#xff1f; 在 main.js 中 设置 window.wx{}&#xff0c;这个方式&#xff0c;如果需要调 wx 中的方法会失效&#xff08;如果默认后续不会调 wx 中的方法推荐使用&#xff09; 降低版本&#xff0c;安装一个低版本的&#xff0c;比如&a…...

https下git拉取gitlab仓库源码

git init 创建仓库 参考下面创建公私秘钥对 注意不要以root用户身份创建公私钥&#xff0c;确保保存在/home/username GitLab配置ssh key - 阿豪聊干货 - 博客园 Your identification has been saved in /home/xxx/.ssh/id_ed25519 Your public key has been saved in /ho…...

距离计算范围查找距离排序

一 使用场景 目前基于某个位置查附近的人&#xff0c;附近的商家等等&#xff0c;查出来的结果添加距离&#xff0c;或者查附近多大范围内的人或者商家&#xff0c;然后按距离排序已经是IT界一个很通用的功能了。 二 距离计算搜索(百万点集以下) 2.1 球的定义 2.2 两点之…...

PS linux 基础篇1-AXI_DMA

系列文章目录 文章目录 系列文章目录前言一、AXI DMA ip核二、BD工程三、PS linux工程1.使用开源的xilinx_axidma-master工程验证驱动2.按照其他的开源进行就行&#xff0c;没什么写的了 前言 PL与PS之间快速的接口&#xff0c;本文为LOOP回环测试 一、AXI DMA ip核 MM2S mem…...

AI大模型学习三十、ubuntu安装comfyui,安装插件,修改返回405 bug,值得一看喔

一、说明 ComfyUI是一个开源的、基于节点的Web应用。它允许用户根据一系列文本提示&#xff08;Prompt&#xff09;生成图像。 ComfyUI使用扩散模型作为基础模型&#xff0c;并结合 ControlNet、Lora和LCM低阶自适应等模型&#xff0c;每个工具都由程序中的一个节点表示 二、开…...

11高可用与容错

一、Broker 高可用架构设计 1.1 RabbitMQ 镜像集群方案 集群搭建步骤 # 节点1初始化 rabbitmq-server -detached rabbitmq-plugins enable rabbitmq_management# 节点2加入集群 rabbitmqctl stop_app rabbitmqctl join_cluster rabbitnode1 rabbitmqctl start_app# 创建镜像…...

百度之星2024 初赛第一场 补给

百度之星2024 初赛第一场 补给 题干描述问题分析&#xff1a;C代码Java代码&#xff1a;Python代码补充说明&#xff1a; 题干描述 参考自马蹄集OJ&#xff0c;原文链接1 可怕的战争发生了&#xff0c;小度作为后勤保障工作人员&#xff0c;也要为了保卫国家而努力。 现在有 …...

Collection集合遍历的三种方法

1.foreach循环遍历 格式&#xff1a;for&#xff08;元素的数据类型 变量名&#xff1a;数组或集合&#xff09;{ } 2.使用迭代器遍历 方法名称&#xff1a;Iterator<E> iterator&#xff08;&#xff09; 说明&#xff1a;返回集合中的迭代器对象&#xff0c;该迭代…...

Taro on Harmony C-API 版本正式开源

Taro 是由京东发起并维护的开放式跨端跨框架解决方案&#xff0c;支持以 Web 的开发范式来实现小程序、H5、原生 APP 的跨端统一开发&#xff0c;从 18 年开源至今&#xff0c;在 GitHub 已累计获得 36,000 Stars。 Taro x 纯血鸿蒙 在过去的一年中&#xff0c;Taro 经历了显…...

知识隔离的视觉-语言-动作模型:训练更快、运行更快、泛化更好

25年5月来自PI的论文“Knowledge Insulating Vision-Language-Action Models: Train Fast, Run Fast, Generalize Better”。 视觉-语言-动作 (VLA) 模型通过将端到端学习与来自网络规模视觉-语言模型 (VLM) 训练的语义知识迁移相结合&#xff0c;为机器人等物理系统训练控制策…...

[ARM][架构] 02.AArch32 程序状态

目录 参考资料 1.程序状态 - PSTATE 2.用户模式的 PSTATE 信息 2.1.状态标志 2.2.溢出/饱和标志 2.3.大于等于标志 2.4.指令集状态 2.5.IT 块状态 2.6.端序控制 2.7.指令执行时间控制 3.用户模式访问 PSTATE - APSR 寄存器 4.系统模式的 PSTATE 信息 4.1.状态标志…...

Dockerfile正确写法之现代容器化构建的最佳实践

前言 在容器化的世界里,Dockerfile是构建镜像的核心,但你真的确定自己写的Dockerfile是最佳实践吗?根据我多年的容器化经验,大多数开发者编写的Dockerfile存在效率低下、安全隐患和维护困难等问题。本文将分享现代容器化环境中Dockerfile的正确编写方式,帮助你构建更高效…...

React---day4

3、React脚手架 生成的脚手架的目录结构 什么是PWA PWA全称Progressive Web App&#xff0c;即渐进式WEB应用&#xff1b;一个 PWA 应用首先是一个网页, 可以通过 Web 技术编写出一个网页应用&#xff1b;随后添加上 App Manifest 和 Service Worker 来实现 PWA 的安装和离线…...

ArkUI(方舟UI框架)介绍

ArkUI&#xff08;方舟UI框架&#xff09;介绍 构建快速入门 使用ArkWeb构建页面...

【Bug】定时任务中 Jpa Save 方法失效

【Bug】定时任务中 Jpa Save 方法失效 首先说一下问题&#xff0c;在定时任务中调用 jpa 的 save 方法没有效果&#xff0c;但是通过外界调用&#xff0c;比如 controller 中注入 service 来调用是可以的&#xff0c;真是巨巨巨离谱&#xff0c;我被折磨了好几天。 我这个问题…...

英语科研词汇现象及语言演变探讨

一、词汇形态学的进化困境 希腊-拉丁语系遗存 "Pneumoconiosis"&#xff08;πνεύμωνκονίαωσις&#xff09;和"electroencephalogram"&#xff08;ηλεκτρονεγκέφαλοςγράμμα&#xff09;的构词方式反映了欧洲学者对古…...

C# 打印PDF的常用方法

这里先提供一个helper类的模板 1.使用默认程序打印 using System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing.Printing; using System.IO; using System.Runtime.InteropServices;namespace PDF {public static class PrintHelper{#…...

若依微服务的定制化服务

复制依赖 复制依赖 复制system服务的bootstrap.yml文件&#xff0c;修改port和name 在nacos复制一个新的nacos配置&#xff0c;修改对应的nacos的配置 &#xff0c;可能不需要修改&#xff0c;看情况。 网关修改 注意curd的事项&#xff0c;模块名称的修改...

Axios 如何通过配置实现通过接口请求下载文件

前言 今天&#xff0c;我写了 《Nodejs 实现 Mysql 数据库的全量备份的代码演示》 和 《NodeJS 基于 Koa, 开发一个读取文件&#xff0c;并返回给客户端文件下载》 两篇文章。在这两篇文章中&#xff0c;我实现了数据库的备份&#xff0c;和提供数据库下载等接口。 但是&…...

小表驱动大表更快吗,不是

背景 head头表&#xff08;5000&#xff09;&#xff0c;line行表&#xff08;15万&#xff09;&#xff0c;导出数据包含头和行&#xff0c;一对多。 以行表为维度导出15万数据。 sql 如下两个sql查询&#xff0c;有如下差异 驱动方式&#xff1a;第一个大表驱动小表&…...

20250529-C#知识:运算符重载

C#知识&#xff1a;运算符重载 运算符重载能够让我们像值类型数据那样使用运算符对类或结构体进行运算&#xff0c;并且能够自定义运算逻辑。 1、运算符重载及完整代码示例 作用是让自定义的类或者结构体能够使用运算符运算符重载一定是public static的可以把运算符看成一个函…...