Какой лучший способ объявить Serial при создании библиотеки Arduino?

Ну, я пытаюсь создать библиотеку для отображения HMI. дисплей и соединение Arduino с последовательным. Поэтому я буду так много раз использовать последовательный порт. Как правило, я буду использовать функцию Serial.write. если я изучу другие библиотеки, то найду множество способов объявить последовательный. Почему и что лучше всего я хочу узнать.

там я видел объявление последовательных методов.

Способ 1

в файле library .h

nothing

в файле library .cpp

#include <SoftwareSerial.h>

SoftwareSerial SIM(RX_PIN,TX_PIN);

void KapadokyaGSM::basla(){
    SIM.begin(9600);
  _tampon.reserve(255);
}

Способ 2

в файле library .h

public:
EasyNex(HardwareSerial& serial);
...
private:
HardwareSerial* _serial;
...

в файле library .cpp

EasyNex::EasyNex(HardwareSerial& serial){  // Параметр конструктора-это серия, которую мы хотим использовать
_serial = &serial;
}

void EasyNex::begin(unsigned long baud){
_serial->begin(baud);  // Мы передаем данные инициализации объектам (скорость передачи в бодах) по умолчанию:
delay(100);            // Дождитесь инициализации последовательного порта

Также я видел объявление с потоком, но теперь я не нашел примеров кодов. Так что, наконец, кто-нибудь может сказать мне, что лучше всего подходит для показа сериалов в библиотеке. это может быть только для последовательного оборудования или для обоих

, 👍1

Обсуждение

Основная концепция, о которой вы спрашиваете, называется "инъекция зависимости"., @chrylis -cautiouslyoptimistic-


2 ответа


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

4

Что касается использования потока:

Я обычно использую Stream вместо HardwareSerial, потому что:

  • Это позволяет использовать другие последовательные устройства, такие как SoftwareSerial или USBSerial, которые не являются "аппаратными" UART.
  • Он даже позволяет использовать несерийные системы, такие как передача данных по сетям или беспроводным устройствам

Однако это означает:

  • Пользователь должен вручную инициализировать свой последовательный объект / устройство, так как поток не имеет возможности устанавливать такие параметры, как скорость передачи данных.
,

Можете ли вы показать мне учебник или библиотеку github, в которой используется Stream., @mehmet

@мехмет, попробуй вот это: https://github.com/MajenkoLibraries/ICSC/tree/master/src, @Majenko


1

Нет лучшего способа, первый-использовать глобальную переменную, будучи статичным. Второй-динамически (или, по крайней мере, для передачи последовательного экземпляра).

Это зависит от вашего использования

  • Если вы хотите, чтобы ваш код всегда работал с одним и тем же объявленным последовательным (аппаратным или последовательным) экземпляром, вы можете использовать первый способ, поскольку он самый простой.
  • Если вы хотите, чтобы ваш последовательный аппаратный порт был гибким (ваш код работал, например, с выбираемым аппаратным последовательным портом на Arduino Mega), вам нужно второе.
  • Если вы хотите, чтобы ваш последовательный порт был программным или аппаратным, вы можете использовать второй метод, но вам нужен другой тип (не упомянутый класс HardwareSerial. Я не знаю по названию родительский класс SoftwareSerial и HardwareSerial (класс потока, о котором вы упомянули, может быть общим родительским классом).
,

не существует последовательного базового класса, @Juraj

Могу я задать последний вопрос, почему второй метод использует "->" и почему нет "." Такой us _serial.begin(бод). Это совершенно одно и то же, @mehmet

Если у вас есть доступ к самому объекту, например, "Serial", вы можете сказать " Serial.println(). Если в вашей библиотеке есть только указатель на объект, вы должны использовать ->, оператор разыменования: serialPtr->>println()`. Результат тот же: вызов элемента объекта ' println ()'. Разница заключается в том, как скомпилированный код доставляет вас к этому члену., @JRobert

@Juraj Спасибо за это дополнение (я не был уверен, поэтому удалил комментарий о том, что я не уверен, и утверждение в моем ответе)., @Michel Keijzers

@mehmet, это обычный доступ к элементу объекта C++, о котором вы спрашивали, @Juraj