FireBeelte 多串口通讯的实现-Arduino中文社区 - Powered by Discuz! Archiver

Zoologist 发表于 2019-2-28 20:47

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.htmlESP32使用多个串行端口

跑龙套的保 发表于 2019-3-1 09:15

可能你的版本不是最新的,现在新的git版本已经预先实例化了
https://github.com/espressif/arduino-esp32/blob/5af03361775e78fc7a0721ceec198663d2f1db44/cores/esp32/HardwareSerial.h#L100

Zoologist 发表于 2019-3-1 10:07

跑龙套的保 发表于 2019-3-1 09:15
可能你的版本不是最新的,现在新的git版本已经预先实例化了
https://github.com/espressif/arduino-esp32/b ...

谢谢哈,我是直接用 dfrobot 提供的库,估计比较老了

页: [1]
查看完整版本: FireBeelte 多串口通讯的实现