FireBeelte 多串口通讯的实现

最近在用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使用多个串行端口

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注