Как передать объект Strem моему классу

c++ class stream

Я пытаюсь создать оболочку класса для использования объекта 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()в моем классе?

, 👍-1

Обсуждение

Компилятор сказал: «Вы не можете, потому что класс 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


1 ответ


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

2

Метод 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() в основном коде.


Для справки: Юрай показал наследование между классами в своем ответе на этот вопрос. Взгляните на него, так как он весьма поучительный.

,