処理を使用しており、シリアル ポートを使用して Arduino から入力を読み取っていますが、接続が切断される可能性があります。この場合、この接続を再開するにはどうすればよいですか?
2 に答える
Serial.java によってスローされた RuntimeExceptions をキャッチできます。これは通常、シリアル ポートが使用できなくなったことを示します。その catch ブロック内で、シリアル ポートのポーリングを開始できます。シリアル インスタンスを再インスタンス化できるようになると、ポートが再び使用可能になり (たとえば、USB ケーブルが再び差し込まれます)、ゲームに戻ります。
Serial serial;
boolean serialInited;
void setup () {
initSerial();
}
void draw () {
if (serialInited) {
// serial is up and running
try {
byte b = serial.read();
// fun with serial here...
} catch (RuntimeException e) {
// serial port closed :(
serialInited = false;
}
} else {
// serial port is not available. bang on it until it is.
initSerial();
}
}
void initSerial () {
try {
serial = new Serial(this, Serial.list()[0], BAUD_RATE);
serialInited = true;
} catch (RuntimeException e) {
if (e.getMessage().contains("<init>")) {
System.out.println("port in use, trying again later...");
serialInited = false;
}
}
}
フレームごとに再接続を試みるのではなく、再接続試行の頻度を制限するカウンターを使用することをお勧めします。(たとえば、10 まで数えて、もう一度やり直して、必要に応じて繰り返します。) それほど重要ではありませんが、シリアル ポートを激しく叩くと、私がほとんど知らないことが原因で予期しない副作用が発生する可能性があります。
Arduino IDE では、シリアル ポート モニターを閉じてから、[ツール] -> [シリアル ポート] に戻り、シリアル ポートを再選択する必要があります。
これは、ケーブルを取り外すと、以前使用していたシリアル デバイスが取り外されるためです。Linux はこれを Windows よりもうまく処理しますが、いずれにせよ、シリアル モニターに大混乱をもたらします。
USB ケーブルを取り外す代わりに、ボードのリセット ボタンを押してプログラムを再起動する必要があります。
また、多くのArduinoにはシリアル通信の「機能」の自動リセットがあることに注意してください。ここに回避策の指示を投稿しました。