Serial.read() не работает в инструкции IF

Я работаю с модулем XBee, поэтому, естественно, я начал цикл void с тестирования AT-команд.

void loop() {
    digitalWrite(Sleep_Rq,LOW);

A +++ с защитным временем в 1 секунду до и после него переводит модуль xbee в командный режим.

delay(1000);
xbeeSerial.write("+++");              // Вход в командный режим
delay(1000);    

Эта часть кода помещает последовательные данные в строковую переменную x в виде строки.

while(xbeeSerial.available()) {              
    x = xbeeSerial.readString();           
}

Serial.println() возвращает OK на последовательный монитор.

Serial.println(x);

Но когда я сравниваю x с OK, ничего не происходит, 1 не появляется на последовательном мониторе.

if(x=="OK")
  {
   Serial.println(1);
  }
}

Я попробовал заменить «ОК» на 4F4B (ascii-эквивалент OK), 20299 (десятичное значение). Я также попробовал изменить тип данных x со String на Word и сравнил x с 0100111101001011. Я также попробовал изменить условие IF следующим образом:

if(Serial.println(x)=="OK") 
    {
     Serial.println(1);
    }

и многие другие методы, которые так и не удалось найти.

, 👍0

Обсуждение

X, вероятно, не «ОК», а «ОК\n», или «ОК\r», или даже «ОК\r\n». Читайте: https://majko.co.uk/blog/reading-serial-arduino., @Majenko

@Маженко, ты должен опубликовать это как ответ, чтобы ОП мог принять его, и каждый мог сказать, что на вопрос дан ответ., @Duncan C

@DuncanC Я не знаю, какое из них является настоящим исправлением... К тому же я занят..., @Majenko

Ой, извини, не упомянул. Правильный вариант — «ОК\r»., @Md Arshad Ali

Возможный дубликат Сравнение строк при использовании последовательного порта, @Juraj


1 ответ


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

1

Ваша проблема в том, что вы предполагаете, что все, что вы видите в последовательном мониторе, — это все, что есть. Вы видите «ОК» и ожидаете сравнить полученный текст с «ОК».

Однако это не так. Последовательная связь (по крайней мере, текстовая последовательная связь) обычно включает в себя какой-либо маркер окончания строки. Это может быть любая комбинация возврата каретки (\r) и/или перевода строки (\n). На разных устройствах используются разные комбинации.

Оказывается, XBee использует '\r' в качестве маркера окончания строки.

Есть два способа справиться с этим:

  1. Включите в сравнение строку, заканчивающуюся ("OK\r") или лучше
  2. Включите строку, заканчивающуюся в тексте.

Второй момент предполагает использование readStringUntil():

String x = xbeeSerial.readStringUntil('\r');

Это более надежный способ чтения ответа, поскольку он считывает все до конца строки, а не до тех пор, пока не истечет время ожидания, и читать больше нечего. С этим методом вы обнаружите, что вся ваша программа работает более плавно.

,