Определить, определены ли Serial1 и Serial2, во время компиляции

У меня есть библиотека, которая использует Serial, Serial1 и Serial2 для создания различных сценариев регистрации. Пользователь библиотеки должен определить конфигурацию в конструкторе класса, используя простые байтовые константы, такие как 0, 1 и 2.

Проблема в том, что Serial1 и Serial2 доступны не для всех типов плат. Поэтому, когда я компилирую свой код (который прекрасно компилируется в Mega) в Uno, я получаю сообщение об ошибке 'Serial1' не был объявлен в этой области.

Поэтому я полагаю, что мне нужно настроить свой код с помощью директивы препроцессора, такой как #ifdefined, чтобы включить некоторый код, только если Serial1 определен. Но это не сработает, потому что Serial1 определяется позже, во время компиляции. Так как же это сделать?

, 👍6

Обсуждение

Не уверен, что SDK имеет конкретное аппаратное обеспечение, определяющее настройку таких вещей, как последовательный порт. Большинство смотрит на определения процессора SDK и использует директивы условной компиляции, такие как «#ifdef ARDUINO_AVR_UNO»., @st2000

Кроме того, я смотрю на [ArduinoBoardManager в исходном коде github](https://github.com/backupbrain/ArduinoBoardManager) и не вижу, где они определяют оборудование, такое как последовательный порт, для каждого процессора. Возможно, вы могли бы добавить это и повторно использовать этот код. Но я по-прежнему думаю, что самый простой способ — выбрать, какой код последовательного порта вы хотите скомпилировать, исходя из типа процессора. Посмотрите на исходный код в этом проекте github, чтобы увидеть, как они это сделали., @st2000

Почему бы не заставить конструктор принимать ссылку на объект типа Serial (или HardwareSerial или даже Print)?, @Maximilian Gerhardt


2 ответа


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

8

HardwareSerial.h в ядре плат Arduino AVR определяет HAVE_HWSERIALX

пример

#ifndef HAVE_HWSERIAL1
#include "SoftwareSerial.h"
SoftwareSerial Serial1(6, 7); // RX, TX
#endif
,

1

Рассмотрите подход, использованный здесь, в проекте ArduinoBoardManager на github. Файл ArduinoBoardManager.h использует условную компиляцию для определения правильного кода для компиляции в зависимости от типа процессора. Аналогичный подход можно использовать для оценки доступности определенных аппаратных периферийных устройств, таких как последовательные порты, в зависимости от типа процессора.

#if defined(__AVR_ATmega328P__) // uno, fi
  // Код, совместимый с Arduino Uno
#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
  // Код, совместимый с Arduino Mega
#endif
,

зачем это делать, если HardwareSerial.h сделает это за вас. и, например, у Uno Wifi есть дополнительный интерфейс Serial1 (для подключения встроенного esp8266), даже если это 328p, @Juraj

О, я согласен - я не знал об альтернативах, пока не написал здесь. Я просто знал, как с этим справляется проект ArduinoBoardManager., @st2000