Запустить функцию одновременно с server.available()
У меня есть плата Arduino UNO WiFi Rev2, на которой работает WiFiServer, выступающий в качестве веб-сервера. Сервер слушает и принимает клиентов, используя server.available()
. Мне также нужен цикл, который управляет сервоприводом одновременно с сервером.
Я просмотрел ArduinoThread и попытался реализовать с его помощью свой веб-сервер.
class WebServer : public Thread
{
private:
// Определения некоторых методов опущены
WiFiServer server;
void accept_and_process();
public:
void run() override;
}
void WebServer::accept_and_process()
{
Serial.println("Waiting for client");
// прослушивание входящих клиентов
WiFiClient client = server.available();
// Обработка клиента
}
void WebServer::run()
{
this->accept_and_process();
this->runned();
}
Но код не выполняется параллельно с кодом в void loop()
, он только запускает код внутри функции цикла и не принимает клиента, как ожидалось
Это код, с которым я запускал сервер
void setup()
{
Serial.begin(9600);
WebServer webserver = WebServer();;
webserver.setInterval(100);
webserver.run();
}
void loop()
{
Serial.println("Hello");
delay(1000);
}
Как мне запустить сервер одновременно с другой функцией.
@sqz, 👍2
Обсуждение1 ответ
Лучший ответ:
На одноядерном Arduino нет «параллельного соединения». Все, что вам нужно сделать, это запрограммировать обе вещи неблокирующим образом. Не используйте задержки или циклы while, ожидающие чего-то, и вы можете делать обе вещи так быстро, что кажется, что они параллельны. Поместите вызов server.available() в цикл, а затем, если он вернет недопустимый клиентский объект, остальная часть цикла будет запущена. Если он возвращает действительный клиентский объект, вы можете быстро сделать с сервером все, что вам нужно, а затем вернуться ко всему остальному.
Как отмечено в комментариях, server.available не блокируется. Он не ждет, пока что-нибудь придет, он просто возвращает, есть ли доступное соединение или нет.
- Подключение веб-сервера в GoDaddy Hosting
- Несколько клиентских серверов через Wi-Fi
- WebSocketsServer.h: No such file or directory
- Как получить данные из базы данных моего сервера в переменную в моем Arduino?
- ESP32 в Arduino-IDE с FS.h и SPIFFS
- Веб-сервер Arduino: более быстрая альтернатива «indexof» для разбора запросов GET?
- Как разрешить междоменные запросы на ESP8266 WebServer
- Почему функция server.on() из "ESPAsyncWebServer.h" выполняется на стороне setup(), а не на стороне loop()?
На одноядерном ардуино нет «параллели». Все, что вам нужно сделать, это запрограммировать обе вещи неблокирующим образом. Не используйте задержки или циклы while, ожидающие чего-то, и вы можете делать обе вещи так быстро, что кажется, что они параллельны. Существует множество руководств по неблокирующему коду. Или опубликуйте здесь какой-нибудь реальный компилируемый код, и, возможно, кто-то поможет вам увидеть, как это сделать., @Delta_G
@Delta_G спасибо за предложение, я переместил
server.available()
вvoid loop()
, чтобы разблокировать выполнение. Я все еще экспериментирую с этим, но теперь все должно работать так, как ожидалось., @sqzЯ никогда не ожидал, что
server.available()
будет неблокирующим, потому что я предполагаю, что это в основномsocket.accept()
на других языках, которые большую часть времени блокируют., @sqzНет. server.available ничего не ждет. Он просто сразу возвращает, есть ли доступное соединение. Если нет, то он возвращает false и движется дальше. Не предполагай. Есть отличная поговорка о том, что происходит, когда вы что-то предполагаете. Посмотрите, если не знаете., @Delta_G
@Delta_G эй, не могли бы вы опубликовать свои комментарии в качестве ответа, чтобы я мог его принять?, @sqz