2012-04-19 590 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