Чтение из Serial
с помощью следующего скетча я должен иметь возможность читать и сохранять то, что вводится в Serial Monitor
void setup() {
Serial.begin(115200);
while(!Serial);
}
void loop() {
Serial.println("Enter Zone Number: ");
while(!Serial.available()){
}
int zone = Serial.parseInt();
Serial.println(zone);
}
если я введу "1", я бы исключил это:
Enter Zone Number:
1
но, к сожалению, у меня есть это:
Enter Zone Number:
1
Enter Zone Number:
0
Что я упускаю?
@rebrid, 👍4
2 ответа
Лучший ответ:
.parseInt()
считывает входящий текст до тех пор, пока не истечет время ожидания или пока не будет прочитано что-то, что не является числом.
Вы отправляете число и, скорее всего, конец строки. Если это окончание строки является простым \n
, тогда это вызовет «конец числа» и будет отброшено, а число возвращено. Однако, если вы отправляете \r\n
(т. е. CRLF), то у вас фактически есть два конца строки:
1\r\n
Разобрано как:
1\r => return 1
\n => return 0
Полагаться на (плохо написанные) процедуры синтаксического анализа потоков Arduino нехорошо. Они не только блокируют, но часто просто работают неправильно.
Вместо этого вы должны правильно читать последовательный порт, принимая во внимание окончания строк, а затем преобразовывать прочитанную строку в число с помощью atoi()
.
Учебник по чтению сериалов:
- https://hackingmajenkoblog.wordpress.com/2016/02/ 01/чтение-сериала-на-ардуино/
Вот действительно хорошее и простое решение (более надежное также в отношении разрывов строк): https://stackoverflow.com/a/ 20962137/2714285
int x;
String str;
void loop() {
if (Serial.available() > 0) {
x = Serial.parseInt();
str = Serial.readStringUntil('\n');
}
}
- Float печатается только 2 десятичных знака после запятой
- Почему запуск последовательного монитора перезапускает скетч?
- Связь последовательного порта Digispark
- Arduino IDE «Инструменты> Последовательный порт» неактивен (Ubuntu)
- NodeMCU второй HARDWARE последовательный TX в качестве порта отладки
- Ошибка чтения флэш-памяти, 1000
- Как отобразить всю входящую строку с serial monitor в arduino ide?
- SoftwareSerial данные недоступны
это слишком тяжелое решение, чтобы избавиться от одного \n, @Juraj
Если ваша цель - скорость, я понимаю вашу точку зрения, но сначала я попробовал решение статьи Маженко, и оно просто не сработало в Linux (символ \n просто не распознавался). И это, кстати, намного сложнее с точки зрения удобочитаемости/кода/документов для поддержки, если вы работаете в команде., @Jean Claveau