Какой лучший способ объявить 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); // Дождитесь инициализации последовательного порта
Также я видел объявление с потоком, но теперь я не нашел примеров кодов. Так что, наконец, кто-нибудь может сказать мне, что лучше всего подходит для показа сериалов в библиотеке. это может быть только для последовательного оборудования или для обоих
@mehmet, 👍1
Обсуждение2 ответа
Лучший ответ:
Что касается использования потока
:
Я обычно использую Stream
вместо HardwareSerial,
потому что:
- Это позволяет использовать другие последовательные устройства, такие как
SoftwareSerial
илиUSBSerial
, которые не являются "аппаратными" UART. - Он даже позволяет использовать несерийные системы, такие как передача данных по сетям или беспроводным устройствам
Однако это означает:
- Пользователь должен вручную инициализировать свой последовательный объект / устройство, так как
поток
не имеет возможности устанавливать такие параметры, как скорость передачи данных.
Можете ли вы показать мне учебник или библиотеку github, в которой используется Stream., @mehmet
@мехмет, попробуй вот это: https://github.com/MajenkoLibraries/ICSC/tree/master/src, @Majenko
Нет лучшего способа, первый-использовать глобальную переменную, будучи статичным. Второй-динамически (или, по крайней мере, для передачи последовательного экземпляра).
Это зависит от вашего использования
- Если вы хотите, чтобы ваш код всегда работал с одним и тем же объявленным последовательным (аппаратным или последовательным) экземпляром, вы можете использовать первый способ, поскольку он самый простой.
- Если вы хотите, чтобы ваш последовательный аппаратный порт был гибким (ваш код работал, например, с выбираемым аппаратным последовательным портом на Arduino Mega), вам нужно второе.
- Если вы хотите, чтобы ваш последовательный порт был программным или аппаратным, вы можете использовать второй метод, но вам нужен другой тип (не упомянутый
класс HardwareSerial. Я не знаю по названию родительский класс
SoftwareSerial
иHardwareSerial
(класс потока, о котором вы упомянули, может быть общим родительским классом).
не существует последовательного базового класса, @Juraj
Могу я задать последний вопрос, почему второй метод использует "->" и почему нет "." Такой us _serial.begin(бод). Это совершенно одно и то же, @mehmet
Если у вас есть доступ к самому объекту, например, "Serial", вы можете сказать " Serial.println(). Если в вашей библиотеке есть только указатель на объект, вы должны использовать
->, оператор разыменования:
serialPtr->>println()`. Результат тот же: вызов элемента объекта ' println ()'. Разница заключается в том, как скомпилированный код доставляет вас к этому члену., @JRobert
@Juraj Спасибо за это дополнение (я не был уверен, поэтому удалил комментарий о том, что я не уверен, и утверждение в моем ответе)., @Michel Keijzers
@mehmet, это обычный доступ к элементу объекта C++, о котором вы спрашивали, @Juraj
- Повреждение данных SoftwareSerial - поиск предложений
- Термопринтер Adafruit печатает слабо
- AT-команда не отвечает на последовательный монитор
- Как отправить команду AT на sim800l с помощью SoftwareSerial
- Ардуино для чтения с преобразователя RS232 в последовательный модуль TTL
- Как связаться с ESP8266 ESP01, отправив данные через программный сериал на Arduino Uno?
- Ошибка 'Serial' was not declared in this scope
- myserial.available() возвращает нулевой байт
Основная концепция, о которой вы спрашиваете, называется "инъекция зависимости"., @chrylis -cautiouslyoptimistic-