【Platformio】基于Arduino框架的ESP32S3学习笔记1——串口0读取、输出和打印

一、准备工具

1、安装好platformio扩展的vscode

2、Esp32S3开发板(我这里用的是M5stack的CoreS3 SE)

二、软件部分

串口函数介绍

首先在ESP32有提供了三个UART,分别是UART0,UART1,UART2,分别对应了arduino库里的Serial,Serial1,Serial2。

Serial.begin(unsigned long baud)

串口的初始化函数,参数填所使用的波特率,常用115200。

void uart_init()
{
  Serial.begin(115200);
}

Serial.write(const char *buffer, size_t size)

串口的写函数,第一个参数是写入的数据内容,第二个是数据内容的长度,我这里为了方便阅读代码,另外做了函数封装

void uart_send(const char *str)
{
  Serial.write(str,strlen(str));
}

Serial.read(uint8_t *buffer, size_t size)

串口的读函数,用来读取缓冲区的数据

Serial.available()

用来判断串口接收缓冲区是否有可读数据,返回值是缓冲区数据的长度

Serial.printf()

串口打印函数,arduino库提供了三种串口打印函数,有Serial.print、Serial.printf、Serial.println
三者的区别如下:

Serial.print打印字符串(无自动换行)
Serial.println打印字符串(自动换行)
Serial.printf打印格式化字符串

这里常用到的是Serial.printf();

实验代码

const char str[] = {"hello world!\r\n"};

void uart_init()
{
  Serial.begin(115200);
}

void uart_send(const char *str)
{
  Serial.write(str,strlen(str));
}

void uart_transparent()
{
  if(Serial.available()>0)
  {
    u_char str[] = {0};
    u_char len = Serial.available();
    Serial.printf("Len: %d\r\n",len);
    Serial.read(str,len);
    Serial.write(str,len);

  }
}

void setup() {
  uart_init();
  
}

void loop() {
  uart_send(str);
  delay(500);
  uart_transparent();
}

以上代码实现了循环输出helloworld的字符串的同时,能够在串口接收到数据后转发出串口,具体效果如下截图
实验结果

### PlatformIOESP32 使用 Arduino 框架实现串口中断 在PlatformIO环境中,利用Arduino框架开发ESP32项目时,可以通过`HardwareSerial`类来处理串口通信,并注册回调函数以响应特定条件下的中断事件。下面是一个简单的例子展示如何设置串口中断[^1]。 #### 设置串口中断服务程序 (ISR) 为了使能串口中断,在初始化阶段需调用`attachInterrupt()`方法指定触发模式以及关联的处理逻辑: ```cpp void IRAM_ATTR handleSerialInterrupt() { // 这里放置需要快速执行的任务 } ``` 注意这里的`IRAM_ATTR`宏定义用于指示编译器将该函数放入内部RAM中以便更快访问,这对于实时性要求较高的场景非常重要[^1]。 #### 初始化配置 接着是在`setup()`函数内完成必要的硬件设定工作: ```cpp #include <Arduino.h> #define SERIAL_BAUD_RATE 9600 void setup() { Serial.begin(SERIAL_BAUD_RATE); // 配置并开启接收数据可用中断 Serial.setRxBufferSize(256); // 可选:增加缓冲区大小提高性能 attachInterrupt(digitalPinToInterrupt(UART_NUM_0), handleSerialInterrupt, RISING); delay(100); } void loop() {} ``` 上述代码片段展示了基本的初始化过程,其中包含了启动串口连接、调整输入队列容量(如果有必要),并通过`attachInterrupt()`绑定自定义的服务例程到UART接口上。当检测到上升沿信号变化即表示有新字符到达时就会激活对应的ISR[^1]。 #### 完整示例代码 以下是完整的平台IO工程文件结构及其源码清单: - **platformio.ini** ```ini [env:esp32dev] platform = espressif32 board = esp32dev framework = arduino lib_deps = None upload_speed = 921600 monitor_speed = 115200 build_flags = -DARDUINO_ESP32_INTERRUPTS=ON ``` - **src/main.cpp** ```cpp #include <Arduino.h> HardwareSerial mySerial(1); // 如果使用第二个串口则创建实例对象 volatile bool newDataFlag = false; char receivedChar; // ISR 函数前声明为外部变量 extern "C" void IRAM_ATTR onSerialDataAvailable() { if (mySerial.available()) { receivedChar = mySerial.read(); newDataFlag = true; } } void setup() { Serial.begin(115200); while (!Serial) continue; mySerial.begin(9600, SERIAL_8N1, RXD2, TXD2); mySerial.attach(onSerialDataAvailable, IrqType::RX_ANY); pinMode(LED_BUILTIN, OUTPUT); } void loop() { static unsigned long lastBlinkTime = millis(); if(newDataFlag){ Serial.printf("Received char &#39;%c&#39;\n", receivedChar); digitalWrite(LED_BUILTIN,!digitalRead(LED_BUILTIN)); lastBlinkTime = millis(); newDataFlag=false; } if(millis()-lastBlinkTime>1000 && !newDataFlag){ digitalWrite(LED_BUILTIN,HIGH); }else if(!newDataFlag){ digitalWrite(LED_BUILTIN,LOW); } } ``` 此案例演示了一个基于ESP32芯片通过Arduino库构建的应用程序,它能够监听来自辅助串行端口的数据流并在接收到有效字节后改变内置LED的状态作为反馈机制的一部分[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值