Ошибка: 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
.
@Braley, 👍5
Обсуждение1 ответ
Метод 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
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
Можете ли вы показать нам эскиз, который вы используете?, @VE7JRO
хороший. Ядро MegaAVR использует новый общий API Arduino и имеет перечисление для статуса контакта. используйте HIGH и LOW, а не bool. Итак,
digitalWrite(pin_enable_line, (digitalRead(pin_enable_line) == HIGH) ? LOW : HIGH);
(значение по-прежнему LOW 0 и HIGH 1), @Juraj