оператор if со сравнением строк
Фрагмент кода:
String a;
const int red_led_pin = 13;
void setup()
{
Serial.begin(115200);
Serial.println("Hello, ESP32-S2!");
pinMode(red_led_pin, OUTPUT);
}
void loop() {
while (Serial.available())
{
a = Serial.readString();// read the incoming data as string
Serial.print(" First: ");
Serial.println(a);
if (a.equals("on"))
{
Serial.println("LED ON");
digitalWrite(red_led_pin, HIGH);
}
else if (a == "off" || a == "OFF")
{
Serial.println("LED OFF");
digitalWrite(red_led_pin, LOW);
}
Serial.print("Second: ");
Serial.println(a);
}
}
Serial.print
вывод:
Схема:
Проблема:
Код не может захватить строку on
или любую другую строку (on
, off
или OFF
). ), что я прохожу. Однако он подбирает его и Serial.print
его.
Что происходит?
Вещи, которые я пробовал:
Я пробовал для сравнения:
if (a.equals("на")){<>}
if (a == "вкл")){<>}
if (a.equalsIgnoreCase("on")){<>}
Комплексная экспертиза/предварительные исследования:
- [ Документация ] Операторы сравнения строк
- [Документация] String()
- [ Форум ] Сравнение символов (или строк) в “ если”
@3kstc, 👍3
Обсуждение1 ответ
Лучший ответ:
Ваша проблема в конце строки. Serial Monitor имеет возможность отправить строку, заканчивающуюся после введенных вами данных. Это окончание строки может быть другим в зависимости от этого параметра, хотя в мире Arduino в основном используется простой символ новой строки '\n'
.
Это окончание строки будет в вашей строке при использовании Serial.readString()
, поэтому строка равна не "on"
, а чему-то вроде "на\n"
.
Вы можете решить эту проблему двумя способами:
- Установите последовательный монитор так, чтобы строка не заканчивалась.
- Или лучше: используйте что-то вроде
Serial.readStringUntil()
и передайте ему символ конца строки в качестве параметра (например,Serial.readStringUntil('\n')
). Это будет считываться из последовательного интерфейса до тех пор, пока не будет достигнут указанный символ. Указанный символ будет отброшен, и у вас останутся только данные, которые вы затем сможете сравнить. Это также имеет то преимущество, что ваш код будет реагировать намного быстрее, так как он не ждет 1 с для новых данных (пока вы действительно отправляете необходимое окончание строки).
если есть \r, может помочь trim(). но как всегда лучше не использовать String, @Juraj
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- форматирование строк в Arduino для вывода
- Очень простая операция Arduino Uno Serial.readString()
- DateTime в строку
- Как преобразовать строку в массив байтов
- Как отправить строку на мастер с помощью i2c
- Создание форматированной строки (включая числа с плавающей запятой) в Arduino-совместимом C++
Какое окончание строки вы установили в Serial Monitor? Я предполагаю, что Serial Monitor отправляет строку, заканчивающуюся после фактических данных, которые включаются с помощью
Serial.readString()
, так что строка не равна"on"
, а, например, `"on\ н"., @chrisl@chrisl вот оно что...
Serial.readStringUntil('\n')
, @3kstcОтлично, я написал полный ответ на этот вопрос, @chrisl
@Крисл и все такое. этот вопрос задают часто. давайте использовать эту пару вопросов и ответов как каноническую для будущих дубликатов, @Juraj
Я собираюсь быть дерзким и попросить несколько голосов от сообщества :), @3kstc