web-dev-qa-db-ja.com

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();
    }
}
15
NZal

Arduino参照は リストされていませんtry catch(理由の詳細については、たとえば、これを参照してください 関連する回答 )。そして、µコントローラーにtry catchを実装することは、一種の困難/不可能である可能性があると思います。

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

C-Programmersがtry/catchに似たパターンを行う方法)を確認することは価値があるかもしれません

21
vikingosegundo

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

client.connected()はループのたびにチェックされるため、client.available()は接続されていない場合に0を返すため、まだ処理されていない可能性のある唯一の障害はclient.read()からの戻りです。

これを修正するには、たとえば、次の行を変更します。

char c = client.read();

に:

int i = client.read();
if (i == -1) {
    break;
}
char c = (char) i;
11
Matthew Murdoch