2012-04-19 8 views
12

Sto lavorando con la comunicazione socket in Arduino, e ho bisogno del blocco try/catch per una corretta gestione, cosa suggerite voi ragazzi? La mia ricerca su Internet non ha avuto successo.try/catch block in Arduino

edit:

Il codice sto lavorando con usa il modulo WiFly di interagire con un'applicazione mobile, sto costruendo un modulo robot con alcuni controlli più applicazioni mobili che utilizzano Android. Tutto funziona bene, ma a volte il socket viene disconnesso, quindi ho bisogno di aggiungere la gestione per questi casi, qualcosa di simile a try/catch block, ma non ho trovato un blocco simile per Arduino.

Il mio codice:

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

Dovete darci qualche informazione in più ... Come quello che hai provato, cosa hai trovato ... –

+0

Ho appena aggiornato la domanda – NZal

risposta

17

Il Arduino reference is non messa in vendita di try catch (per i dettagli del perché si veda, ad esempio, questo related answer). E suppongo che l'implementazione di un catch su un μ-controller potrebbe essere difficile/impossibile.

Provare a catturare nella maggior parte delle lingue è un'operazione piuttosto costosa: lo stack del programma viene copiato una volta per il blocco try e per ogni blocco catch. Nel caso in cui il tentativo fallisca, lo stack try-block verrà scartato e verrà eseguito uno degli stack del catch catch.
Non sono un esperto dell'architettura della cpu, ma posso immaginare che questo richiede molto scambio di memoria e operazioni simili - dovrebbe essere difficile da ottenere con un semplice μ-controller.

modificare
Potrebbe la pena di guardare come C-Programmers do patterns similar to try/catch

+0

Dai un'occhiata a questa risposta: http://stackoverflow.com/a/10586093/22470 – powtac

9

Arduino doesn't support exception handling. Tuttavia, non è necessario utilizzare la gestione delle eccezioni per rendere il codice robusto. Controllando semplicemente i valori di ritorno delle funzioni che possono fallire, è possibile ottenere lo stesso risultato.

Da client.connected() viene controllato ogni iterazione del ciclo, e poiché client.available() restituirà 0 se non collegato l'unico fallimento possibile che non sia già gestita è il ritorno da client.read().

È possibile risolvere questo, per esempio, cambiando la riga:

char c = client.read(); 

a:

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

grazie mille! questo era illuminante! – NZal

+0

:(che la gestione degli errori non è disponibile ... la menzionata alternativa "robusto controllo del valore di ritorno" è dubbia.e molte funzioni come ad esempio Serial.print danno poche o nessuna informazione se sono state eseguite con successo. ancora bloccato come capire per evitare che il mio skech si schianta a corto di RAM perché Serial.print non sta rimuovendo i suoi dati! – humanityANDpeace

+0

L'esaurimento della SRAM è un problema che ho riscontrato un numero di volte e hai ragione, lì non è un buon modo per controllarlo a livello di codice. Spesso il sintomo più ovvio di questo è l'output seriale corrotto. Se vuoi solo avere un'idea del modo in cui lo sketch utilizza la memoria, puoi controllare la quantità di SRAM disponibile usando la libreria MemoryFree (il modo più semplice è copiare il codice MemoryFree.cpp da http://playground.arduino.cc/Code/AvailableMemory nel tuo schizzo e chiamare 'freeMemory()'). –