これは私の状況です。チェックボックスをオンにすると、アプリケーションがフリーズしても動作します。これは、シリアルポート経由で送信されたデータを認識できることを意味します。テスト目的のために、アプリケーションを終了するだけです。フリーズされたウィンドウフォームアプリケーションとチェックボックスc#
私が45行目(「pipe = arduino.ReadLine();」のスクリーンショットを参照)をコメントアウトすると、「ReadLine()」が不要になったので、ボックスのチェックを外すことができます。しかし、今ではボックスの再チェックをしようとすると、エラーメッセージが表示されます。 まだ何も送信されていないときに "ReadLine()"を試みているため、コードを続行できないと思います。しかし、私はCOMポートへのアクセスが拒否されているという説明はありません。すでに開かれているときにポートを開こうとしているのではなくて。
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
SerialPort arduino = new SerialPort();
arduino.BaudRate = 9600;
arduino.PortName = comboBox1.Text;
string pipe;
if (checkBox1.Checked)
{
checkBox1.Text = "Listening...";
arduino.Open();
pipe = arduino.ReadLine();
if (pipe == "S\r")
{
//System.Diagnostics.Process.Start("shutdown", "/f /r /t 0");
System.Windows.Forms.Application.Exit();
}
else
{
checkBox1.Text = "Start";
}
}
}
あなたのソリューションの作品です、それはもはやしかし、それはまだフリーズする、ポートへのアクセスを拒否されていません。私は、問題が「ReadLine」ステートメント内にある理由を理解しました。何も読み込めない場合は固まってしまいます。解決策を見つけるのを助けてくれますか?私は "ReadLine"ステートメントを繰り返すループが必要ですが、何も見つからなければ、スタックしなくてもループを継続する必要があります。 –
MSDN:_By defaultによれば、ReadLineメソッドは行が受信されるまでブロックします。この動作が望ましくない場合は、ReadTimeoutプロパティを0以外の値に設定して、行がポートで使用できない場合にReadLineメソッドがTimeoutExceptionをスローするようにします._その時点で、例外を捕捉して別のループを開始します。 – Steve
while(真){arduino.ReadTimeout = 500; pipe = arduino.ReadLine();} 'プログラムは動作しますが、タイムアウトエラーポップアップが表示されます。 'ReadTimeout'をエラーとして解釈せずに使用する方法はありますか? 'ReadLine'ステートメントをリフレッシュするだけですか?私は正しい場所でループを使用したとは思わない。 –