Создать новый серийный класс, наследующий от Stream

Как следует наследоваться от Stream для создания нового класса MySerial, который можно инициализировать из экземпляра Stream0 ?.

Пока ошибка: "невозможно объявить переменную 'mySerial' абстрактным типом 'MySerial'".

Если я делаю класс MySerial не наследующим, а добавляющим свойство Stream, все работает нормально, кроме нового механизма вызова для resend(), созданная для приема экземпляров Stream.

EDIT: это отредактированный код. Текущая ошибка: "ожидаемый неполный идентификатор перед токеном '='".

MySerial.h

class MySerial:public Stream{
    private:
        int param;
    public:
        MySerial(){}; // ХОРОШО
        MySerial(Stream &Serial0){MySerial=&Serial0} // Вот вопрос
        // Потоковая реализация
        int available(){return available();}
        int read(){return read();}
        int peek(){return peek();}
        size_t write(uint8_t c){return write(c);}
        using Print::write; 
};

MySerial.ino

#include <MySerial.h>
#include <SoftwareSerial.h>

SoftwareSerial swSerial(6,7);
MySerial mySerial(swSerial);

void setup(){}
void loop(){    
    if (mySerial.available()){
        c=mySerial.read();
        resend(mySerial,c);
    }
}
// Эта функция должна принимать любой поток: SoftwareSerial, MySerial, Serial...
void resend(Stream &Stream0, char c){
    Stream0.write(c);
}

, 👍1


1 ответ


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

7

Класс Stream имеет чисто виртуальные методы, которые должны быть реализованы в производном, а не абстрактном классе.

Чисто виртуальный метод из базового класса Print:

virtual size_t write(uint8_t) = 0;

Чисто виртуальные методы из Stream:

virtual int available() = 0;
virtual int read() = 0;
virtual int peek() = 0;

дополнительно добавьте в свой класс строчку

using Print::write; 

для извлечения перегруженных методов write(str) и write(buf, size) из Print

Здесь у меня есть пример простого класса, производного от Stream .


EDIT: большая часть вашего вопроса, похоже, была сосредоточена на обертывании некоторой реализации Stream. Теперь я вижу, что вы, возможно, захотите улучшить класс SoftwareSerial и добавить новый метод в унаследованный класс. Это просто:

MySerial.h

#ifndef _MYSERIAL_H_
#define _MYSERIAL_H_

#include <SoftwareSerial.h>

class MySerial: public SoftwareSerial {
private:
  int param;

public:

  MySerial(uint8_t receivePin, uint8_t transmitPin) :
      SoftwareSerial(receivePin, transmitPin, false) {
    param = 0;
  }

  void resend(char c) {
    write(c);
  }
};
#endif

MySerial.ino

#include "MySerial.h"

MySerial mySerial(6, 7);

void setup() {
  mySerial.begin(9600);
}

void loop() {
  if (mySerial.available()) {
    int c = mySerial.read();
    mySerial.resend(c);
  }
}
,

Спасибо. Я внес указанные изменения. Меня все еще беспокоит объявление конструктора для использования объекта Stream в качестве исходного объекта., @Brethlosze

Ваши ответы великолепны, как и в прошлый раз. Я буду изучать этот код дальше., @Brethlosze