Определить, определены ли Serial1 и Serial2, во время компиляции
У меня есть библиотека, которая использует Serial
, Serial1
и Serial2
для создания различных сценариев регистрации. Пользователь библиотеки должен определить конфигурацию в конструкторе класса, используя простые байтовые константы, такие как 0, 1 и 2.
Проблема в том, что Serial1
и Serial2
доступны не для всех типов плат. Поэтому, когда я компилирую свой код (который прекрасно компилируется в Mega) в Uno, я получаю сообщение об ошибке
'Serial1' не был объявлен в этой области
.
Поэтому я полагаю, что мне нужно настроить свой код с помощью директивы препроцессора, такой как #ifdefined
, чтобы включить некоторый код, только если Serial1 определен. Но это не сработает, потому что Serial1 определяется позже, во время компиляции. Так как же это сделать?
@Passiday, 👍6
Обсуждение2 ответа
Лучший ответ:
HardwareSerial.h в ядре плат Arduino AVR определяет HAVE_HWSERIALX
пример
#ifndef HAVE_HWSERIAL1
#include "SoftwareSerial.h"
SoftwareSerial Serial1(6, 7); // RX, TX
#endif
Рассмотрите подход, использованный здесь, в проекте 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
- Ошибка сегментации и огромная потребность в SRAM для Serial.println
- Как инициализировать и деинициализировать serial на основе ввода пользователя?
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- В чем разница между Serial.write и Serial.print? И когда они используются?
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Программы построения последовательных данных
- Как узнать частоту дискретизации?
Не уверен, что SDK имеет конкретное аппаратное обеспечение, определяющее настройку таких вещей, как последовательный порт. Большинство смотрит на определения процессора SDK и использует директивы условной компиляции, такие как «#ifdef ARDUINO_AVR_UNO»., @st2000
Кроме того, я смотрю на [ArduinoBoardManager в исходном коде github](https://github.com/backupbrain/ArduinoBoardManager) и не вижу, где они определяют оборудование, такое как последовательный порт, для каждого процессора. Возможно, вы могли бы добавить это и повторно использовать этот код. Но я по-прежнему думаю, что самый простой способ — выбрать, какой код последовательного порта вы хотите скомпилировать, исходя из типа процессора. Посмотрите на исходный код в этом проекте github, чтобы увидеть, как они это сделали., @st2000
Почему бы не заставить конструктор принимать ссылку на объект типа
Serial
(илиHardwareSerial
или дажеPrint
)?, @Maximilian Gerhardt