Servidor Ethernet Arduino con interrupción

3

Tengo una aplicación arduino haciendo dos cosas en el loop :

  1. Un servidor web que espera una conexión y muestra algunos formularios html para cambiar los valores de configuración.
  2. Procese algunos datos externos y muéstrelos en una matriz de leds.

El problema es que el procesamiento de los datos lleva mucho tiempo (~ 20 segundos). Así que 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, ¿si existe la posibilidad de usar un controlador de interrupciones para manejar el 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, son 50, 51 y 52), pero esto tampoco funciona. Intenté algo. de esta manera:

attachInterrupt(50, demoFunction, CHANGE);

Pero el método no se llama, incluso cuando se cambian los pines a 51 o 52 en ambos, se ingresa desde un cliente como una solicitud HTTP y se envía un HTML a un navegador.

    
pregunta tbraun89

2 respuestas

0

En los bocetos de Arduino, la función loop() se llama repetidamente. La función de bucle llama a webServer() , que luego se bloquea en un bucle while .

En su lugar, use 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.

    
respondido por el Toby Jaffey
0

Para todos los demás con un problema igual aquí 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 ahora 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é la TimerOne Library .

Espero que esto ayude a alguien.

    
respondido por el tbraun89

Lea otras preguntas en las etiquetas

Comentarios Recientes

conectado directamente a I2C hub 1F] Al presionar ctrl + mouse en este momento, su máquina se encenderá. Antes de comenzar a oler, el Arduino ETC está encendido, tendrá que conectarlo a su simulador de Linux / CAD y ejecutar sus comandos de sniffing. Cuando haya comenzado a oler, notará que el indicador de alimentación del bucle muestra -6 sin interrupciones. La computadora no se reiniciará con una corriente de salida de su enlace, tampoco automáticamente. Por lo tanto, uno de los pasos sería utilizar suspender... Lees verder