Как инициализировать и деинициализировать serial на основе ввода пользователя?
Вкратце. Если аргумент верен, я хочу создать функцию, которая печатает необходимые данные в Serial. Однако, если его ложный Serial не инициализирован и ничего не печатает, он только выполняет код. Приведенный ниже код не работает, но это пример кода, показывающий, что я имею в виду.
bool status;
void setDebug(bool x){
if (x){
Serial.begin(115200);
status = true;
}
else {
status = false;}
}
void setup(){
setDebug(true);
}
void loop(){
Serial.println("Hello World");
}
Я нашел несколько решений, которые могут оказаться полезными
- Утверждение If. Этот общий код работает; однако я ищу лучший и более эффективный способ сделать это
void loop(){
if (status){
Serial.println("Hello World");
}
}
- Директива препроцессора. Я видел, как многие библиотеки используют #ifdef DEBUG, и это работает. Однако я хочу иметь возможность изменить его с помощью функции, а директивы препроцессора не позволяют мне этого сделать
void loop(){
#ifdef DEBUG
Serial.println("Hello World");
#endif
}
Как еще я могу добиться этого?
@Andrew, 👍1
1 ответ
Вы правильно проанализировали второй случай. Во время выполнения вы не можете изменить значение макросов препроцессора.
Поэтому ваш первый случай является правильным решением.
Если вы не хотите "обнимать" каждый вывод отладки в условном операторе, вы можете получить свой собственный класс. Используйте этот прекрасный ответ в качестве отправной точки. Вы можете улучшить этот производный класс с помощью закрытого флага и метода установки для управления флагом.
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Использовать все контакты как цифровые входы/выходы
- Float печатается только 2 десятичных знака после запятой
- Arduino как USB HID
- Serial1' was not declared in this scope
- Очень простая операция Arduino Uno Serial.readString()
- AT-команда не отвечает на последовательный монитор
write(b)
- это 'центральный метод Print, где вы можете отключить все функции печати, println и записи., @JurajВы хотите наследовать от класса Print, а не от Serial (который является объектом, а не классом). Посмотрите [этот пример](https://arduinoprosto.ru/q/26453/7508), чтобы узнать, как это сделать., @Edgar Bonet
@EdgarBonet Большое спасибо (также Юраю!), Я удалил свой слишком простой пример и дал ссылку на лучший ответ. Я был введен в заблуждение начальной заглавной буквой «Serial». Однако, чтобы иметь все остальные методы последовательной связи, такая «оболочка» должна иметь последовательный класс в качестве базового класса, не так ли?, @the busybee
Класс
Print
предоставляет вам все необходимые методы вывода: различные перегруженные вариантыwrite()
,print()
иprintln()
. Этого должно быть достаточно для нужд ОП. Если вам также нужен ввод, вы должны вместо этого наследоваться отStream
, но я не вижу здесь смысла: вам не нужна оболочка для чтения из Serial. В любом случае, вы, скорее всего, не захотите наследовать отHardwareSerial
(к которому принадлежит классSerial
), так как в итоге у вас будет два экземпляра, подключенных к одному и тому же оборудованию., @Edgar Bonet@EdgarBonet Я думал о
begin()
или других, возможно, желаемых методах. Ваше возражение относительно двух экземпляров правильное, и одним из возможных решений является доступ к одному объектуSerial
в производном классе. -- Понятно, мой подход сработает, но детали каверзные. Не совсем задача для новичка. ;-) Мой опыт работы с C++ и встраиваемыми системами довольно устойчив, но мне не хватает опыта работы с Arduino. -- Спасибо за ценный вклад, не стесняйтесь редактировать ответ. Это должно быть полезно для будущих посетителей., @the busybee