Команда через последовательный монитор не работает должным образом в Arduino

Я выполняю функцию в Arduino, передавая строковый ввод на последовательный монитор.

Проблема в том, что когда я ввожу SHOW$, функция showData() работает, но когда я ввожу тот же SHOW$, она не вызывается. Я хочу вызывать функцию showData() каждый раз, когда я ввожу текст SHOW$ в последовательную консоль.

Мой вопрос заключается в том, какую ошибку я здесь делаю и каково ее решение.

String strReq = "";
char inChar = 0;

void setup() {

  Serial.begin(9600);

}

void loop() {

  while (Serial.available())
  {
    inChar = Serial.read();

    if (inChar == '$') {

     Serial.println(" Received String :");
     Serial.print(strReq);
  
     if (strReq.equalsIgnoreCase("SHOW"))
       showData();

     Serial.flush();
     strReq = "";

    } else {

      strReq = strReq + inChar;
    }
  }
}

void showData() {
  Serial.print("Showing Information");
}

, 👍1

Обсуждение

как устанавливается окончание строки в Serial Monitor? возможно, что во второй раз вы добавите символы конца строки из предыдущего ввода в strReq, @Juraj

установлены оба NL и CR, @java bee

тогда второй вход — «\r\nSHOW», и это не равно SHOW, @Juraj

правильно, потому что в следующий раз он будет печатать с новой строки.. как это решить?, @java bee

один из вариантов — игнорировать управляющие символы при чтении. иначе если (inChar >= 32) {, @Juraj

какой еще вариант есть. потому что в исходном коде я сравниваю слишком много строк. на самом деле последовательный вывод данных для меня не имеет значения. Я включаю и выключаю светодиод по этой команде, во второй раз она не выполняется, как описано в вопросе., @java bee

Знаете ли вы, что делает Serial.flush()?, @Majenko

@Маженко, флеш ждет, пока буфер передачи не опустеет, @Juraj

@Юрай, Юрай, я тебя не спрашиваю. Я знаю, ты знаешь. Глядя на код, я думаю, что Java-пчела думает, что он работает так же, как и в версиях до Arduino 1.0.0., @Majenko

вы можете отключить концы линий в Serial Monitor, @Juraj

Вы также можете использовать *настоящий* эмулятор терминала вместо последовательного «монитора» POS., @Majenko

@Маженко, извини. Я пропустил флеш() в коде ОП, @Juraj

@Juraj Если ОП предположил, что он работает так, как раньше (очищает содержимое буфера RX), тогда код будет работать так, как ожидалось., @Majenko


2 ответа


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

0

Решением было использование функции String.trim(). Спасибо, ребята, за быстрый ответ на вопрос.

,

1

Похоже, что корень вашей проблемы заключается в незнании того, что делает Serial.flush().

До версии Arduino 1.0.0 он Serial.flush() использовался для очистки любых данных в буфере RX последовательного порта. Оно бы выбросило его. В вашем коде будет удалена строка, заканчивающаяся \r\n, которая отправляется вместе с командой.

Однако в Arduino 1.0.0 это было изменено на блокировку выполнения до тех пор, пока все байты не будут отправлены из буфера последовательной передачи. Это было сочтено более полезным, и при необходимости замену исходной функциональности очень легко реализовать.

Это изменение не было широко задокументировано, но оно упомянуто в руководстве:

Ожидает завершения передачи исходящих последовательных данных. (До версии Arduino 1.0 при этом удалялись все буферизованные входящие последовательные данные.)

Итак, если Serial.flush() действует так же, как и в текущих версиях, во второй раз вы получите другую строку. Вы увидите:

SHOW$
\r\nSHOW$
\r\nSHOW$

и так далее.

Вы придумали «исправление», которое использует String::trim() для отбрасывания любых начальных и конечных непечатаемых символов, что удаляет окончания строк из ваших последующих строк. Однако было бы гораздо лучше их игнорировать и не выполнять обрезку.

Самый простой способ — добавлять в строку только те символы, которые можно распечатать:

if (inChar == '$') {
 Serial.println(" Received String :");
 Serial.print(strReq);
 if (strReq.equalsIgnoreCase("SHOW"))
   showData();
 Serial.flush();
 strReq = "";
} else if (inChar >= ' ') { // << Добавляйте, только если есть пробел или выше
  strReq = strReq + inChar;
}

Простое изменение, но оно означает, что вам не придется добавлять дополнительную обработку по удалению нежелательных символов из строки.

,