Ошибка Вывода Значений Arduino Serial.print

c++

Я экспериментирую со следующей программой, которую я нашел в Интернете (с небольшими изменениями):

int x;
void setup() {
 Serial.begin(9600);
 Serial.setTimeout(1);
}
void loop() {
 while (!Serial.available());
 x = Serial.readString().toInt();
 int y = x + 1;
 Serial.print(y);
}

Я сталкиваюсь с ошибкой в выводе последовательного монитора; если я ввожу 1, то печатаю 21. Я думаю, что происходит то, что каждая цифра в числе увеличивается на 1, а затем 1 по какой-то причине ставится в конце. Например, если я ввожу 234, то на выходе получается 3451. Я думаю , что ошибка кроется в строке x = Serial.ReadString().toInt ();, но не знаю, как это исправить. Спасибо!

, 👍1

Обсуждение

Почему такой короткий тайм-аут?, @Edgar Bonet

@EdgarBonet спасибо, что указали на это! Я не уверен, почему учебник сделал это, но изменение тайм-аута на 100 мс, похоже, исправляет эту ошибку!, @Sony


1 ответ


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

3

Здесь есть две проблемы.

Во-первых, вы вводите не "234", а "2", затем "3" и, наконец, "4". Ваш действительно маленький тайм-аут не дает цифрам достаточно времени, чтобы прибыть.

Во-вторых, окончание вашей строки принимается и интерпретируется как "не число", которое возвращается как 0 с помощью функции .toInt().

Что вам нужно сделать, так это:

  1. Не устанавливайте короткий тайм - аут-вы можете полностью удалить эту строку.
  2. Используйте .readStringUntil('\n') для чтения до тех пор, пока ваша строка не закончится на одном дыхании.
,

Это сработало, спасибо вам тоже за то, что все объяснили! Если я полностью удалю тайм-аут, произойдет заметная задержка ввода, поэтому я просто увеличил время ожидания до 100. Есть ли в этом какой-то недостаток?, @Sony

Да, вы получаете задержку. Используйте readStringUntil('\n'), и время ожидания не используется, поэтому вы не получаете задержек., @Majenko

Спасибо - попробовал, и это работает потрясающе., @Sony