Зачем нужно использовать delay() после использования Serial.flush() в программе

Этот код является частью длинного кода для понимания последовательной связи и связанных с ней функций.

char buffer[18];
int red, green, blue;
int RedPin = 11;
int GreenPin = 10;
int BluePin = 9;

void setup()
{
Serial.begin(9600);
Serial.flush();
pinMode(RedPin, OUTPUT);
pinMode(GreenPin, OUTPUT);
pinMode(BluePin, OUTPUT);
}

void loop()
{
if (Serial.available() > 0) {
int index=0;
delay(100); // даем буферу заполниться
int numChar = Serial.available();
if (numChar>15) {
numChar=15;
}
while (numChar--) {
buffer[index++] = Serial.read();
}
splitString(buffer);
}
}

В void setup() используется Serial.flush(). В Интернете я читал, что он удаляет любой символ, присутствующий в последовательной строке. После ее вызова мы можем быть уверены, что все данные были отправлены, прежде чем переходить к следующей строке программы.

В void loop() в первом условии if задержка (100) обеспечивает заполнение буфера. По сути, буфер — это место в памяти, где хранятся полученные последовательные данные перед обработкой.

Вопрос в том, есть ли необходимость в использовании delay(100), если мы сначала вызываем Serial.flush(), потому что это гарантирует, что все последовательные данные были переданы (так как при последовательной передаче один бит передается за один раз). время)? Требуется ли дополнительное время для сохранения переданных данных в памяти (буфере) и является ли это причиной использования задержки (100)? Пожалуйста, объясните, почему задержка (100) используется после вызова Serial.flush(), я запутался.

, 👍1

Обсуждение

flush() изменилось использование в Arduino много лет назад. первое использование состояло в том, чтобы «съесть» все входные данные. теперь он очищает буфер TX. из журнала изменений для Arduino 1.0 «Serial.flush() теперь ожидает передачи исходящих данных, а не отбрасывает полученные входящие данные»., @Juraj

Serial.flush() ожидает передачи исходящих данных. Но включает ли это время ожидания хранение данных в буфере? Поскольку мы используем delay() в дальнейшей части кода., @Manu

Нет. Использование флеша здесь уместно. Там это не нужно. Это было написано кем-то, кто не понимает, что он делает. Вы можете просто удалить эту флеш-линию., @Delta_G

Задержка в цикле не имеет отношения. Это ждет, пока отправитель закончит отправку. Это плохой метод блокировки. Есть гораздо лучшие способы написать этот код. Вероятно, вам следует выбросить это в мусорное ведро и найти что-нибудь, написанное кем-то, кто знает, что делает., @Delta_G

flush() здесь ничего не делает. при запуске в буфере передачи нет данных для сброса. и как это поможет с получением?, @Juraj


1 ответ


2

Serial.flush() ничего не делает. Он задерживается до тех пор, пока все байты не будут отправлены из UART. Поскольку ничего не было отправлено, ему нечего ждать.

Задержка после вызова available — очень плохая практика. Это действительно очень плохой способ работы с последовательным чтением.

Вам следует прочитать это, чтобы лучше понять последовательную связь.

,