Arduino中的try/catch块
我正在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();
}
}
的Arduino reference is未上市try catch
(对于为何查看详细信息,例如,该related answer)。我认为,在μ控制器上实施尝试可能是困难/不可能的。
尝试在大多数语言中捕获是一个相当昂贵的操作:程序堆栈会为try块和每个catch块复制一次。如果尝试出错,则尝试块堆栈将被丢弃,并且其中一个catch块堆栈将被执行。
我不是cpu架构的专家,但我可以想象,这需要大量的内存交换和类似的操作 - 使用简单的μ控制器应该很难实现。
看看这个答案:http://stackoverflow.com/a/10586093/22470 – powtac 2014-09-15 21:31:27
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;
非常感谢!这是启发! – NZal 2012-04-20 20:24:58
:(那个错误处理是不可用的......上面提到的替代方法“强大的返回值检查”是可疑的,很多函数如Serial.print提供了很少或没有的信息,它们是否执行成功,这是一种选择,但是目前我是仍然坚持如何避免由于使用ram而导致我的系统崩溃,因为Serial.print没有越过它的数据! – humanityANDpeace 2013-03-07 08:09:09
使用SRAM是一个我遇到过很多次的问题,你是对的,在那里没有任何好的方法可以通过编程来检查这种情况,通常最明显的症状是损坏的串行输出。如果您只想了解您的草图如何使用内存,您可以使用MemoryFree库检查可用SRAM的数量(最简单的方法是将http://playground.arduino.cc/Code/AvailableMemory中的MemoryFree.cpp代码复制到你的草图中并调用'freeMemory()')。 – 2013-03-07 10:42:31
你需要给我们一些更多的信息...喜欢你已经尝试什么,什么你已经找到了... – 2012-04-19 12:57:29
我刚刚更新了这个问题 – NZal 2012-04-19 13:04:34