Tengo una aplicación arduino haciendo dos cosas en loop
:
El problema es que el procesamiento de los datos lleva mucho tiempo (~20 segundos). Entonces, mientras esta vez, el servidor web no puede hacer nada. La estructura de mi programa se ve así:
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
}
}
}
Entonces, mi pregunta es, ¿hay alguna posibilidad de usar un controlador de interrupciones para manejar las cosas del servidor web? Entonces el servidor web podría reaccionar mientras se ejecuta la otra tarea.
ACTUALIZACIÓN: ahora también intenté adjuntar una interrupción a los pines de ethernet (usando un Mega, estos son 50, 51 y 52), pero esto tampoco funciona. Intenté algo. como esto:
attachInterrupt(50, demoFunction, CHANGE);
Pero no se llama al método, incluso cuando se cambian los pines a 51 o 52 en ambos, la entrada de un cliente como una solicitud HTTP y el envío de HTML a un navegador.
En los bocetos de Arduino, la loop()
función se llama repetidamente. Su función de bucle llama webServer()
a la que luego bloquea en un while
bucle.
En su lugar, úselo if (serverClient.connected())
en su bucle e implemente la lógica de su servidor web como una máquina de estado capaz de hacer un poco de trabajo y luego devolver el control al bucle principal.
De esta manera, su programa no bloqueará la ejecución.
Para todos los demás con un problema igual, esto es lo que hice:
#include <SPI.h>
#include "TimerOne.h"
void setup() {
Timer1.initialize(200000);
Timer1.attachInterrupt(displayInterrupt);
}
void loop() {
webServer();
}
void displayInterrupt() {
processAndShowData();
}
processAndShowData
ya no es un método de bloqueo, cada vez que se llama a la interrupción se procesa una pequeña porción de datos.
Para usar la interrupción del temporizador, agregué TimerOne Library .
Espero que esto ayude a alguien.
braun89
processAndShowData();
bloques, nowebServer();
así mientras el procesamiento de los datos, el servidor web no puede reaccionar a las respuestas. (En realidad trato de hacer el procesamiento con interrupciones)toby jaffey
braun89
toby jaffey