Почему мы используем client.flush() в коде, когда мы подключаем Esp8266 к Интернету или серверу?
Я использую модуль Esp8266 Wifi (12-E) для управления светодиодом через доступ к Wi-Fi/веб-серверу. Я написал код в Arduino ide, взяв различные ссылки из Google. В коде я не понял client.flush(), почему мы используем этот метод? В гугле я искал много объяснений, мне часто приходилось объяснять, чего я пока не понимаю. "Ожидает завершения передачи исходящих последовательных данных" Я еще не успел. кто-нибудь может объяснить мне простыми словами?
/
// Подождать, пока клиент отправит данные
Serial.println("new client");
while(!client.available()){
delay(1);
}
// Читаем первую строку запроса
String request = client.readStringUntil('\r');
Serial.println(request);
client.flush();
@Arijeet Roy, 👍1
1 ответ
Лучший ответ:
Скорее всего, это связано с старым использованием .flush()
из версии IDE до 1.0.0.
В этих старых версиях .flush()
стирала все ожидающие данные в буфере приема. Это было эквивалентно:
while (client.available()) {
client.read();
}
Теперь это используется для проверки того, что все данные были отправлены, прежде чем делать что-либо еще. В данной ситуации это совершенно бессмысленно.
- Как разрешить междоменные запросы на ESP8266 WebServer
- Управление реле 5В с помощью Wemos D1 R1
- Использование ESP8266-01 с Arduino uno R3
- Создать один сервер в режиме точки доступа, а другой - в режиме станции.
- Веб-сервер ESP8266 недоступен через 2 минуты после сброса
- Веб-сервер ESP8266 отображает только текст, даже если тип контента — текст/HTML.
- Веб-сервер ESP8266 не отвечает
- Ошибка при компиляции скетча для Arduino Uno (ld return 1)
Я имею в виду, предположим, что если я клиент, запросите что-нибудь с сервера, и мой запрос будет прочитан в Arduino с помощью этой строки « Строковый запрос = client.readStringUntil('\r');" Затем последовательный монитор напечатает мое сообщение. потом клиент. flush сбрасывает мой текущий запрос перед переходом к новому запросу клиента. Это? пожалуйста, дайте мне простой пример, где я могу легко понять. если возможно, попробуйте объяснить мне из кода, который размещен выше., @Arijeet Roy
С версией IDE, выпущенной за последние несколько лет,
client.flush()
абсолютно ничего не сделает. В старой версии он отбрасывал все, что осталось в буфере., @Majenko**В этих старых версиях .flush() стирала все ожидающие данные в буфере приема. Это было эквивалентно **, можете ли вы объяснить мне, что означает приемный буфер? это место, где будут храниться входящие данные?, @Arijeet Roy
Да. Здесь ваш «клиент» хранит данные, которые он получает *до* того, как вы их
.read()
., @Majenko**С версией IDE, выпущенной за последние несколько лет, client.flush() абсолютно ничего не сделает. В старой версии он отбрасывал все, что оставалось в буфере.** Сэр, мне нужно спросить вас, что такое буфер?, @Arijeet Roy
**Да. Здесь ваш «клиент» хранит данные, которые он получает, прежде чем вы их .read().** Сэр, не могли бы вы вкратце объяснить мне приведенный выше код, который я разместил ранее?, @Arijeet Roy
Клиент никогда не знает, когда он получит данные. Только что приходят данные. При этом запускается прерывание (обычно). Это прерывание получает поступившие данные и сохраняет их во внутреннем блоке памяти, называемом «буфером». Затем ваш код использует
.read()
для получения данных из этого "буфера". Данные могут поступать и сохраняться в этом буфере в любое время, а не только тогда, когда вы используете.read()
, чтобы получить их в своей программе. Если отправлено (и, следовательно, сохранено в буфере) больше данных, чем вы прочитали с помощью.read()
, тогда данные останутся..flush()
используется для удаления..., @Majenko... эти данные из буфера, а сейчас нет. Теперь, если вы хотите удалить все оставшиеся данные, вам придется сделать это вручную., @Majenko
Давайте [продолжим это обсуждение в чате](https://chat.stackexchange.com/rooms/113425/discussion-between-arijeet-roy-and-majenko)., @Arijeet Roy