22

我正在使用 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();
    }
}
4

2 回答 2

29

Arduino 参考未列出(有关原因的try catch详细信息,例如,请参阅此相关答案)。而且我认为,在 µ 控制器上实现 try catch 可能有点困难/不可能。

在大多数语言中,try catch 是一项非常昂贵的操作:程序堆栈为 try 块和每个 catch 块复制一次。如果 try 出错,try-block 堆栈将被丢弃,并且 catch 块堆栈之一将被执行。
我不是 cpu 架构的专家,但我可以想象,这需要大量的内存交换和类似的操作——用一个简单的 µ 控制器应该很难实现。

可能值得看看C 程序员如何执行类似于 try/catch 的模式

于 2012-04-19T13:45:19.923 回答
16

Arduino 不支持异常处理。但是,您不需要使用异常处理来使您的代码健壮。通过简单地检查可能失败的函数的返回值,您可以达到相同的目的。

client.connected()每次循环时都会检查since,client.available()如果未连接,since将返回0,唯一尚未处理的可能失败是从返回client.read()

例如,您可以通过更改以下行来解决此问题:

char c = client.read();

到:

int i = client.read();
if (i == -1) {
    break;
}
char c = (char) i;
于 2012-04-19T15:23:36.897 回答