Как инициализировать и деинициализировать 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");
}

Я нашел несколько решений, которые могут оказаться полезными

  1. Утверждение If. Этот общий код работает; однако я ищу лучший и более эффективный способ сделать это
void loop(){
 if (status){
  Serial.println("Hello World");
 }
}
  1. Директива препроцессора. Я видел, как многие библиотеки используют #ifdef DEBUG, и это работает. Однако я хочу иметь возможность изменить его с помощью функции, а директивы препроцессора не позволяют мне этого сделать
void loop(){
 #ifdef DEBUG
  Serial.println("Hello World");
 #endif
}

Как еще я могу добиться этого?

, 👍1


1 ответ


0

Вы правильно проанализировали второй случай. Во время выполнения вы не можете изменить значение макросов препроцессора.

Поэтому ваш первый случай является правильным решением.

Если вы не хотите "обнимать" каждый вывод отладки в условном операторе, вы можете получить свой собственный класс. Используйте этот прекрасный ответ в качестве отправной точки. Вы можете улучшить этот производный класс с помощью закрытого флага и метода установки для управления флагом.

,

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