Запустить функцию одновременно с 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);
}

Как мне запустить сервер одновременно с другой функцией.

, 👍2

Обсуждение

На одноядерном ардуино нет «параллели». Все, что вам нужно сделать, это запрограммировать обе вещи неблокирующим образом. Не используйте задержки или циклы while, ожидающие чего-то, и вы можете делать обе вещи так быстро, что кажется, что они параллельны. Существует множество руководств по неблокирующему коду. Или опубликуйте здесь какой-нибудь реальный компилируемый код, и, возможно, кто-то поможет вам увидеть, как это сделать., @Delta_G

@Delta_G спасибо за предложение, я переместил server.available() в void loop(), чтобы разблокировать выполнение. Я все еще экспериментирую с этим, но теперь все должно работать так, как ожидалось., @sqz

Я никогда не ожидал, что server.available() будет неблокирующим, потому что я предполагаю, что это в основном socket.accept() на других языках, которые большую часть времени блокируют., @sqz

Нет. server.available ничего не ждет. Он просто сразу возвращает, есть ли доступное соединение. Если нет, то он возвращает false и движется дальше. Не предполагай. Есть отличная поговорка о том, что происходит, когда вы что-то предполагаете. Посмотрите, если не знаете., @Delta_G

@Delta_G эй, не могли бы вы опубликовать свои комментарии в качестве ответа, чтобы я мог его принять?, @sqz


1 ответ


Лучший ответ:

2

На одноядерном Arduino нет «параллельного соединения». Все, что вам нужно сделать, это запрограммировать обе вещи неблокирующим образом. Не используйте задержки или циклы while, ожидающие чего-то, и вы можете делать обе вещи так быстро, что кажется, что они параллельны. Поместите вызов server.available() в цикл, а затем, если он вернет недопустимый клиентский объект, остальная часть цикла будет запущена. Если он возвращает действительный клиентский объект, вы можете быстро сделать с сервером все, что вам нужно, а затем вернуться ко всему остальному.

Как отмечено в комментариях, server.available не блокируется. Он не ждет, пока что-нибудь придет, он просто возвращает, есть ли доступное соединение или нет.

,