Последовательная связь, если инструкция не работает

#include <SoftwareSerial.h>
SoftwareSerial my (D6,D7); //(Rx,Tx)
String msg;

void setup() {
Serial.begin(115200);
my.begin(9600);
}

void gas()
{
  
  Serial.println(msg);
  if (msg == "0")
  {
    Serial.println("Gas Leakage !!");
  }
  if(msg == "1") {
    delay(1);
  } 
}
 
void loop() {
  
  msg = my.readStringUntil('\n');
  gas(); 
}

//Я использую Serial программного обеспечения для обмена данными с Arduino UNO на NodeMCU, я получаю данные правильно, но условие "условие оператора if" с ним не работает. как заставить оператор if работать?

, 👍0

Обсуждение

Возможно, у вас также есть \ r в вашей строке. Как именно вы отправляете сообщение?, @chrisl

моя проблема решена путем замены if (msg == "0") на if (msg[0] == '0') , но я не знаю почему?, @Syed Abubakar

Я бы предположил именно ту причину, которую я указал выше, @chrisl

что означает этот терминатор \r\n? в последовательной связи?, @Syed Abubakar

Пожалуйста, ответьте на вопрос, как именно вы отправляете сообщение. Тогда я напишу правильный ответ на ваш вопрос. Вы используете Serial.println()? Или вы пересылаете данные из Serial Monitor, установленного на оба конца строки?, @chrisl

да, я использую Serial.println(), @Syed Abubakar

https://www.arduino.cc/reference/en/language/functions/communication/serial/println/, @Juraj


1 ответ


2

Вы используете Serial.println() для отправки сообщения. Эта функция добавит комбинацию \r\n в качестве окончания строки к вашему сообщению, которая представляет собой коды ASCII для возврата каретки и новой строки.

В вашем коде получения вы читаете до \n, поэтому ваше сообщение теперь читается как "0\r", что, конечно, не равно "0". Таким образом, условие if никогда не сработает.

При использовании msg[0] == '0' вы берете первый символ из строки и сравниваете его с символом '0' (особенно обратите внимание разница между "0", который является строкой, и '0', который является одним символом). Поскольку вы используете только первый символ строки, \r не учитывается; вы его не используете.

Что теперь делать?

  • Вы можете отправить сообщение только с символом \n в конце строки. Для этого используйте только Serial.print() вместо Serial.println() и добавьте строку Serial.print("\n"); сразу после отправки сообщения.

  • Вы можете написать свой собственный код для чтения до тех пор, пока не удалите все вхождения символа \r.

  • Вы можете использовать msg.trim() для удаления любых пробелов в начале или конце строки, включая \r в конце . Затем вы можете использовать код, который вы уже написали.


Обратите внимание, что использование String на Arduino чаще всего считается злом. Особенно, если вы хотите использовать код в течение более длительного периода времени или используете String очень часто. Память для String выделяется динамически, что может легко привести к фрагментации кучи. Для лучшего и более подробного объяснения посмотрите злые строки Arduino, запись в блоге Маженко, который является одним из наших крупнейших участников здесь.

,