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.mzph.cn/news/609966.shtml

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

相关文章

Vue-9、Vue事件修饰符

1、prevent 阻止默认事件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>事件修饰符</title><!--引入vue--><script type"text/javascript" src"https://cdn.jsdeliv…

用html和css实现一个加载页面【究极简单】

要创建一个简单的加载页面&#xff0c;你可以使用 HTML 和 CSS 来设计。以下是一个基本的加载页面示例&#xff1a; HTML 文件 (index.html): <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"…

JavaScript中解锁Map和Set的力量

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》 ​ ​ ✨ 前言 ES6带来了Map和Set两个新的数据结构 - 它们分别用于存放键值对和唯一值。Map和Set提供了更…

深入浅出Go语言:匿名函数的原理和实践案例

深入浅出Go语言&#xff1a;匿名函数的原理和实践案例 引言匿名函数的基础实际应用案例一实际应用案例二性能考虑最佳实践与常见错误结语 引言 在Go语言的世界里&#xff0c;有一个功能强大且灵活的编程元素值得每位开发者深入了解——匿名函数。作为Go语言核心特性之一&#…

AI论文润色平台一览,让你的论文更加流畅易懂!

之前其实比较犹豫&#xff0c;是否应该整理一篇关于可辅助论文写作的在线平台的文章。因为论文这个事情&#xff0c;更重要的是要有个人的思考&#xff0c;要亲自动手写&#xff0c;这涉及到诚信的问题。然而&#xff0c;通过AI直接生成的论文可能很难通过查重和AI检测&#xf…

计算机二级WPS Office考试须知、如何备考、备考建议

本文从计算机二级考试须知、如何备考、备考建议以及考试的注意事项等方面进行讲述&#xff0c;认认真真看&#xff0c;对你受益匪浅。 一、计算机二级考试须知 2021年3月27日至29日将举办第60次全国计算机等级考试&#xff08;NCRE&#xff09;&#xff0c;从今年起&#xff0…

40-特殊运算符delete,new,.getDate,.setDate,运算符优先级

1.delete删除. 数组 // 可以删除数组元素&#xff0c;可以删除对象键值对// 删除数组的值&#xff0c;数组长度保持不变// 删掉的值变成emptyvar arr [1,2,3,4,5];delete arr[0];console.log(arr); 对象 var obj {"a":"aa","b":"bb&quo…

什么是云安全?如何保护云资源

云计算允许组织通过互联网按需向其客户、合作伙伴或员工提供关键业务应用程序、服务和资源。换句话说&#xff0c;不再需要物理维护资源。每当您通过 Internet 从计算机访问文件或服务时&#xff0c;您都是在访问云。 迁移到云可以帮助企业增强安全性、简化运营并降低成本。企…

理解接雨水算法

一、IDEA注释显示图片 在做题时&#xff0c;需要对照这图片&#xff0c;才能更好的梳理思路。 首先&#xff0c;注释里添加<img/>标签 之后&#xff0c;将鼠标光标放置在需要以阅读模式预览注释的地方&#xff0c;然后按快捷键CtrlAltQ即可 二、接雨水算法 先看接雨水…

【Spring实战】27 统一异常处理最佳实践

文章目录 1. 自定义异常2. 统一异常处理3. 配置4. 应用5. 启动类6. 启动服务7. 验证8. 优点总结 在 Spring 项目中&#xff0c;有效的异常处理是确保应用程序稳定性和用户体验的关键因素之一。通过实现统一异常处理&#xff0c;我们能够更好的管理和响应应用程序中的各种异常情…

Phi-2小语言模型QLoRA微调教程

前言 就在不久前&#xff0c;微软正式发布了一个 27 亿参数的语言模型——Phi-2。这是一种文本到文本的人工智能程序&#xff0c;具有出色的推理和语言理解能力。同时&#xff0c;微软研究院也在官方 X 平台上声称&#xff1a;“Phi-2 的性能优于其他现有的小型语言模型&#…

安卓(雷电)模拟器清除屏幕密码

1、设置磁盘可写 启动模拟器&#xff0c;然后在模拟器的设置界面&#xff0c;设置磁盘共享为可写入&#xff0c;重启模拟器&#xff0c;如下图&#xff1a; 2、找到模拟器目录 返回桌面&#xff0c;右键模拟器图标&#xff0c;打开文件所在目录&#xff0c;如下图&#xff1a…

javaWebssh校园物业管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh校园物业管理系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用 B/S模式开发。开发环境为TOMCAT7.…

如何申请api接口,快速对接数据源

申请API接口并快速对接数据源通常需要以下步骤&#xff1a; 寻找合适的API供应商&#xff1a;首先需要找到提供所需数据的API供应商&#xff0c;可以通过搜索引擎或者专业的API市场找到合适的API接口服务提供商。 注册并获取API密钥&#xff1a;在供应商的网站上注册账户&…

蓝牙物联网多个核心应用场景开发与应用细化分析

蓝牙物联网是指利用蓝牙技术将物理设备与互联网连接起来&#xff0c;实现设备之间的信息共享与互通。蓝牙物联网在各个领域得到了广泛应用&#xff0c;并且在未来有着巨大的发展潜力。本文将围绕蓝牙物联网的五大核心应用场景进行介绍&#xff0c;包括智能家居、智能健康、智能…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《考虑电氢耦合和碳交易的电氢能源系统置信间隙鲁棒规划》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 这标题涉及到一个复杂的能源系统规划问题&#xff0c;其中考虑了电氢耦合、碳交易和置信间隙鲁棒规划。以下是对标题各个部分的解读&#xff1a; 电氢耦…

矩阵中的最长递增路径

题目链接 矩阵中的最长递增路径 题目描述 注意点 不能 在 对角线 方向上移动或移动到 边界外&#xff08;即不允许环绕&#xff09; 解答思路 因为最长递增路径一定是连续的&#xff0c;所以想到使用深度优先遍历来做。如果只使用深度优先遍历会导致超时&#xff08;同一个…

MT6785安卓核心板_联发科MTK6785/Helio G95/曦力G95核心板定制

MT6785安卓核心板是基于MT6785(Helio G95)处理器&#xff0c;具备八核处理器结构&#xff0c;包括2颗主频为2.05GHz的Cortex A76处理器和6颗主频为2.0GHz的Cortex A55处理器&#xff0c;以及六颗Cortex-A55处理器。而在GPU方面&#xff0c;采用了Arm Mali-G76 MC4&#xff0c;频…

ESP32-Touch(Arduino)

Touch Touch传感器是一种外围设备&#xff0c;具有内部振荡器电路&#xff0c;可在固定时间段内测量相应GPIO引脚上的充电/放电频率。 因此&#xff0c;这些触摸传感器也被称为电容式传感器。例如&#xff0c;如果您触摸这些引脚中的任何一个&#xff0c;手指电荷将改变这个周…

MATHPILE:一个高质量的大规模的数学语料库

简介 MATHPILE&#xff1a;一个高质量、大规模的数学语料库&#xff0c;29 GB&#xff0c;包含约 95 亿个token。涵盖从 K-12 到大学、研究生水平和数学竞赛的内容&#xff0c;包括高质量教科书、讲义、科学论文等。提供详细的数据记录&#xff0c;包括数据集表格和质量注释&a…