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)
Но когда я удаляю Serial.flush()
, вывод выглядит так (я ввел 100)
Я ожидаю результат:
Введите число (я хочу ввести число 100 после вывода)
100
Почему код не работает?
Я использую Arduino IDE с виртуальной макетной платой (ATMega328p)
1 ответ
Лучший ответ:
Не зная, что делает виртуальный макет на обычном 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
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
это ошибка эмуляции. Serial.flush() только ждет, пока данные не будут отправлены полностью., @Juraj