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);
}
и многие другие методы, которые так и не удалось найти.
@Md Arshad Ali, 👍0
Обсуждение1 ответ
Лучший ответ:
Ваша проблема в том, что вы предполагаете, что все, что вы видите в последовательном мониторе, — это все, что есть. Вы видите «ОК» и ожидаете сравнить полученный текст с «ОК».
Однако это не так. Последовательная связь (по крайней мере, текстовая последовательная связь) обычно включает в себя какой-либо маркер окончания строки. Это может быть любая комбинация возврата каретки (\r
) и/или перевода строки (\n
). На разных устройствах используются разные комбинации.
Оказывается, XBee использует '\r' в качестве маркера окончания строки.
Есть два способа справиться с этим:
- Включите в сравнение строку, заканчивающуюся (
"OK\r"
) или лучше - Включите строку, заканчивающуюся в тексте.
Второй момент предполагает использование readStringUntil()
:
String x = xbeeSerial.readStringUntil('\r');
Это более надежный способ чтения ответа, поскольку он считывает все до конца строки, а не до тех пор, пока не истечет время ожидания, и читать больше нечего. С этим методом вы обнаружите, что вся ваша программа работает более плавно.
- Соединение Xbee Shield to Shield отправляет, но не принимает правильно
- Как подключиться к Arduino с помощью WiFi?
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Использовать все контакты как цифровые входы/выходы
- Float печатается только 2 десятичных знака после запятой
- Arduino как USB HID
- Serial1' was not declared in this scope
X, вероятно, не «ОК», а «ОК\n», или «ОК\r», или даже «ОК\r\n». Читайте: https://majko.co.uk/blog/reading-serial-arduino., @Majenko
@Маженко, ты должен опубликовать это как ответ, чтобы ОП мог принять его, и каждый мог сказать, что на вопрос дан ответ., @Duncan C
@DuncanC Я не знаю, какое из них является настоящим исправлением... К тому же я занят..., @Majenko
Ой, извини, не упомянул. Правильный вариант — «ОК\r»., @Md Arshad Ali
Возможный дубликат Сравнение строк при использовании последовательного порта, @Juraj