Использование сторонних классов внутри своих

Прошу сразу не бить :slight_smile: Учусь работать с классами…

Возникла “безумная” идея написать свой класс для устройства, но хочется внутри своего класса использовать “хардверный” класс например Serial или SPI из фреймворка, определённые пользователем. Подскажите как правильно это можно реализовать?

Я пробовал так, но получаю watchdog… Играюсь на плате Nuclea F446RE.

#include <Arduino.h>

HardwareSerial Serial1(PA3, PA2);

#define LED_BUILTIN PA5

class MyClass
{
public:
  HardwareSerial COMprint;
  MyClass(HardwareSerial *SerialOnClass);
  void prints();
};

void setup()
{
  // initialize LED digital pin as an output.
  pinMode(LED_BUILTIN, OUTPUT);

  Serial1.begin(115200, SERIAL_8N1);
}

MyClass MyOBJ(&Serial1);

void loop()
{

  digitalWrite(LED_BUILTIN, HIGH);
  Serial1.println(millis());
  delay(500);

  digitalWrite(LED_BUILTIN, LOW);
  MyOBJ.prints();

  delay(500);
}


  MyClass::MyClass(HardwareSerial *SerialOnClass) : COMprint(SerialOnClass)
  {
    // настроим скокрость порта ещё раз
    COMprint.begin(115200);
  }

  void MyClass::prints()
  {
    // попробуем вывести в порт
    COMprint.println("test");
  }

HardwareSerial* COMprint;
...
COMprint->begin(115200);
2 лайка

Ух ты ж блин , через ссылки заработало :slight_smile: Спасибо мил человек!

#include <Arduino.h>

HardwareSerial Serial1(PA3, PA2);

#define LED_BUILTIN PA5

class MyClass
{
public:
  HardwareSerial *COMprint;
  MyClass(HardwareSerial *SerialOnClass);
  void prints();
};

void setup()
{
  // initialize LED digital pin as an output.
  pinMode(LED_BUILTIN, OUTPUT);

  Serial1.begin(115200, SERIAL_8N1);
}

MyClass MyOBJ(&Serial1);

void loop()
{

  digitalWrite(LED_BUILTIN, HIGH);
  Serial1.println(millis());
  delay(500);

  digitalWrite(LED_BUILTIN, LOW);
  MyOBJ.prints();

  delay(500);
}


  MyClass::MyClass(HardwareSerial *SerialOnClass) : COMprint(SerialOnClass)
  {
    // настроим скокрость порта ещё раз
    COMprint->begin(115200);
  }

  void MyClass::prints()
  {
    // попробуем вывести в порт
    COMprint->println("test");
  }


у меня всегда компилятор ругался и требоал стрелку вместо точки, почему у ТС не так?

Потому что формально все верно - доступ к членам экземпляра класса производится через точку.

Только не стоит присваивать ему значение указателя в конструкторе - эта затея бессмысленная.

1 лайк

В приведённом коде нет ссылок. Вы бы всё же разобрались, что там и как, а то Ваше “заработало” будет до следующего раза, а там опять …

а где у ТС точка? Вроде стрелка и есть

Стрелка уже в ответе от уважаемого Sadman у ТС точечный доступ, вот я и удивился потому что у меня компилятор выдавал на такое что-то типа “probably you mean ->”

vs code в последних версиях сам точку на стрелку заменяет, если нужно. И наоборот

Хрена-се! Надеюсь, это можно выключить :frowning:

Интересно, что он делает, кода допустимо и то, и другое?

Так накидайте примерчик такой, думаю v258 откомпилирует.

Может не сам VSC, а “код анализер”? А “точки” к объектам, у меня в самом первом посте и есть… Если ошибки указывает, наверное от компилятора зависит? Но у меня не указывал в моём примере.

Студия тоже меняет . на → по контексту.

Ну дак, евойный IntellySense не сам по себе, а один из плагинов

Ну, вот здесь можно к одной и той же переменной обратиться и с точкой, и с → и результат будет разный.

class Kaka {
	bool m_flag = true;

public:

	void printMe(void) {
		Serial.print(m_flag ?
			"«Ну," :
			"обычная процедура в таких случаях нижеследующая»\r\n");
		m_flag = true;
	}
	Kaka * operator->(void) { m_flag = false; return this; }
};

void setup(void) {
	Serial.begin(9600);
	Kaka kaka;
	kaka.printMe();
	Serial.print(" - сказала Сова, - ");
	kaka->printMe();
}

void loop(void) {}

Результат

«Ну, - сказала Сова, - обычная процедура в таких случаях нижеследующая»

Это вечером только попробую

Отпишитесь тогда. Интересно, как он в этой ситуации умничать будет. Или не будет.

Отписываюсь. При копипасте естественно ничего не поменялось

Потом я вручную поменял стрелку на точку и точку на стрелку - vs code умничать не стал, оставил как есть

Не такой уж и дурак :sweat_smile:

PS: вручную вводил и kaka->printMe();, и kaka.printMe(); - опять же никакой реакции. Заподозрил неладное, разыскал среди своих проектов один, где применял стрелки, попробовал ввести точку - после ввода метода после точки, точка превратилась в стрелку. Т.е. где нужно - работает, где не нужно - не работает

1 лайк

Абалдеть! Но, надеюсь, эту умность таки можно можно выключить (сказал, поглаживая ручку механической КПП :slight_smile: )

Возможно, я не разбирался. Я ж не настоящий сталевар :slightly_smiling_face: