Ошибка: cannot convert 'bool' to 'PinStatus' for argument '2' to 'void digitalWrite(pin_size_t, PinStatus) на Arduino Uno Rev 2. Wi-Fi не работает

Я новичок в микроконтроллерах и пытаюсь понять, как решить эту проблему. При использовании старого микроконтроллера Arduino он работает нормально, но когда я использую новую плату (Arduino Uno Rev 2 Wifi), выдает следующую ошибку:

cannot convert 'bool' to 'PinStatus' for argument '2' to 'void digitalWrite(pin_size_t, PinStatus)'

В этой строке:

digitalWrite(pin_enable_line, !digitalRead(pin_enable_line));

Я использую библиотеку: ReceiveOnlySoftwareSerial.

, 👍5

Обсуждение

Можете ли вы показать нам эскиз, который вы используете?, @VE7JRO

хороший. Ядро MegaAVR использует новый общий API Arduino и имеет перечисление для статуса контакта. используйте HIGH и LOW, а не bool. Итак, digitalWrite(pin_enable_line, (digitalRead(pin_enable_line) == HIGH) ? LOW : HIGH); (значение по-прежнему LOW 0 и HIGH 1), @Juraj


1 ответ


4

Метод digitalRead не возвращает логическое значение. Он возвращает целое число.

Насколько я помню, внутри Arduino.h значения LOW и HIGH определяются как просто целые числа 0 и 1.

#define HIGH 0x1
#define LOW 0x0

Я думаю, что это было изменено на Enum под названием PinStatus, но Enum можно рассматривать как целое число.

Это означает, что вам нужно хранить результаты digitalRead внутри целочисленной переменной.

int value = digitalRead(8);

Он был разработан таким образом, чтобы можно было легко преобразовать значения между целыми и логическими значениями. Благодаря (очень умному) выбору дизайна целое значение 0 (LOW) будет преобразовано в false и любое другое значение (например, 1 или HIGH) будет преобразовано в true.

Оператор ! (логическое значение NOT) можно использовать только с логическими переменными, поэтому компилятору необходимо выполнить несколько «неявных приведений». Когда он станет достаточно умным, он предположит, что вы знаете, что делаете, и сам добавит актерский состав.

Прочитав ошибку, я вижу, что проблема возникает, когда компилятор пытается преобразовать логическое значение в целое число. Таким образом, это неявно правильно оценивается как логическое значение

!digitalRead(pin_enable_line)

Но когда вы пытаетесь поместить его в место для PinStatus, вы получаете исключение

cannot convert 'bool' to 'PinStatus'

Попробуйте добавить «явное приведение» к PinStatus:

digitalWrite(pin_enable_line, (PinStatus)!digitalRead(pin_enable_line));

Это должно решить проблему. Но я предлагаю разбить код на несколько строк и добавить временную переменную. Это значительно упрощает отладку. Доверьтесь оптимизатору кода, встроенному в компилятор. Он поймет, что вы хотите сделать, и фактический машинный код будет таким же.

,

если ты напишешь ответ, почему бы тебе не попробовать? приведение к int не компилируется, @Juraj

@Юрай Странно. Строка digitalWrite(9, (int)!digitalRead(8)); отлично работает в Tinkercad., @Filip Franik

для ядра megaAVR (Uno WiFi 2) с перечислением PinStatus?, @Juraj

@Юрай, ты меня понял. Я читал неправильный исходный код и тестировал его не на том симуляторе. Опубликуйте ответ об использовании тернарного оператора, и я удалю свой., @Filip Franik

приведение к PinStatus может сработать. он компилируется, но я хотел бы знать, работает ли он. но у меня нет платы, которая бы использовала обновленный API Arduino. но перечисление можно проверить самостоятельно., @Juraj

Я провел небольшое моделирование, и Serial.println((TestEnum)false); печатает 0, а Serial.println((TestEnum)true); печатает 1, так что приведение выглядит хорошо. Я скорректирую свой ответ. Если на плате OPs произойдет сбой, я удалю его., @Filip Franik