在Arduino中尝试/捕获块

NZa*_*Zal 15 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

Vik*_*ica 21

Arduino的参考不上市try catch(对于为什么见,例如,该信息相关的答案).我认为,在μ控制器上实现try catch可能有点困难/不可能.

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

编辑
可能值得看看C-Programmers如何执行类似于try/catch的模式


Mat*_*och 11

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

因为client.connected()每次循环都会检查,因为client.available()如果没有连接则返回0,唯一可能的故障是尚未处理的是返回client.read().

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

char c = client.read();
Run Code Online (Sandbox Code Playgroud)

至:

int i = client.read();
if (i == -1) {
    break;
}
char c = (char) i;
Run Code Online (Sandbox Code Playgroud)