Sterpa
@Sterpa

Как передать указатель на порт Serial в библиотеку Arduino и ОДНОКРАТНО создать на него ссылку внутри всей библиотеки?

Для Arduino создается библиотека для работы с платой WiFi.
Плата может работать на произвольном Hardware или Software порту Mega 2556.
Следовательно, для работы библиотеки требуется передать в нее порт Serial, например передать ссылку или указатель.

Например:
myClass::begin(HardwareSerial *SerialName) {
  //Не подходит, поскольку далее придется использовать такой синтаксис чтобы разыменовывать указатель:
  (*SerialName).end();
  //или:
  SerialName <- begin(9600);
}


А требуется использовать классический синтаксис.

Практически получилось использовать следующую конструкцию:
в файле myLibrary.h

HardwareSerial *SerialName;
//и тут же
HardwareSerial & MyPort = *SerialName;

Тогда в файле myLibrary.cpp я уже могу использовать:
myClass::begin(HardwareSerial *SerialName) {
  HardwareSerial & MyPort = *SerialName;
  MyPort.end();
  MyPort.begin(9600);
}


Проблема в том, что создание объекта HardwareSerial & MyPort = *SerialName; приходится делать в КАЖДОМ методе, и он уничтожается после его выполнения (после выполнения в основной программе myClass.begin(); например). Создать однократно (глобально) MyPort со ссылкой на переданный Serial для использования во всей библиотеке у меня не получается...
Так вот, требуется чтобы HardwareSerial & MyPort = *SerialName; создавался в библиотеке ОДИН раз, для использования во всех методах. Можно ли это организовать при работе с Arduino IDE?
  • Вопрос задан
  • 3698 просмотров
Пригласить эксперта
Ответы на вопрос 2
AxisPod
@AxisPod
Во-первых, чем не устраивает -> и почему у вас <- ?
Во-вторых, ссылка это не объект и при удалении ссылки объект будет живым, ссылка ведет себя как указатель.
В-третьих вы не создаете никакого объекта, а создаете ссылку, которая дальше компилятора никуда не уйдет и в конечном коде её не будет.
В-четвертых вам стоит познакомиться с механизмами работы с памятью в C и реально узнать, что такое ссылка и указатель.
Ответ написан
Sterpa
@Sterpa Автор вопроса
Похоже, нашел рабочий вариант, если полностью перейти на ссылки и отказаться от указателей:

class MyClass 
  {
  public:
    // здесь конструктор
    MyClass (HardwareSerial& sRefA);
  private:
    // здесь ссылка
    HardwareSerial&   portA;
  };

MyClass::MyClass (HardwareSerial& sRefA) :
  // самый важный момент - нужно в самом начале проинициализировать порт по ссылке
  portA (sRefA)
  {
    // начальные значения
  }

MyClass::begin
  {
    portA.begin(9600);
  }
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы