«Перевести» BluetoothSerial в HardwareSerial

У меня есть функция, которая принимает класс HardwareSerial в качестве аргумента:

void ProcessLine(HardwareSerial *serial, char *line)
{
    // сделай что-нибудь
    serial->write("blablabla");
}

В моем коде также есть BluetoothSerial, который разделяет необходимые функции (например, write()) с HardwareSerial.

Чтобы избежать дублирования кода моей довольно длинной ProcessLine(), есть ли способ "привести" BlutoothSerial в HardwareSerial?

, 👍0

Обсуждение

Поток - это общий базовый класс, @Juraj


1 ответ


2

Нет, вы не "транслируете" между ними. Вместо этого вы используете полиморфизм.

В среде Arduino большинство классов помещаются в «дерево». с аналогичными классами, "отвисшими" общий родитель "ветвь". В этом случае как BluetoothSerial, так и HardwareSerial, будучи последовательными классами, оба являются потомками класса Stream. Действительно, именно этот класс Stream (который сам является потомком класса Print) дает этим объектам большинство их функций.

Поэтому, если вам нужен доступ к какой-либо функции, специфичной для класса HardwareSerial (например, .begin(...) функция) вы всегда должны работать вверх по дереву до класса, который предоставляет наиболее ограниченный набор функций, отвечающих вашим потребностям. В этом случае, поскольку вы только печатаете данные, это будет класс Print. Если бы вы читали данные, вы бы выбрали класс Stream.

Поэтому, если вы измените свою функцию так, чтобы она принимала Print *serial вместо HardwareSerial *serial, тогда она будет принимать любой объект, который в конечном итоге наследуется от объект Print — любые последовательные объекты, любые объекты сетевого потока и т. д.

,