[原创] 【Beetle ESP32-C3】五、开启两个UART(Arduino)

sonicfirr   2022-8-12 22:21 楼主

       测评项目继续回到Arduino IDE,本篇记录开启C3的第二个串口——Arduino框架中的实例Serial1的过程。

1、Arduino框架中的实例定义

      Arduino开发可以直接使用Serial,其实它是框架中已经定义好的HardwareSerial类型的对象。ESP32 Arduino Package的“..\esp32\hardware\esp32\2.0.4\cores\esp32”路径下有HardwareSerial.cpp和HardwareSerial.h,它们就是Arduino中串口的代码实现。HardwareSerial.cpp中有Serial和Serial1实例的定义,HardwareSerial.h中有两个对象变量的导出(extern),另外begin()函数的传参也很多,只不过除了第一个波特率,其它参数都有默认值。

 

image-20220812221304-1.png

图5-1 Serial和Serial1定义

 

image-20220812221304-2.png

图5-2 HardwareSerial.begin()函数原型

 

      所以,串口1使用Serial1即可以完成驱动应用。

2、测试代码

#define LED 10     //IO10 for LED on board

bool flag = false; //LED status flag

void setup() {
  // Initialize GPIO
  pinMode(LED, OUTPUT);
  digitalWrite(LED, LOW);
  // Initialize USB-UART
  Serial.begin(115200);
  // Initialize UART1
  Serial1.begin(115200, SERIAL_8N1, /*rx =*/0, /*Tx =*/1);
}

int i = 0; //counter variable for Blink

void loop() {
  if(Serial.available()) {
    char c = Serial.read();
    Serial1.print(c);
  }
  if(Serial1.available()) {
    char ch = Serial1.read();
    Serial.print(ch);
  }
  if(i++ >= 1000) {
    if(flag) {digitalWrite(LED, LOW); flag = false;}
    else     {digitalWrite(LED, HIGH); flag = true;}
    i = 0;
  }
  delay(1);
}

      代码功能:初始化Serial和Serial1,及GPIO10(板载LED控制脚),然后实现串0收转串1发,串1发转串0收,LED则闪烁灯指示程序在运行。

      代码中Serial1初始化因为要配置收发管脚,所以传递了四个参数。Serial.available()函数实际返回串口接收缓存队列的长度,因为收到一个字节就会条件成立,所以使用了read()函数去读取一个字节。如果想读取多个字节(可用来自于HardwareSerial超类Stream的readString()、readBytes()等API),本人的经验是在if语句块中加入适当的延时,等到接收完毕后再去读取。

 

image-20220812221304-3.png

图5-3 两个串口互相收发效果

 

回复评论 (3)

在if语句块中加入适当的延时,等到接收完毕后再去读取

这个经验值得收藏

点赞  2022-8-13 17:51
引用: Jacktang 发表于 2022-8-13 17:51 在if语句块中加入适当的延时,等到接收完毕后再去读取 这个经验值得收藏

以前搞Arduino总结的办法,谢谢收藏

点赞  2022-8-13 18:48
请问博主有硬件连接图吗
点赞  2023-4-16 12:01
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复