Serial-port неясно работает

Здравствуйте!
Вот скетч.

[code]
void setup()
{
  
  Serial.begin(9600);
}
void loop()
{
  if (Serial.available() > 0)
  {
    while ((Serial.available() > 0))
    {
      char v = Serial.read();
    }
    Serial.println("PRIKOL");        
  }
}
[/code]

В цикле while я пытаюсь опустошить порт, затем вывести текст “PRIKOL”.

Если в монитор порта ввести три символа: “123”, то этот текст выводится ПЯТЬ раз, а не ОДИН раз как ожидалось.
То есть выводится столько раз, сколько байт пришло в порт: три значимых плюс два управляющих. Почему так?
Спасибо!

Каких “значимых” и “управляющих”?
Потому что пришло 5 байт. 1, 2, 3, и два байта перенос строки.

1 2 3 /r /n

На каждое считывание байта выводится текст “PRIKOL”. Хотя вывод этого текста стоит после цикла.

на скорости 9600 за время выполнения while приходит 1 символ, поэтому прикол твой печатается после каждого сивмола.

Я понимаю так, что if сработает только тогда, когда буфер будет заполнен полностью, то есть, в буфере окажется пять байт. И этот if должнен захватить этот блок и дать возможность отработать while.

да ты дурак штоли? Он будет срабатывать ЕСЛИ ХОТЬ ОДИН СИМВОЛ ПРИДЁТ. По крайней мере у тебя так в условии написано.

1 лайк

Сам ты три дня не умывался.

Ты где-то стырил этот код? Если бы сам писал - не спорил бы…

1 лайк

Нууу… Я хотя бы почитал про Serial.available().

1 лайк

Отправь свои 123 при вот таком коде:

void setup() {
  Serial.begin(9600);
}

void loop() {
  if (Serial.available() > 4)   {
    while ((Serial.available() > 0)) {
      char v = Serial.read();
    }
    Serial.println("PRIKOL");
  }
}

А когда удивишься, почитай это:

1 лайк

То ли дело Вы! Прежде чем спорить со знающим человеком, который Вам отвечает на Ваш же вопрос, Вы тщательно умылись и побрились! Не правда ли?

неправильно понимаете

После этой строки добавьте delay(5);

… и хамит, к тому же.

Да ты шо¡¡¡. Непорядочек, аднака…

Спасибо за помощь!
Если кого-то обидел - простите великодушно!

За какую именно?)

За Вашу. #11.

Посмотри, какое значение возвращает Serial.available();

Если возвращает 1, то тогда все правильно, будет выводится 5 сообщений на одну трехбуквенную строчку.