Очень простая операция Arduino Uno Serial.readString()

Я новичок в программировании Arduino. Я пытаюсь идентифицировать входную строку с последовательного монитора и соответственно вывести вывод на консоль

Код:

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

void loop() {

   while (Serial.available() > 0 ) {

     String str = Serial.readString();

     if (str.equals("send")) {
        Serial.println("identified");
     } else {
        Serial.println("unknown");
     }

   }

}

Всякий раз, когда я помещаю строку отправки, она показывает "неизвестно" в качестве вывода, что неверно, и я должен получить "идентификацию" в качестве вывода. Может ли кто-нибудь направить меня сюда, чтобы добиться результата.

Примечание. Я получаю вывод, как и хотел, с помощью функции readStringUntil, но в строках много "." в нем, следовательно, бесполезно.

, 👍4

Обсуждение

какова ваша настройка конца строки в Serial Monitor?, @Juraj

как НЛ, так и ЧР., @KarmaCoding

затем проверьте "отправить/r/n", @Juraj

отправить/r/n не работает., @KarmaCoding

затем распечатайте его, чтобы увидеть. с печатью, а не с печатью, @Juraj

а настройка скорости передачи данных в Serial Monitor составляет 9600 бод?, @Juraj

я добавил Serial.print(str); ниже readString , в последовательном мониторе отображается правильная строка, что бы я ни печатал, но результатов все равно нет., @KarmaCoding

Давайте [продолжим это обсуждение в чате](http://chat.stackexchange.com/rooms/71045/discussion-between-karmacoding-and-juraj)., @KarmaCoding

Вы имеете в виду \r\n, а не /r/n..., @Majenko

@Majenko: тоже пробовал. хотя результата нет., @KarmaCoding

Проблема с использованием таких вещей, как readString, заключается в том, что вы действительно не знаете, что они делают или как они работают. Анализируйте входящие данные вручную, чтобы знать, с чем вы работаете., @Majenko


3 ответа


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

5

Если вы установите строку последовательного монитора, заканчивающуюся на "Both NL & CR", тогда этот код найдет слово "отправить". Он НЕ найдет слово "отправить" в этой строке, "ssend" или в этой строке, "sendd".

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

void loop(){
  while(Serial.available() > 0 ){
    String str = Serial.readString();
    if(str.substring(0) == "send\r\n"){
      Serial.println("identified");} 
    else{
      Serial.println("unknown");
    }
  }
}

Если вы хотите найти строку "send" в "1234send", "send1234" или "1234send5678", используйте indexOf();

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

void loop(){
  while(Serial.available() > 0 ){
    String str = Serial.readString();
    if(str.indexOf("send") > -1){
      Serial.println("identified");} 
    else{
      Serial.println("unknown");
    }
  }
}
,

0

Существует множество причин, по которым проверка *.equals неверна. Учитывайте разницу в регистре или дополнительные символы, введенные из источника ваших сообщений. Даже непечатаемые символы могут создать проблемы и привести к сбою теста.

Рассмотрите возможность использования вместо этого *.substring(). Этот метод вернет true, если подстрока будет найдена. Например:

  String stringOne = "12345 send 1234";

  // substring(index) ищет подстроку от позиции индекса до конца:
  if (stringOne.substring(0) == "send") 
  {
    Serial.println("identified");
  } 
  else
  {
    Serial.println("unknown");
  } 

...должно всегда возвращать значение "identified", поскольку символы 's', 'e', 'n' и 'd' находятся в правильной последовательности в строке stringOne.

,

Строка ул = Serial.readString(); если (str.substring(0) == "отправить") Serial.println («идентифицировано»); еще Serial.println ("неизвестно"); это даже не сработало., @KarmaCoding

Странный. Вы смотрели ссылку на веб-страницу, чтобы убедиться, что правильно используете подстроку? ([Эта веб-страница?](https://www.arduino.cc/en/Tutorial/StringSubstring)). Кроме того, из комментариев я вижу, что вы распечатали полученную строку и увидели «отправить» в полученном сообщении, верно? Вы можете просто закомментировать строку последовательного чтения и попробовать использовать "String str = "12345 send 1234";" проверить, все ли работает. Судя по другим комментариям, вы можете быстро попробовать отправить (ввести) «пробел» + «отправить» + «пробел» («отправить»), чтобы увидеть, работает ли это., @st2000

Это не сработает. substring(n) просто возвращает часть строки, начинающуюся с позиции n. Итак, substring(0) просто возвращает копию строки. str.substring(0,4) вернет первые 4 символа строки (при условии, что будет возвращено не менее 4 символов - я недостаточно знаком с этой реализацией, чтобы знать, что она делает для более короткой строки - С# выдаст исключение)., @dwilliss


0
void setup() {
       Serial.begin(9600);
}

void loop() {
   char inChar[5];

   if(Serial.available() > 0 )
   {
     for (int i=0; i<5; i++)
     {
      inChar[i] = Serial.read();
      delay(10);
     }

     if (inChar[0] == 's' && inChar[1] == 'e' \
                          && inChar[2] == 'n' \
                          && inChar[3] == 'd')
         {
          Serial.println("identified");
         }

     else
     {
       Serial.println("unknown");
     }
  }
}
,

Чтение строки «отправить» с помощью команды Serial.readString() в порядке. Но как-то не получится, если использовать результат для сравнения (например, data == "send"...). Возможным решением является использование массива символов (например, inChar[5]). Размер массива на 1 больше, чем максимальное количество необходимых символов., @Ron Lim