Serial.flush() в ардуино

Я новичок в Arduino, и у меня есть следующее:

int     delaynum;
char    cval[12];

void setup()
{
 Serial.begin(9600);
 Serial.print("Enter Number");
 Serial.flush();

 int i=0;
 while(i<12)
 {
  if(Serial.available()>0)
  {
    char ch=Serial.read();
    if(ch>='0'&&ch<='9')
    {
      cval[i]=ch;
      i++;
    }
    else
    {
      cval[i]=0;
      delaynum=atoi(cval);
      break;
    }
  }
 }
}
void loop()
{
   Serial.println(delaynum);
   exit(0);
} 

Вывод кода на виртуальную макетную плату: (я ввел 100)

Выход 1

Но когда я удаляю Serial.flush(), вывод выглядит так (я ввел 100)

Вывод 2

Я ожидаю результат:

Введите число (я хочу ввести число 100 после вывода)

100

Почему код не работает?

Я использую Arduino IDE с виртуальной макетной платой (ATMega328p)

, 👍0

Обсуждение

это ошибка эмуляции. Serial.flush() только ждет, пока данные не будут отправлены полностью., @Juraj


1 ответ


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

0

Не зная, что делает виртуальный макет на обычном Arduino, он сделал бы следующее:
Serial.flush() очищает буфер, и для этого требуется некоторое время, обычно вы ждете минимум около 100 мс, чтобы снова записать/прочитать этот буфер.
Поскольку ваш код запускается в настройках (то есть только один раз), серийный номер недоступен, так как он все еще сбрасывается, и поэтому ваш результат.
Как следует из названия setup, его следует использовать только для настройки HW/SW, но не для запуска подпрограмм, так как вы можете получить всевозможные странные результаты. их, и сброс будет необходим только в том случае, если соединение прервано и вам нужно повторно отправить данные.
ОБНОВЛЕНО

Waits for the transmission of outgoing serial data to complete.

Если вы отправляете символ, он помещается в буфер для передачи. Для отправки каждого символа требуется время, потому что последовательный порт работает медленно. Как только он окажется в буфере, он будет автоматически отправлен в фоновом режиме, в то время как программа сразу же перейдет к следующему оператору. Это сделано для того, чтобы программа не тратила время на ожидание отправки символов.

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

Поэтому после вызова flush() вы можете быть уверены, что все данные отправлены, а буфер пуст. Так что в вашем случае, где вы его разместили, смысла нет.

,

Можете ли вы объяснить более подробно, и Arduino использует один и тот же буфер как для ввода, так и для вывода, или serial.flush() очищает как входные, так и выходные буферы?, @srilakshmikanthanp

См. мое редактирование выше. Пожалуйста, отметьте как принятое, если все в порядке, @Codebreaker007

Так что в вашем случае куда вы его разместили нет смысла, почему? Arduino не ждет в функции настройки, и какое решение для этого, можете ли вы объяснить, пожалуйста, я новичок в этом., @srilakshmikanthanp

Пожалуйста, прочтите на Arduino.cc основные101. Я не буду учить здесь, мы решаем одну проблему за раз., @Codebreaker007

почему-то этот ответ ничего не говорит, чтобы решить проблему, @Juraj

Я не понимаю: «Поскольку ваш код запускается в настройке (так что только один раз), серийный номер недоступен, так как он все еще сбрасывается, и поэтому ваш результат». Почему серийный номер недоступен?, @Juraj

Я ненавижу людей, которые просто пишут комментарии, не просветив нас всех своей мудростью. Его проблема заключается в том, что при вызове serial.flush перед id serial. available в процедуре установки он не показывает никаких выходных данных в Android, и он спросил, почему? Для завершения последовательного сброса требуется время, поэтому следующий шаг (если) не обрабатывается, что было бы, если бы он находился в цикле (вызывая его возвращение к подпрограмме) каждые x мс. Ответ — запустить код в цикле или не сбрасывать без задержки в настройке., @Codebreaker007

if после flush находится в цикле while, который не заканчивается до тех пор, пока не будут получены 12 цифр или нецифровой символ. в очень старых ядрах Arduino для очистки приемного буфера использовался сброс., @Juraj