оператор 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()
  • [ Форум ] Сравнение символов (или строк) в “ если”

, 👍3

Обсуждение

Какое окончание строки вы установили в Serial Monitor? Я предполагаю, что Serial Monitor отправляет строку, заканчивающуюся после фактических данных, которые включаются с помощью Serial.readString(), так что строка не равна "on", а, например, `"on\ н"., @chrisl

@chrisl вот оно что... Serial.readStringUntil('\n'), @3kstc

Отлично, я написал полный ответ на этот вопрос, @chrisl

@Крисл и все такое. этот вопрос задают часто. давайте использовать эту пару вопросов и ответов как каноническую для будущих дубликатов, @Juraj

Я собираюсь быть дерзким и попросить несколько голосов от сообщества :), @3kstc


1 ответ


Лучший ответ:

5

Ваша проблема в конце строки. Serial Monitor имеет возможность отправить строку, заканчивающуюся после введенных вами данных. Это окончание строки может быть другим в зависимости от этого параметра, хотя в мире Arduino в основном используется простой символ новой строки '\n'.

Это окончание строки будет в вашей строке при использовании Serial.readString(), поэтому строка равна не "on", а чему-то вроде "на\n".

Вы можете решить эту проблему двумя способами:

  • Установите последовательный монитор так, чтобы строка не заканчивалась.
  • Или лучше: используйте что-то вроде Serial.readStringUntil() и передайте ему символ конца строки в качестве параметра (например, Serial.readStringUntil('\n') ). Это будет считываться из последовательного интерфейса до тех пор, пока не будет достигнут указанный символ. Указанный символ будет отброшен, и у вас останутся только данные, которые вы затем сможете сравнить. Это также имеет то преимущество, что ваш код будет реагировать намного быстрее, так как он не ждет 1 с для новых данных (пока вы действительно отправляете необходимое окончание строки).
,

если есть \r, может помочь trim(). но как всегда лучше не использовать String, @Juraj