【实验】ESP32S3使用串口通信

实验简介

        本设计是直接在图灵哥ESP32S3探索板上完成的,板子集成度很丰富,因此我们就不用再外接任何设备了,非常方便。本实验实现开发板与PC上位机的通信,实现接收与发送。

开发平台简介

        ESP32S3是一款高性能、低功耗的Wi-Fi和蓝牙双模芯片,其串口资源丰富,非常适合用于物联网、智能家居等领域。ESP32S3拥有三个UART(通用异步收发传输器)接口,分别为UART0、UART1和UART2。

以下是ESP32S3串口资源和使用配置的简介

  1. UART0:主要用于日志打印和程序下载,支持最高2Mbps的波特率。UART0默认与ESP32S3的USB-to-UART桥接器连接,方便用户进行调试和通信
  2. UART1:可以作为通用串口使用,支持最高5Mbps的波特率。UART1可用于与其他设备进行通信,如传感器、蓝牙模块等
  3. UART2:同样可以作为通用串口使用,支持最高5Mbps的波特率。UART2可用于扩展ESP32S3的通信接口,实现与其他设备的互联

使用配置如下:

  1. 初始化串口:在代码中配置串口的波特率、数据位、停止位和校验位等参数
  2. 配置GPIO:将串口的TX(发送)和RX(接收)引脚映射到ESP32S3的GPIO上
  3. 开启串口中断:设置串口中断优先级,编写中断服务函数,用于处理接收到的数据
  4. 发送和接收数据:通过串口发送和接收数据,实现与其他设备的通信

        ESP32S3的串口资源丰富,使用配置简单,而图灵哥探索板为开发者提供了便捷的开发平台,助力物联网和智能家居项目的开发本次实验我们用到UART0。

硬件资源介绍

  1. LED灯 - IO1
  2. 串口0 U0TX/U0RX连接在板载USB转串口芯片CH340上面

注意事项:

  • 电脑端串口调试助手波特率调节到与本程序相同的115200bps;
  • 可使用Arduino自带的串口监视器或其它串口调试助手;
  • 请用USB线连接在USB_UART,找到USB转串口后测试本例程;
  • 排针P4的U0TX/U0RX必须通过跳线帽连接在RXD/TXD上;

实验代码

uart.ino

/**
 ******************************************************************************
 * @file     04_uart.ino
 * @author   charles
 * @version  V1.0
 * @date     2024-09-20
 * @brief    串口实验
 ******************************************************************************
 * 
 * 实验平台:图灵哥 TRGESP32S3核心板
 * 实验目的:学习UART外设的使用,进行串口数据接收和发送
 *
 * 硬件资源及引脚分配: 
 * 1,  UART0 --> ESP32S3 IO
 *     TXD0 --> IO43
 *     RXD0 --> IO44
 * 
 * 实验现象:
 * 1, 打开串口调试助手,选择好串口、波特率115200等参数,按下RST键,打印芯片参数;在串口助手上发送数据,ESP32S3串口接收后回传到串口助手显示
 * 
 *
 ******************************************************************************
 */

#include "uart.h"


uint32_t chip_id = 0;       /* 芯片ID */

/**
 * @brief    当程序开始执行时,将调用setup()函数,通常用来初始化变量、函数等
 * @param    无
 * @retval   无
 */
void setup() 
{
    delay(1000);
    uart_init(0, 115200);   /* 串口0初始化 */

    for(int i = 0; i < 17; i = i + 8) 
    {
        chip_id |= ((ESP.getEfuseMac() >> (40 - i)) & 0xff) << i;       /* 获取ESP32芯片MAC地址(6Byte),该地址也可作为芯片ID */
    }

    Serial.printf("ESP32 Chip model = %s Rev %d \n", ESP.getChipModel(), ESP.getChipRevision());   /* 打印芯片类型和芯片版本号 */
    Serial.printf("This chip has %d cores \n", ESP.getChipCores());     /* 打印芯片的内核数 */
    Serial.print("Chip ID: "); Serial.println(chip_id);                 /* 打印芯片ID */
    Serial.printf("CpuFreqMHz: %d MHz\n", ESP.getCpuFreqMHz());         /* 打印芯片主频 */
    Serial.printf("SdkVersion: %s \n", ESP.getSdkVersion());            /* 打印SDK版本 */
}

/**
 * @brief    循环函数,通常放程序的主体或者需要不断刷新的语句
 * @param    无
 * @retval   无
 */
void loop()
{
    Serial.println("Waitting for Serial Data  \n");   /* 等待串口助手发过来的串口数据 */

    while (Serial.available() > 0)                    /* 当串口0接收到数据 */
    {
        Serial.println("Serial Data Available...");   /* 通过串口监视器通知用户 */

        String serial_data;                           /* 存放接收到的串口数据 */

        int c = Serial.read();                        /* 读取一字节串口数据 */
        while (c >= 0)
        {
            serial_data += (char)c;                   /* 存放到serial_data变量中 */
            c = Serial.read();                        /* 继续读取一字节串口数据 */
        }

        // serial_data = Serial.readString();            /* 将接收到的信息使用readString()存储于serial_data变量(跟前面4行代码具有同样效果) */
        Serial.print("Received Serial Data: ");       /* 然后通过串口监视器输出serial_data变量内容 */
        Serial.println(serial_data);               /* 以便查看serial_data变量的信息 */
    }

    delay(1000);
}

uart.cpp

/**
 ****************************************************************************************************
 * @file      uart.cpp
 * @author    charles
 * @version   V1.0
 * @date      2024-09-20
 * @brief     UART 驱动代码
****************************************************************************************************
 * @attention
 *
 * 实验平台:图灵哥 TRGESP32S3核心板
****************************************************************************************************
 */

#include "uart.h"

/**
* @brief       初始化UART
* @param       uartx:串口x
* @param       baud:波特率
* @retval      无
*/
void uart_init(uint8_t uartx, uint32_t baud) 
{
    if (uartx == 0)
    {
        Serial.begin(baud);                                   /* 串口0初始化 */
    }
    else if (uartx == 1)
    {
        Serial1.begin(baud, SERIAL_8N1, RXD_PIN, TXD_PIN);    /* 串口1初始化 */
    }
    else if (uartx == 2)
    {
        Serial2.begin(baud, SERIAL_8N1, RXD_PIN, TXD_PIN);    /* 串口2初始化 */
    }
}

uart.h

/**
****************************************************************************************************
 * @file      uart.h
 * @author    charles
 * @version   V1.0
 * @date      2024-09-20
 * @brief     UART 驱动代码
 ****************************************************************************************************
 *  @attention
 *
 * 实验平台:图灵哥 TRGESP32S3核心板
 *
****************************************************************************************************
 */

#ifndef __UART_H
#define __UART_H

#include "Arduino.h"

/* 引脚定义 */
/* 串口0默认已经使用了固定IO(GPIO19为U0TXD,GPIO20为U0RXD)  
 */
#define TXD_PIN      19
#define RXD_PIN      20

/* 函数声明 */
void uart_init(uint8_t uartx, uint32_t baud);   /* uart初始化函数 */

#endif

实验现象
打印芯片参数,打开串口调试助手,选择好串口,波特率115200等参数,在串口助手上发送数据,ESP32S3串口接收后回传到串口助手显示
注意事项:连接板子上的UART口,波特率选择115200

实验结果

实验到此结束,感谢观看。

Arduino 和 ESP32-S3 都是常见的微控制器平台,通过串口通信可以让这两个设备交换数据。以下是关于 Arduino 与 ESP32-S3 进行串口通信的一些基础信息: ### 硬件连接 1. **TX - RX**: 将 Arduino 的 TX (发送端) 引脚接到 ESP32-S3 的 RX (接收端),并将 ESP32-S3 的 TX 接到 Arduino 的 RX 上。 2. **共地(GND)**: 必须将两者的 GND 引脚相连以确保信号电压参考一致。 ### 软件设置 #### Arduino 在 Arduino IDE 中编写程序需要配置 `Serial` 对象,并指定波特率: ```cpp void setup() { Serial.begin(9600); // 初始化串口通信,设定波特率为9600 } void loop() { if(Serial.available()) { // 如果有从ESP传来的数据 int data = Serial.read(); // 读取数据 Serial.println(data); // 再把接收到的数据发回去测试回环 } } ``` #### ESP32-S3 对于 ESP32 使用的是 UART 模块处理串口通讯,在 Espressif IDF 或 Arduino 核心下都可以轻松操作: ```cpp #include <HardwareSerial.h> #define SERIAL_PORT Serial // 取决于实际使用的UART编号 void setup(){ SERIAL_PORT.begin(9600); } void loop(){ if(SERIAL_PORT.available()){ String msg = SERIAL_PORT.readString(); SERIAL_PORT.println("Received from Arduino:" + msg); }else{ delay(500); SERIAL_PORT.println("Hello Arduino!"); } } ``` 以上代码展示了简单的双向消息传递过程。 ### 注意事项 - 波特率应保持两端一致; - 数据格式如终止符、编码等需提前约定好; - 若涉及复杂协议则可以考虑引入库文件辅助解析;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值