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理由の詳細については、たとえば、この関連する回答を参照してください)。そして、μ-controller に try catch を実装するのは、ちょっと難しい/不可能かもしれないと思います。

ほとんどの言語での try catch は、非常にコストのかかる操作です。プログラム スタックは、try ブロックと各 catch ブロックに対して 1 回コピーされます。try が失敗した場合、try ブロック スタックは破棄され、catch ブロック スタックの 1 つが実行されます。
私は CPU アーキテクチャの専門家ではありませんが、これには大量のメモリ スワッピングや同様の操作が必要になることは想像できます。単純な µ コントローラでは実現が難しいはずです。

C プログラマーが try/catch に似たパターンをどのように行うかを調べる価値があるかもしれません

于 2012-04-19T13:45:19.923 に答える
16

Arduino は例外処理をサポートしていません。ただし、コードを堅牢にするために例外処理を使用する必要はありません。失敗する可能性のある関数の戻り値をチェックするだけで、同じ目的を達成できます。

client.connected()since はループのたびにチェックされ、接続されていない場合は sinceがclient.available()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 に答える