2012-04-19 25 views
12

Pracuję z komunikacją z gniazdem w Arduino, i potrzebuję bloku try/catch do prawidłowej obsługi, co sugerujesz? Moje poszukiwania w Internecie nie powiodły się.Blok try/catch w Arduino

edit:

Kod pracuję z używa modułu WiFly interakcji z aplikacją mobilną, buduję moduł robot z niektórych kontroli nad wykorzystaniem aplikacji mobilnych Android. Wszystko działa dobrze, ale czasami gniazdo się rozłącza, więc muszę dodać obsługę takich przypadków, coś podobnego do try/catch block, ale nie znalazłem podobnego bloku dla Arduino.

Mój kod:

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

Trzeba dać nam więcej informacji ... jak to, co próbowali, co znalazłeś ... –

+0

Właśnie zaktualizowałem pytanie – NZal

Odpowiedz

17

Arduino reference is nie wymieniając try catch (szczegóły dlaczego patrz, na przykład, to related answer). I zakładam, że implementacja catch catch na mikroprocesorze może być trudna/niemożliwa.

Spróbuj złapać w większości języków jest dość kosztowna operacja: Stos programu zostaje skopiowany jeden raz dla bloku try i dla każdego bloku catch. Jeśli próba się nie powiedzie, stos try-block zostanie odrzucony, a jeden z bloków catch-catch zostanie wykonany.
Nie jestem ekspertem od architektury procesora, ale mogę sobie wyobrazić, że wymaga to dużej wymiany pamięci i podobnych operacji - powinno być trudne do osiągnięcia dzięki prostemu sterownikowi μ.

edit
Może warto spojrzeć jak C-Programmers do patterns similar to try/catch

+0

Popatrz na tę odpowiedź: http://stackoverflow.com/a/10586093/22470 – powtac

9

Arduino doesn't support exception handling. Jednak nie trzeba używać obsługi wyjątków, aby zapewnić solidność kodu. Po prostu sprawdzając zwracane wartości funkcji, które mogą zawieść, można osiągnąć ten sam koniec.

Od client.connected() jest sprawdzana za każdym razem wokół pętli, a od client.available() powróci 0 jeśli nie jest podłączony jedyną możliwą awarię, która nie jest już obsługiwany jest powrót z client.read().

Można rozwiązać ten problem, na przykład, zmieniając linię:

char c = client.read(); 

do:

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

wielkie dzięki! to było pouczające! – NZal

+0

:(obsługa błędów nie jest dostępna ... wspomniana alternatywa "solidne sprawdzanie wartości zwracanej" jest wątpliwa, ponieważ wiele funkcji, takich jak np. Serial.print, daje niewiele informacji o tym, czy zostały wykonane pomyślnie, jest to opcja, ale obecnie jestem Nadal utknąłem, jak wykreślić, aby uniknąć awarii mojego skech przez wyczerpanie pamięci RAM, ponieważ Serial.print nie usuwa swoich danych! – humanityANDpeace

+0

Wyczerpanie SRAM jest problemem, z którym miałem do czynienia wiele razy i masz rację, nie jest dobrym sposobem na sprawdzenie tego programowo Często często najbardziej oczywistym objawem tego jest uszkodzone wyjście szeregowe.Jeśli chcesz tylko zrozumieć, jak twój szkic korzysta z pamięci, możesz sprawdzić ilość dostępnej pamięci SRAM używając biblioteki MemoryFree (Najprostszym sposobem jest skopiowanie kodu MemoryFree.cpp z http://playground.arduino.cc/Code/AvailableMemory do szkicu i wywołanie 'freeMemory()'). –