esp32UART串口外设(Arduino)

通用异步接收器/发送器 (UART)

介绍

通用异步接收器/发送器 (UART) 是一种硬件功能,它使用广泛采用的异步串行通信接口(如 RS232、RS422 和 RS485)处理通信(即时序要求和数据成帧)。UART提供了一种广泛采用且廉价的方法,可实现不同设备之间的全双工或半双工数据交换。

ESP32 芯片有 3 个 UART 控制器(也称为端口),每个控制器都具有一组相同的寄存器,以简化编程并提高灵活性。

每个UART控制器都可独立配置波特率、数据位长度、位排序、停止位数、奇偶校验位等参数。所有常规UART控制器都与不同制造商的UART设备兼容,还可以支持红外数据关联(IrDA)协议。

官方手册

功能概述

本文介绍了如何使用 UART 驱动的功能和数据类型在 ESP32 和其他 UART 设备之间建立通信。典型的编程工作流程分为以下几个部分:

  1. 设置通信参数 - 设置波特率、数据位、停止位等。

  2. 设置通信引脚 - 分配用于连接到设备的引脚

  3. 安装驱动程序 - 为 UART 驱动程序分配 ESP32 的资源

  4. 运行 UART 通信 - 发送/接收数据

  5. 使用中断 - 在特定通信事件上触发中断

  6. 删除驱动程序 - 如果不再需要 UART 通信,则释放已分配的资源

步骤 1 至 3 包括配置阶段。第 4 步是 UART 开始运行的地方。步骤 5 和 6 是可选的。

UART 驱动程序的函数使用 标识每个 UART 控制器。以下所有函数调用都需要此标识。

基于Arduino的UART串口概述

ESP323个UART串口,分别是UART0UART1UART2,其中UART0用于程序下载和信息交互,UART1专门用于Flash的读写

串口的初始化

void HardwareSerial::begin(unsigned long baud, uint32_t config, int8_t rxPin, int8_t txPin, bool invert, unsigned long timeout_ms, uint8_t rxfifo_full_thrhd)
  • unsigned long baud:波特率,表示每秒传输的位数。
  • uint32_t config:配置位,用于设置串口通信的一些选项,如数据位、停止位和奇偶校验等。
  • int8_t rxPin:接收引脚编号,用于连接接收器。
  • int8_t txPin:发送引脚编号,用于连接发射器。
  • bool invert:是否反转输入信号,如果为 true,则在接收时将信号反转。
  • unsigned long timeout_ms:超时时间(毫秒),当没有数据接收或发送时,该函数将等待指定的时间。
  • uint8_t rxfifo_full_thrhd:接收缓冲区满阈值,当接收缓冲区达到此值时,将触发中断。

以下是一个示例代码,演示如何使用 HardwareSerial::begin() 函数进行串口通信的初始化:

#include <HardwareSerial.h>// 创建硬件串口对象
HardwareSerial mySerial;void setup() {// 初始化串口通信mySerial.begin(9600, SERIAL_8N1, RX_PIN, TX_PIN, false, 1000);
}void loop() {// 检查是否有可用的数据if (mySerial.available()) {// 读取一个字节的数据char receivedChar = mySerial.read();// 处理接收到的数据// ...}
}

在Arduino中,还可以使用Serial对象来处理串口通信。默认情况下,Arduino有3个串口对象:Serial, Serial1Serial2

  • Serial:默认的串口对象
  • Serial1:第二个串口对象
  • Serial2:第三个串口对象

这些串口对象具有相同的方法和属性,可以用于配置串口通信、发送数据和接收数据等操作。以下是一个简单的示例代码,演示如何使用这些串口对象进行串口通信:

void setup() {// 初始化串口通信Serial.begin(9600);Serial1.begin(9600);Serial2.begin(9600);
}void loop() {}

串口的打印输出函数

Serial.print("hello world");
Serial.printf("hello world");
Serial.println("hello world");

Serial.print()Serial.println()Serial.printf()函数在Arduino编程中都被用于向串口输出数据,但它们之间存在一些主要的区别:

  1. Serial.print():这个函数会将参数转换为字符串并打印到串口,参数之间不会自动添加分隔符或换行符。
  2. Serial.println():此函数除了具有Serial.print()的功能外,还会在输出的末尾自动添加一个换行符。如果参数是字符串、数组或数字,则会将其转换为字符串然后输出。此外,当传入的参数是单个字符时,该函数还会输出该字符的ASCII编码值和一个换行符。
  3. Serial.printf():这个函数与C语言中的printf()函数类似,允许你使用格式化字符串来指定输出数据的格式。与前两者不同,Serial.printf()会将格式化后的字符串直接发送到串口,而不是逐个字符地打印。
void setup() {// 初始化串口通信Serial.begin(9600);
}void loop() {// 使用Serial.print()函数打印数据Serial.print("Hello, ");Serial.print("World!");// 使用Serial.println()函数打印数据Serial.println("Hello, World!");	//有回车换行Serial.println();	//回车换行Serial.println(14,HEX);	//以16进制打印输出数值14// 使用Serial.printf()函数打印数据int dat= 15;Serial.printf("Sensor Value: %d", dat);
}

串口的单字发送与接收

串口写单个字节
void Serial.write(uint8_t byte)
  • uint8_t byte:串口待发送的字节数据

在Arduino中使用Serial.write()函数来向串口写入单个字节示例:

void setup() {// 打开串口Serial.begin(9600);
}void loop() {// 要发送的字节数据byte data = 'A';// 将字节数据写入串口Serial.write(data);// 延时一段时间,以便观察输出结果delay(1000);
}
检测串口数据接收长度并读取串口缓冲区数据
int Serial.available()
int Serial.read()
  • Serial.available()函数。该函数返回可用的字节数,即从串口缓冲区中可以读取的数据长度。
  • Serial.read()函数。该函数从串口缓冲区中读取一个字节的数据,并将其作为整数返回。

示例:

void setup() {// 打开串口Serial.begin(9600);
}void loop() {// 检查是否有可用数据int availableBytes = Serial.available();// 如果有可用数据,则读取并处理if (availableBytes > 0) {// 读取数据char receivedData = Serial.read();// 处理数据(例如打印到串口监视器)Serial.print("Received data: ");Serial.println(receivedData);}
}

Serial.available()函数用于检测串口缓冲区中可用的字节数。如果返回值大于0,表示有可用数据,然后使用Serial.read()函数读取一个字节的数据,并进行相应的处理。

串口多字节发送与接收

串口写多个字节
size_t write(const char * buffer, size_t size)
  • buffer:要发送的字节数组指针
  • size:数组的长度
  • 函数的返回值是写入的字节数

Serial.write() 函数发送多个字节数组示例:

#include <Arduino.h>void setup() {// 初始化串口通信Serial.begin(9600);
}void loop() {// 定义要发送的字节数组byte data[] = {0x01, 0x02, 0x03, 0x04};// 获取字节数组的长度int length = sizeof(data) / sizeof(data[0]);// 通过串口发送字节数组Serial.write(data, length);// 延时一段时间,以便观察输出结果delay(1000);
}
串口读多个字节
size_t HardwareSerial::read(uint8_t *buffer, size_t size)
  • buffer 读取数据保存的数据缓冲区
  • size 将要读取的数据长度,单位为字节

要通过串口读取多个字节,可以使用Serial.available()函数来检查可用的字节数,然后使用Serial.read(buffer, size)函数读取多个字节。以下是一个示例代码:

#include <Arduino.h>void setup() {// 初始化串口通信Serial.begin(9600);
}void loop() {if (Serial.available() > 0) {// 创建字节数组来存储读取到的字节byte receivedData[64];delay(10);// 读取可用的字节数int  numBytes = Serial.available();// 逐个读取字节并存储到字节数组中Serial.read(receivedData,numBytes);// 处理接收到的数据//pas}
}

实训项目案例

1.单字节数据接收处理在发送

功能要求是接收通过串口(Serial)发送的数据,并将接收到的每个字节数据加1后重新发送回去。
代码:

#include <Arduino.h>void setup() {Serial.begin(115200);}void loop() {unsigned char dat;if(Serial.available()>0){dat=Serial.read();dat++;Serial.write(dat);}
}

效果:
在串口助手中发送1接收到2
在这里插入图片描述

2.多字节数据接收处理在发送

功能要求接收数据,并发送字符串的大小和字符串

代码:

#include <Arduino.h>void setup() {// 初始化串口通信Serial.begin(9600);
}void loop() {if (Serial.available() > 0) {// 创建字节数组来存储读取到的字节byte receivedData[64];delay(10);// 读取可用的字节数int  numBytes = Serial.available();// 逐个读取字节并存储到字节数组中Serial.read(receivedData,numBytes);// 处理接收到的数据(这里只是简单地打印出来)Serial.printf("Received len:%d",numBytes);Serial.println();Serial.print("Received data: ");Serial.write(receivedData, numBytes);Serial.println();Serial.print("-----------------------");Serial.println();}
}

效果:
在这里插入图片描述

3.串口字节命令控制灯光开关

#include <Arduino.h>
#define d2 2void setup() {//初始化灯光pinMode(d2,OUTPUT);//初始化UARTSerial.begin(115200);
}void loop() {//灯光的控制if(Serial.available()>0){uint8_t cmd=0;cmd=Serial.read();switch(cmd){case 0xA1:digitalWrite(d2,HIGH);Serial.println("d2 is ON!");break;case 0xA2:digitalWrite(d2,LOW);Serial.println("d2 is OFF!");break;default:Serial.println("输入命令错误");}}
}

在这里插入图片描述
发送A1,d2被点亮

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小白兼职做抖店,一个月能做到5000利润吗?抖店现状问题解答

我是王路飞。 全职状态下做抖店的话&#xff0c;精细化操作的单店月利润保守数据在10000-30000&#xff08;该数据来自醒醒团队内部学员一般水平下月营收数据均值&#xff0c;仅供参考&#xff09; 但如果是新手小白&#xff08;没有电商经验&#xff09;&#xff0c;且是兼职…

ES-极客学习第二部分ES 入门

基本概念 索引、文档、节点、分片和API json 文档 文档的元数据 需要通过Kibana导入Sample Data的电商数据。具体参考“2.2节-Kibana的安装与界面快速浏览” 索引 kibana 管理ES索引 在系统中找到kibana配置文件&#xff08;我这里是etc/kibana/kibana.yml&#xff09; vim /…

spring boot 自动扫描Controller、Service、Component原理

项目里面为什么不加上ComponentScan("com.yym.*")注解&#xff0c;也能加载到子目录里面的Controller&#xff0c;Service&#xff0c;Component的bean呢&#xff1f; 启动类没有ComponentScan注解 SpringBootApplication public class BootStrap {public static v…

【unity】基于Obi的绳/杆蓝图、绳杆区别及其创建方法

绳索 是通过使用距离和弯曲约束将粒子连接起来而形成的。由于规则粒子没有方向(只有位置)&#xff0c;因此无法模拟扭转效应(维基百科)&#xff0c;绳子也无法保持其静止形状。然而&#xff0c;与杆不同的是&#xff0c;绳索可以被撕裂/劈开&#xff0c;并且可以在运行时改变其…

java碳排放数据信息管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web碳排放数据信息管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环 境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为…

行为型设计模式——模板方法模式

学习难度&#xff1a;⭐ &#xff0c;比较常用 模板方法模式 在面向对象程序设计过程中&#xff0c;程序员常常会遇到这种情况&#xff1a;设计一个系统时知道了算法所需的关键步骤&#xff0c;而且确定了这些步骤的执行顺序&#xff0c;但某些步骤的具体实现还未知&#xff0…

【重学C语言】一、C语言简介

【重学C语言】一、C语言简介 什么是编程语言&#xff1f;编程语言 C语言发展史C语言标准变迁开发软件CLion安装步骤 VIsual Studio安装步骤 Clion 和 VS2022 绑定 电脑常识 什么是编程语言&#xff1f; 人类语言&#xff1a;语言就是人类进行沟通交流的表达方式&#xff0c;应…

鸿鹄云商B2B2C:JAVA实现的商家间直播带货商城系统概览

【saas云平台】打造全行业全渠道全场景的saas产品&#xff0c;为经营场景提供一体化解决方案&#xff1b;门店经营区域化、网店经营一体化&#xff0c;本地化、全方位、一站式服务&#xff0c;为多门店提供统一运营解决方案&#xff1b;提供丰富多样的营销玩法覆盖所有经营场景…

HarmonyOS 应用开发学习笔记 状态管理概述

移动端开发&#xff0c;最重要的一点就是数据的处理&#xff0c;并且正确的显示渲染UI。 变量在页面和组件、组件和组件之间有时候并不能实时共享&#xff0c;而有时候&#xff0c;又不需要太多的作用域&#xff08;节省资源&#xff09;&#xff0c;作用就需要根据不同场景&am…

Appium,多应用程序平台的 UI 自动化

Appium是一个开源的移动应用程序自动化测试工具&#xff0c;可以用于跨平台的UI自动化&#xff0c;包括iOS、Android、Web和Windows应用程序。它基于WebDriver协议&#xff0c;支持多种编程语言&#xff0c;如Java、Python、Ruby,Javascript、C#等。 Appium的设计理念是“一次…

ProtoBuf一些踩坑记录

一、Protobuf学习基础 学习的资料很多也很全&#xff0c;这里添加几个链接进行Protobuf的基础学习的链接&#xff0c;链接中的案例使用C编辑&#xff1a; 链接&#xff1a;Protobuf介绍及简单使用(上&#xff09;_google_protobuf_version-CSDN博客 Protobuf介绍及简单使用(下&…

[AutoSar]基础部分 RTE 03 C/S Port 同步/异步

目录 关键词平台说明一、C/S port interface 定义1.1在Davinci developer中的创建 二、同步调用和异步调用2.1 同步2.1.1同步code2.1.2同步处理时序图 2.2 异步2.2.1异步code2.2.2异步处理时序图2.2.2.1 poling2.2.2.2 waiting2.2.2.3none 三、server端的mapping到task详解 关键…

伦茨科技Apple Find My认证芯片-ST17H6x芯片

深圳市伦茨科技有限公司&#xff08;以下简称“伦茨科技”&#xff09;发布ST17H6x Soc平台。成为继Nordic之后全球第二家取得Apple Find My「查找」认证的芯片厂家&#xff0c;该平台提供可通过Apple Find My认证的Apple查找&#xff08;Find My&#xff09;功能集成解决方案。…

【unity小技巧】实现没有动画的FPS武器摇摆和摆动效果

文章目录 前言开始完结 前言 添加程序摇摆和摆动是为任何FPS游戏添加一些细节的非常简单的方法。但是并不是所以的模型动画都会配有武器摆动动画效果&#xff0c;在本文中&#xff0c;将实现如何使用一些简单的代码实现武器摇摆和摆动效果&#xff0c;这比设置动画来尝试实现类…

翻译:Building Efficient RAG Systems: A Deep Dive into devv.ai

RAG 的全称是&#xff1a;Retrieval Augmented Generation&#xff08;检索增强生成&#xff09; 最初来源于 2020 年 Facebook 的一篇论文&#xff1a;Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks&#xff08;是的&#xff0c;你没有看错&#xff0c;…

计算机网络-各层协议

大家在搞嵌入式开发的时候基本都了解过七层网络协议、五层网络协议、四层网络协议&#xff0c;那么今天让我们更加的深入了解一下&#xff1a; 历史发展介绍 OSI七层模型由ISO国际标准化组织提出的通信标准。TCP/IP四层模型是OSI七层模型的简化版&#xff0c;OSI在它被官方完…

网安入门13-文件上传(htaccess,其他绕过)

空格绕过&#xff0c;点号绕过 Pass-07 直接上传肯定是失败的 把文件名1.php改成1.php.或1.php_(下划线为空格)&#xff0c;这种命名方式在windows系统里是不被允许的&#xff0c;所以需要在burp之类里进行修改&#xff0c;然后绕过验证后&#xff0c;会被windows系统自动去掉…

【小工具】pixi-live2d-display,直接可用的live2d的交互网页/桌面应用

效果&#xff1a; <script src"https://cubism.live2d.com/sdk-web/cubismcore/live2dcubismcore.min.js"></script> <script src"https://cdn.jsdelivr.net/gh/dylanNew/live2d/webgl/Live2D/lib/live2d.min.js"></script> <…

vue element plus Typography 排版

我们对字体进行统一规范&#xff0c;力求在各个操作系统下都有最佳展示效果。 字体# 字号# LevelFont SizeDemoSupplementary text12px Extra SmallBuild with ElementBody (small)13px SmallBuild with ElementBody14px BaseBuild with ElementSmall Title16px MediumBuild w…

java SSM问卷调查系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM问卷调查管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代 码和数据库&#xff0c;系统主要采…