最近在用DFRobot 出品的 FireBeelte 做点东西玩,在使用中需要用到多个串口。当我在程序开始写上 Include softwareSerial.h 之后,编译报错。研究了一番发现目前这个平台没有支持 Software Serial (准确的说没有自带原生的库,但是看起来有几个第三方的库)。再研究一番发现还有更简单的实现。
ESP32 支持了3个硬件串口(这样算起来不支持 Software Serial 也没有什么影响)。分别位于 IO3/1 , IO9/10 和 IO16/17。换成 Arduino IDE 的语言是 D0/0, D5/6 和DI/LRCK。其中的IO3/1 已经给烧写程序使用,所以一般都是使用后面2组。
使用这些硬件串口的代码可以在\AppData\Local\Arduino15\packages\esp32\hardware\DFRobot_FireBeetle-ESP32\0.0.9\cores\esp32\HardwareSerial.h 和\AppData\Local\Arduino15\packages\esp32\hardware\DFRobot_FireBeetle-ESP32\0.0.9\cores\esp32\HardwareSerial.cpp 看到。
比如:初始化函数 begin() 函数,接收序号作为参数
HardwareSerial::HardwareSerial(int uart_nr) : _uart_nr(uart_nr), _uart(NULL) {}
void HardwareSerial::begin(unsigned long baud, uint32_t config, int8_t rxPin, int8_t txPin, bool invert)
{
if(0 > _uart_nr || _uart_nr > 2) {
log_e("Serial number is invalid, please use 0, 1 or 2");
return;
}
if(_uart) {
end();
}
if(_uart_nr == 0 && rxPin < 0 && txPin < 0) {
rxPin = 3;
txPin = 1;
}
if(_uart_nr == 1 && rxPin < 0 && txPin < 0) {
rxPin = 9;
txPin = 10;
}
if(_uart_nr == 2 && rxPin < 0 && txPin < 0) {
rxPin = 16;
txPin = 17;
}
_uart = uartBegin(_uart_nr, baud, config, rxPin, txPin, 256, invert);
}
对用户来说使用HardwareSerial Serial1(1); 这样的就可以使用第二组串口。下面就是一个从USB发送然后转发到其他串口的例子:
HardwareSerial Serial1(2);
//HardwareSerial Serial2(2);
void setup() {
Serial.begin(115200);
Serial1.begin(115200);
//Serial2.begin(115200);
}
void loop() {
if (Serial.available()) { // If anything comes in Serial (USB),
Serial1.write(Serial.read()); // read it and send it out Serial1 (pins 0 & 1)
}
if (Serial1.available()) { // If anything comes in Serial1 (pins 0 & 1)
Serial.write(Serial1.read()); // read it and send it out Serial (USB)
}
}
看起来实现很简单,功能也很强大,有兴趣的朋友可以研究一下。
参考:
1. https://www.qutaojiao.com/2452.html ESP32使用多个串行端口