Запустить функцию одновременно с 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?
- Как получить параметры запроса от ESPAsyncWebServer?
- контент» не захватывается
- ESP32 в Arduino-IDE с FS.h и SPIFFS
- Веб-сервер Arduino: более быстрая альтернатива «indexof» для разбора запросов GET?
На одноядерном ардуино нет «параллели». Все, что вам нужно сделать, это запрограммировать обе вещи неблокирующим образом. Не используйте задержки или циклы while, ожидающие чего-то, и вы можете делать обе вещи так быстро, что кажется, что они параллельны. Существует множество руководств по неблокирующему коду. Или опубликуйте здесь какой-нибудь реальный компилируемый код, и, возможно, кто-то поможет вам увидеть, как это сделать., @Delta_G
@Delta_G спасибо за предложение, я переместил
server.available()
вvoid loop()
, чтобы разблокировать выполнение. Я все еще экспериментирую с этим, но теперь все должно работать так, как ожидалось., @sqzЯ никогда не ожидал, что
server.available()
будет неблокирующим, потому что я предполагаю, что это в основномsocket.accept()
на других языках, которые большую часть времени блокируют., @sqzНет. server.available ничего не ждет. Он просто сразу возвращает, есть ли доступное соединение. Если нет, то он возвращает false и движется дальше. Не предполагай. Есть отличная поговорка о том, что происходит, когда вы что-то предполагаете. Посмотрите, если не знаете., @Delta_G
@Delta_G эй, не могли бы вы опубликовать свои комментарии в качестве ответа, чтобы я мог его принять?, @sqz