Arduino

технологии

Удобный print() и другие полезные хаки

Макрос для print()

При разработке программ для Arduino очень часто требуется использовать функцию вывода в сериальный порт Serial.print(). При отсутствии удобного отладчика функция print() остается единственным способом понять, где в программе ошибка, вывести значения переменных а также убедиться, что библиотечные функции отработали правильно и вернули корректные значения. Все бы хорошо, но когда программа отлажена и вроде бы даже правильно работает, оставлять весь этот мусор ну совсем не хочется. И вот вы потратили время на удаление всех строчек вывода. Но через какое-то время программа потребовала небольшой доработки и снова заработала некорректно. Приходится возвращать все вызовы print() и так далее.

Так вот, есть неплохое решение:

#include <Arduino.h>
...
#define DEBUG 0
#define debug_println(a) { if (DEBUG) Serial.println(a); };
#define debug_print(a) { if (DEBUG) Serial.print(a); };
...
void setup()
{
  ...
  if (DEBUG) {
    Serial.begin(9600);
  }
  ...
}
...
void loop()
{
  debug_println("Begin function loop()");
  ...
}

Смысл заключается в создании макросов и объявлении константы DEBUG. Если константа принимает ненулевое значение, то все функции debug_println() и debug_print() в коде будут заменены на привычные Serial.println() и Serial.print(), а также будет вызвана функция Serial.begin(), если же в константу DEBUG записать 0, то отладка будет выключена. Довольно удобный способ, не правда ли?

Использование #define

Директиву #define вообще полезно применять в коде. Вроде как на первый взгляд нет разницы:

...
const int pin = 2;
...

или

...
#DEFINE PIN 2;
...

Однако во втором случае мы не потратим память на переменную pin, а также код будет работать чуть быстрее, потому что препроцессором все вхождения PIN в коде будут заменены на значение (в нашел случае на 2).