Ich habe eine Arduino-Anwendung, die zwei Dinge in der tut loop
:
Das Problem ist, dass die Verarbeitung der Daten viel Zeit in Anspruch nimmt (~20 Sekunden). Während dieser Zeit kann der Webserver also nichts tun. Meine Programmstruktur sieht so aus:
EthernetServer server(80);
void loop() {
webServer()
processAndShowData();
}
void webServer() {
EthernetClient serverClient = server.available();
if (serverClient) {
while (serverClient.connected() {
// handle the web server stuff in here
}
}
}
Meine Frage ist also, ob es eine Möglichkeit gibt, einen Interrupt-Handler für die Handhabung des Webserver-Zeugs zu verwenden? Dann könnte der Webserver reagieren, während die andere Task läuft.
UPDATE: Ich habe jetzt auch versucht, einen Interrupt an die Ethernet-Pins (bei einem Mega sind das 50, 51 und 52) zu legen, aber das geht auch nicht. ich habe etw. ausprobiert so was:
attachInterrupt(50, demoFunction, CHANGE);
Aber die Methode wird nicht aufgerufen, selbst wenn die Pins auf 51 oder 52 auf beiden geändert werden, Eingabe von einem Client wie eine HTTP-Anforderung und Ausgabe, die HTML an einen Browser sendet.
In Arduino-Sketches loop()
wird die Funktion wiederholt aufgerufen. Ihre Schleifenfunktion ruft auf, webServer()
die dann in einer while
Schleife blockiert.
Verwenden Sie stattdessen if (serverClient.connected())
in Ihrer Schleife und implementieren Sie Ihre Webserverlogik als Zustandsmaschine, die in der Lage ist, ein wenig Arbeit zu erledigen und dann die Kontrolle an die Hauptschleife zurückzugeben.
Auf diese Weise wird Ihr Programm die Ausführung nicht blockieren.
Für alle anderen mit dem gleichen Problem habe ich folgendes gemacht:
#include <SPI.h>
#include "TimerOne.h"
void setup() {
Timer1.initialize(200000);
Timer1.attachInterrupt(displayInterrupt);
}
void loop() {
webServer();
}
void displayInterrupt() {
processAndShowData();
}
processAndShowData
ist nun keine Sperrmethode mehr, bei jedem Aufruf des Interrupts wird eine kleine Datenmenge verarbeitet.
Um den Timer-Interrupt zu verwenden, habe ich die TimerOne-Bibliothek hinzugefügt .
Hoffe, das wird jemandem helfen.
tbraun89
processAndShowData();
blockiert, also nichtwebServer();
während der Verarbeitung der Daten, der Webserver kann nicht auf Antworten reagieren. (Eigentlich versuche ich, die Verarbeitung mit Interrupts durchzuführen)Toby Jaffey
tbraun89
Toby Jaffey