Чтение из 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)
- Как установить последовательные драйверы FTDI на Mac?
- как отправить данные в Adafruit Bluefruit Feather (32u4) через Bluetooth?
- NodeMCU второй HARDWARE последовательный TX в качестве порта отладки
это слишком тяжелое решение, чтобы избавиться от одного \n, @Juraj
Если ваша цель - скорость, я понимаю вашу точку зрения, но сначала я попробовал решение статьи Маженко, и оно просто не сработало в Linux (символ \n просто не распознавался). И это, кстати, намного сложнее с точки зрения удобочитаемости/кода/документов для поддержки, если вы работаете в команде., @Jean Claveau