2012-04-19 623 views
12

我正在Arduino中使用套接字通信,並且我需要try/catch塊來進行正確的處理,你們建議如何?我在網上搜索並不成功。Arduino中的try/catch塊

編輯:

我一起工作的代碼使用WiFly模塊與移動應用程序進行交互,我建立使用過的Android移動應用程序的一些控制機器人模塊。 一切工作正常,但有時套接字斷開,所以我需要添加處理這種情況下,類似於try/catch塊,但我沒有找到類似的塊爲Arduino。

我的代碼:

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

你需要給我們一些更多的信息.​​..喜歡你已經嘗試什麼,什麼你已經找到了... – 2012-04-19 12:57:29

+0

我剛剛更新了這個問題 – NZal 2012-04-19 13:04:34

回答

17

Arduino reference is未上市try catch(對於爲何查看詳細信息,例如,該related answer)。我認爲,在μ控制器上實施嘗試可能是困難/不可能的。

嘗試在大多數語言中捕獲是一個相當昂貴的操作:程序堆棧會爲try塊和每個catch塊複製一次。如果嘗試出錯,則嘗試塊堆棧將被丟棄,並且其中一個catch塊堆棧將被執行。
我不是cpu架構的專家,但我可以想象,這需要大量的內存交換和類似的操作 - 使用簡單的μ控制器應該很難實現。

編輯
也許值得看怎麼C-Programmers do patterns similar to try/catch

+0

看看這個答案:http://stackoverflow.com/a/10586093/22470 – powtac 2014-09-15 21:31:27

9

Arduino doesn't support exception handling。但是,您不需要使用異常處理來使代碼健壯。通過簡單地檢查可能失敗的函數的返回值,可以達到相同的目的。

由於client.connected()檢查周圍循環每一次,由於client.available()將返回0,如果沒有連接一個尚未被處理爲client.read()返回唯一可能的失敗。

可以解決這個問題,例如,通過改變線路:

char c = client.read(); 

到:

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

非常感謝!這是啓發! – NZal 2012-04-20 20:24:58

+0

:(那個錯誤處理是不可用的......上面提到的替代方法「強大的返回值檢查」是可疑的,很多函數如Serial.print提供了很少或沒有的信息,它們是否執行成功,這是一種選擇,但是目前我是仍然堅持如何避免由於使用ram而導致我的系統崩潰,因爲Serial.print沒有越過它的數據! – humanityANDpeace 2013-03-07 08:09:09

+0

使用SRAM是一個我遇到過很多次的問題,你是對的,在那裏沒有任何好的方法可以通過編程來檢查這種情況,通常最明顯的症狀是損壞的串行輸出。如果您只想瞭解您的草圖如何使用內存,您可以使用MemoryFree庫檢查可用SRAM的數量(最簡單的方法是將http://playground.arduino.cc/Code/AvailableMemory中的MemoryFree.cpp代碼複製到你的草圖中並調用'freeMemory()')。 – 2013-03-07 10:42:31