Команда через последовательный монитор не работает должным образом в 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");
}
@java bee, 👍1
Обсуждение2 ответа
Лучший ответ:
Решением было использование функции String.trim(). Спасибо, ребята, за быстрый ответ на вопрос.
Похоже, что корень вашей проблемы заключается в незнании того, что делает 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;
}
Простое изменение, но оно означает, что вам не придется добавлять дополнительную обработку по удалению нежелательных символов из строки.
- Очень простая операция Arduino Uno Serial.readString()
- Как получить ненулевой выход из HX711 и ячейки загрузки?
- Как остановить серводвигатель в текущем положении при использовании последовательного порта? Я хочу, чтобы он оставался в одном положении при получении «0».
- Arduino Serial.ReadString() проблема
- Метод перебора битов в байте, отправленном по последовательному каналу.
- Из string в int, проблема
- Arduino Uno по-прежнему загружается и работает, но нет последовательной связи через USB
- Как преобразовать строку в шестнадцатеричный массив
как устанавливается окончание строки в 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