测评项目继续回到Arduino IDE,本篇记录开启C3的第二个串口——Arduino框架中的实例Serial1的过程。
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()函数的传参也很多,只不过除了第一个波特率,其它参数都有默认值。
图5-1 Serial和Serial1定义
图5-2 HardwareSerial.begin()函数原型
所以,串口1使用Serial1即可以完成驱动应用。
#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语句块中加入适当的延时,等到接收完毕后再去读取。
图5-3 两个串口互相收发效果
引用: Jacktang 发表于 2022-8-13 17:51 在if语句块中加入适当的延时,等到接收完毕后再去读取 这个经验值得收藏
以前搞Arduino总结的办法,谢谢收藏