Как передать объект Strem моему классу
Я пытаюсь создать оболочку класса для использования объекта Stream
, но при попытке компиляции возникает ошибка.
Мой файл .h
:
#include <Arduino.h>
class TestSerialListener {
public:
TestSerialListener(Stream &serial);
void testPrint(void);
private:
bool _listener_start;
Stream &_serial;
void startListener(void);
};
мой cpp
файл
#include "TestSerialListener.h"
#include <Arduino.h>
TestSerialListener::TestSerialListener(Stream &serial) : _serial(serial)
{
}
void TestSerialListener::testPrint(){
_serial.begin(115200); <---------- error compilation
_serial.println("test");
}
void TestSerialListener::startListener(void)
{
if(!_listener_start){
_listener_start = true;
}
}
И когда я пытаюсь скомпилировать его, я получаю эту ошибку: ошибка: 'класс Stream' не имеет члена с именем 'begin'
Почему я не могу использовать begin()
в моем классе?
@simon, 👍-1
Обсуждение1 ответ
Лучший ответ:
Метод begin()
определен в классе HardwareSerial
, а не в Stream
. Вы можете посмотреть это самостоятельно в своей установке Arduino. Для меня эти файлы расположены в ~/.arduino15/packages/arduino/hardware/avr/1.8.6/cores/arduino/
и называются Stream.h
и HardwareSerial.h
.
И если подумать, то это вполне логично. Класс Stream
может представлять любой объект, который может передавать данные. Он ничего не знает о том, как именно данные передаются на аппаратном уровне. Он просто предоставляет удобные функции для обработки данных. Затем класс HardwareSerial
наследуется от Stream
, чтобы получить эти методы обработки данных, и добавляет свои собственные методы для обработки аппаратной стороны проблемы, включая настройку скорости передачи данных.
При предоставлении ссылки Stream
на конструктор класса вы хотите begin()
соответствующий объект вне класса, прежде чем вы начнете передавать какие-либо данные через него. Такой подход делает ваш класс широко используемым, поскольку вы можете использовать любой объект Stream
, даже файл на SD-карте.
Поэтому переместите строку begin()
из вашего класса в функцию setup()
в основном коде.
Для справки: Юрай показал наследование между классами в своем ответе на этот вопрос. Взгляните на него, так как он весьма поучительный.
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- Массив динамического размера в качестве члена класса
- Как перебрать объекты или передать объект функции?
- Прерывания внутри класса, связанные с функцией класса
- Недопустимое использование нестатической функции-члена
- Вызов функций одного класса из другого класса — Обратный вызов
- Создать новый серийный класс, наследующий от Stream
- Зачем хранить значение параметра функции в частной переменной класса?
Компилятор сказал: «Вы не можете, потому что класс
Stream
не имеет метода с именемbegin
». Отвечает ли это на ваш вопрос?, @Edgar BonetХорошо, но почему я могу использовать
SerialUSB.begin(115200)
в своем скетче? @ЭдгарБонет, @simonПотому что у
SerialUSB
есть метод с именемbegin
. **Некоторые** классы, производные от Stream, могут иметь такой метод. Этого нельзя ожидать от **любого** объекта Stream., @Edgar Bonetсм. https://arduinoprosto.ru/q/78719/can-you-use-serial-port-as-a-variable/78725#78725, @Juraj