Передача HardwareSerial и SoftwareSerial как свойства класса

Я хочу знать, есть ли способ использовать одно свойство Serial0 для хранения HardwareSerial или SoftwareSerial или других экземпляров класса поддержка основных методов, таких как available(), read() и write(), для создания CustomSerial Класс (полиморфизм?).

class CustomSerial{
    <GenericSerial??> Serial0;
    char c;
    void read(void){
        c=Serial0.read();
    }
};

Вызовы должны быть:

CustomSerial SerialCus;
int n=SerialCus.available();
char c=SerialCus.read();
SerialCus.write(c);

Что мне следует использовать в качестве класса GenericSerial или как следует его использовать? Я попробовал класс Stream (как указано в ответе), но по какой-то причине функциональность не сохраняется (пишет неизвестные символы). Действительно ли Stream должен быть универсальным классом, который мне нужен для этого?

, 👍0

Обсуждение

Если нет возможности сделать общий класс, то можно использовать шаблон. Если класс (любой класс) имеет .available(), .read() и .write(), то компилятор заполняет используемый класс., @Jot


1 ответ


Лучший ответ:

3

Базовым типом для последовательных классов оборудования Arduino, SoftwareSerial и других последовательных классов программного обеспечения, а также некоторых других классов Arduino является Поток (ссылка). Stream.h на GitHub

class CustomSerial {

private:
  Stream &stream;

public:
  CustomSerial(Stream &_stream) : stream(_stream) {}

  int read() {
    return stream.read();
  }

  int available() {
    return stream.available();
  }

  int peek() {
    return stream.peek();
  }

  void write(byte b) {
    stream.write(b);
  }

};

SoftwareSerial Serial0(10, 11);
CustomSerial SerialCus(Serial0);

void setup() {
}

void loop(){
  if (SerialCus.available()) {
    char c = SerialCus.read();
    SerialCus.write(c);
  }
}
,

Я действительно использовал Stream для определения свойства, но по какой-то причине это не работает так же, как использование HardwareSerial, поэтому я не смог расширить его для экземпляров SoftwareSerial., @Brethlosze

@hyprfrcb, я добавил код в ответ, @Juraj

Этот параметр работает идеально!... А также расскажет, как использовать ссылки Stream... :), @Brethlosze

AltSoftSerial также использует Stream., @Jot