Какой тип переменной я должен использовать для хранения состояния вывода Arduino? - PullRequest
3 голосов
/ 23 апреля 2019

Документы Arduino определяют константы HIGH и LOW для цифровых выводов ввода / вывода, но не указывают, что они находятся под колпаком. Так что, если я хочу сохранить состояние вывода в переменной, какого типа должна быть переменная? Логическим предположением было бы 1 и 0 в переменной int или, возможно, true и false в bool, но я не могу найти это нигде.

Ответы [ 3 ]

2 голосов
/ 23 апреля 2019

Из документации digitalRead() (которая возвращает HIGH или LOW) значение сохраняется в int, поэтому использование int выглядит как безопасная ставка.

Функция digitalWrite() принимает в качестве параметра состояние вывода (HIGH или LOW) и ищет в репозитории GitHub от Arduino для определенияэтой функции существует три различных определения:

void digitalWrite(uint32_t, uint32_t);
void digitalWrite(uint8_t, uint8_t);
void digitalWrite(pin_size_t, PinStatus);

Где PinStatus - это перечисление:

typedef enum {
  LOW     = 0,
  HIGH    = 1,
  CHANGE  = 2,
  FALLING = 3,
  RISING  = 4,
} PinStatus;

Но HIGH и LOW всегда определяются как 1 и 0, которые определенно могут храниться в int (и могут быть преобразованы в эти три типа)

1 голос
/ 23 апреля 2019

Похоже, что вы можете использовать целые числа в качестве хранилища для управления digitalWrite вместо HIGH и LOW согласно этому сообщению: http://forum.arduino.cc/index.php?topic=111711.0

-Я не проверял это, поэтому, пожалуйста, проверьте, прежде чем принять.

0 голосов
/ 24 апреля 2019

Один из способов взглянуть на это состоит в том, что ребята из Arduino изобрели счетчики HIGH и LOW (макросы?), Чтобы скрыть тот факт, что, возможно, хотя и маловероятно, будет процессор, который не использует 1 дляHIGH и 0 для LOW.Если вы хотите написать переносимый, ориентированный на будущее код, то вам, вероятно, следует придерживаться HIGH и LOW.

Еще один способ взглянуть на это состоит в том, что вам (вероятно) действительно не важно, чтофактическое состояние вывода:вас волнует, что это значит: кнопка нажата, датчик движения обнаружил кого-то, стержни управления были опущены и т. д. Вы можете сохранить значение в любой форме, которая вам подходит, например, bool, и конвертировать между своими концептуальнымитип и состояние вывода, где бы вы ни пересекали границу:

bool button_pressed = digitalRead(button_pin) == LOW;
...
digitalWrite(led_pin, button_pressed ? HIGH : LOW);

Не беспокойтесь о дополнительном коде здесь, так как компилятор собирается его оптимизировать, если все имеет «очевидные» значения итипы.

Опять же, это встроенная система, в которой общность часто является второстепенной задачей для размера и скорости.Со встроенной системой вы обычно точно знаете, для какого оборудования вы пишете.Если вам нужно извлечь из этого максимум производительности, вам, вероятно, придется отказаться от использования хороших API digitalRead / digitalWrite и работать непосредственно с регистрами процессора.И это тоже нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...