Чтение из 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

Что я упускаю?

, 👍4


2 ответа


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

5

.parseInt() считывает входящий текст до тех пор, пока не истечет время ожидания или пока не будет прочитано что-то, что не является числом.

Вы отправляете число и, скорее всего, конец строки. Если это окончание строки является простым \n, тогда это вызовет «конец числа» и будет отброшено, а число возвращено. Однако, если вы отправляете \r\n (т. е. CRLF), то у вас фактически есть два конца строки:

1\r\n

Разобрано как:

1\r => return 1
\n => return 0

Полагаться на (плохо написанные) процедуры синтаксического анализа потоков Arduino нехорошо. Они не только блокируют, но часто просто работают неправильно.

Вместо этого вы должны правильно читать последовательный порт, принимая во внимание окончания строк, а затем преобразовывать прочитанную строку в число с помощью atoi().

Учебник по чтению сериалов:

  • https://hackingmajenkoblog.wordpress.com/2016/02/ 01/чтение-сериала-на-ардуино/
,

-1

Вот действительно хорошее и простое решение (более надежное также в отношении разрывов строк): https://stackoverflow.com/a/ 20962137/2714285

int x;
String str;

void loop() {
    if (Serial.available() > 0) {
        x = Serial.parseInt();
        str = Serial.readStringUntil('\n');
    }
}
,

это слишком тяжелое решение, чтобы избавиться от одного \n, @Juraj

Если ваша цель - скорость, я понимаю вашу точку зрения, но сначала я попробовал решение статьи Маженко, и оно просто не сработало в Linux (символ \n просто не распознавался). И это, кстати, намного сложнее с точки зрения удобочитаемости/кода/документов для поддержки, если вы работаете в команде., @Jean Claveau