Создать новый серийный класс, наследующий от 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);
}
@Brethlosze, 👍1
1 ответ
Лучший ответ:
Класс 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);
}
}
- Передача HardwareSerial и SoftwareSerial как свойства класса
- Коммутатор потоков с несколькими последовательными портами
- AT-команда не отвечает на последовательный монитор
- Как отправить команду AT на sim800l с помощью SoftwareSerial
- Как остановить SoftwareSerial от получения данных и повторно включить его в какой-то другой момент?
- Ардуино для чтения с преобразователя RS232 в последовательный модуль TTL
- Не нашел датчик отпечатков пальцев :( Arduino Mega 2560 Adafruit Fingerprint Sensor
- Чтение SMS с помощью Arduino Uno и SIM800L и печать на LCD (16x2 буквенно-цифровых) с использованием последовательного соединения
Спасибо. Я внес указанные изменения. Меня все еще беспокоит объявление конструктора для использования объекта Stream в качестве исходного объекта., @Brethlosze
Ваши ответы великолепны, как и в прошлый раз. Я буду изучать этот код дальше., @Brethlosze