2012-04-19 90 views
12

Estoy trabajando con la comunicación de socket en Arduino, y necesito el bloque try/catch para un manejo adecuado, ¿qué sugieren? Mi búsqueda en internet no fue exitosa.try/catch block en Arduino

edición:

El código que estoy trabajando con el módulo utiliza wifly para interactuar con una aplicación móvil, estoy construyendo un módulo de robot con algunos controles sobre la aplicación móvil que utilizan Android. Todo funciona bien, pero a veces el socket se desconecta, así que necesito agregar manejo para esos casos, algo similar a try/catch block, pero no encontré un bloque similar para Arduino.

Mi código:

void loop() { 
    Client client = server.available(); 
    if (client) { 
     while (client.connected()) { 
      if (client.available()) { 
       // Serial.print("client connected \n"); 
       char c = client.read(); 

       if(c == 'L') 
        turnLeft(); 
       if(c == 'R') 
        turnRight(); 
       if(c == 'F') 
        goForward(); 
       if(c == 'B') 
        goBackward(); 
       if(c == 'S') 
        Stop(); 

       Serial.print(c); 
      } 
     } 

     // give the web browser time to receive the data 
     delay(100); 
     client.stop(); 
    } 
} 
+0

Es necesario que nos dará algo más de información ... Al igual que lo que usted ha intentado, lo usted ha encontrado ... –

+0

Acabo de actualizar la pregunta – NZal

Respuesta

17

El Arduino reference is no enumerar try catch (para más detalles sobre qué ver, por ejemplo, este related answer). Y supongo que la implementación de la captura de prueba en un controlador μ podría ser algo difícil/imposible.

Intentar capturar en la mayoría de los idiomas es una operación bastante costosa: la pila de programas se copia una vez para el bloque try y para cada bloque catch. En caso de que la prueba salga mal, la pila try-block será descartada y se ejecutará una de las pilas de catch blocks.
No soy un experto en arquitectura de la CPU, pero me imagino que esto requiere una gran cantidad de intercambio de memoria y operaciones similares; debería ser difícil de lograr con un simple controlador μ.

edición
Podría vale la pena mirar cómo C-Programmers do patterns similar to try/catch

+0

Eche un vistazo a esta respuesta: http://stackoverflow.com/a/10586093/22470 – powtac

9

Arduino doesn't support exception handling. Sin embargo, no es necesario usar el manejo de excepciones para robustecer su código. Simplemente al verificar los valores de retorno de las funciones que pueden fallar, puede lograr el mismo fin.

Desde client.connected() se comprueba cada vez alrededor del bucle, y desde client.available() devolverá 0 si no está conectado el único fracaso posible que ya no está siendo manejado es el retorno de client.read().

Puedes solucionar este problema, por ejemplo, cambiando la línea:

char c = client.read(); 

a:

int i = client.read(); 
if (i == -1) { 
    break; 
} 
char c = (char) i; 
+0

muchas gracias! esto fue esclarecedor! – NZal

+0

:(que el manejo de errores no está disponible ... la alternativa mencionada "comprobación robusta del valor de retorno" es dudosa. Muchas funciones como, por ejemplo, Serial.print, dan poca o ninguna información sobre si ejecutaron con éxito. Es una opción, pero en este momento estoy Todavía estoy atascado en cómo evitar que mi skech se cuelgue al quedarse sin ram debido a que Serial.print no está escapando de sus datos! – humanityANDpeace

+0

Quedarme sin SRAM es un problema que he encontrado varias veces y tienes razón, hay no es una buena manera de comprobar esto programáticamente. A menudo, el síntoma más obvio de esto es la salida serial corrupta. Si solo quieres tener una idea de cómo está usando la memoria tu boceto, puedes verificar la cantidad de SRAM disponible usando la biblioteca MemoryFree. (La forma más sencilla es copiar el código MemoryFree.cpp de http://playground.arduino.cc/Code/AvailableMemory en su boceto y llamar a 'freeMemory() '). –