esp32 串口2中断示例代码
时间: 2023-10-12 08:15:25 浏览: 284
以下是ESP32串口2中断的示例代码:
```c
#include <HardwareSerial.h>
// 创建一个Serial2对象
HardwareSerial Serial2(2);
// 定义串口2接收缓冲区和指针
#define SERIAL2_RX_BUF_SIZE 128
char serial2_rx_buf[SERIAL2_RX_BUF_SIZE];
volatile uint8_t serial2_rx_buf_head = 0;
volatile uint8_t serial2_rx_buf_tail = 0;
// 串口2中断服务程序
void IRAM_ATTR serial2_isr() {
while (Serial2.available()) {
// 读取串口2接收到的数据
char c = Serial2.read();
// 将数据存入接收缓冲区
uint8_t next_head = (serial2_rx_buf_head + 1) % SERIAL2_RX_BUF_SIZE;
if (next_head != serial2_rx_buf_tail) {
serial2_rx_buf[serial2_rx_buf_head] = c;
serial2_rx_buf_head = next_head;
}
}
}
void setup() {
// 初始化串口2
Serial2.begin(9600);
// 将串口2接收中断函数注册到中断向量表中
attachInterrupt(Serial2.getRxPin(), serial2_isr, SERIAL2_RX);
}
void loop() {
// 从串口2接收缓冲区读取数据
while (serial2_rx_buf_tail != serial2_rx_buf_head) {
char c = serial2_rx_buf[serial2_rx_buf_tail];
serial2_rx_buf_tail = (serial2_rx_buf_tail + 1) % SERIAL2_RX_BUF_SIZE;
// 处理接收到的数据
Serial.print(c);
}
}
```
在这个示例中,我们创建了一个Serial2对象,使用ESP32的UART2作为硬件串口。然后我们定义了一个接收缓冲区和指针,用于存储接收到的数据。在setup()函数中,我们初始化了串口2,并将串口2接收中断函数注册到中断向量表中。在loop()函数中,我们从串口2接收缓冲区读取数据,并进行处理。
当串口2接收到数据时,会触发中断服务程序serial2_isr()。在该函数中,我们使用while循环读取所有可用的数据,并将数据存入接收缓冲区中。在循环结束后,中断服务程序会退出,回到主程序中继续执行。
值得注意的是,在中断服务程序中不能使用Serial.print()等需要访问串口的函数,否则会导致死锁或其他问题。因此,在本示例中,我们只是将接收到的数据存入接收缓冲区中,而不是直接处理数据。在主程序中,我们从接收缓冲区中读取数据,并进行处理。
阅读全文