2016-08-21 5 views
0

これは私の状況です。チェックボックスをオンにすると、アプリケーションがフリーズしても動作します。これは、シリアルポート経由で送信されたデータを認識できることを意味します。テスト目的のために、アプリケーションを終了するだけです。フリーズされたウィンドウフォームアプリケーションとチェックボックス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"; 
     } 
    } 
} 

答えて

0

SERIALPORTクラスは、システムリソースを管理し、そのように敏感なオブジェクトが含まれる場合、クラスは、通常、これらのシステムリソースをシステムに即時に解放されるようにIDisposableインターフェイスを実装しています。

あなたのコードはSerialPortを閉じるのを忘れてしまいます。次回のユーザアクションでこのイベントハンドラを呼び出すと、あなたの最初のアクションでそのポートが使用されます。

は幸いなことに、そこに適切な閉鎖を確保するための簡単な方法であり、そのようなオブジェクトを廃棄し、それがusing statement

private void checkBox1_CheckedChanged(object sender, EventArgs e) 
{ 

    if (checkBox1.Checked) 
    { 
     checkBox1.Text = "Listening..."; 
     using(SerialPort arduino = new SerialPort()) 
     { 
      arduino.BaudRate = 9600; 
      arduino.PortName = comboBox1.Text; 
      string pipe; 
      arduino.Open(); 
      pipe = arduino.ReadLine(); 
      if (pipe == "S\r") 
      { 

       //System.Diagnostics.Process.Start("shutdown", "/f /r /t 0"); 
       //System.Windows.Forms.Application.Exit(); 
      } 
     } // Here the port will be closed and disposed. 
    } 
    else 
    { 
     checkBox1.Text = "Start"; 
    } 
} 
+0

あなたのソリューションの作品です、それはもはやしかし、それはまだフリーズする、ポートへのアクセスを拒否されていません。私は、問題が「ReadLine」ステートメント内にある理由を理解しました。何も読み込めない場合は固まってしまいます。解決策を見つけるのを助けてくれますか?私は "ReadLine"ステートメントを繰り返すループが必要ですが、何も見つからなければ、スタックしなくてもループを継続する必要があります。 –

+0

MSDN:_By defaultによれば、ReadLineメソッドは行が受信されるまでブロックします。この動作が望ましくない場合は、ReadTimeoutプロパティを0以外の値に設定して、行がポートで使用できない場合にReadLineメソッドがTimeoutExceptionをスローするようにします._その時点で、例外を捕捉して別のループを開始します。 – Steve

+0

while(真){arduino.ReadTimeout = 500; pipe = arduino.ReadLine();} 'プログラムは動作しますが、タイムアウトエラーポップアップが表示されます。 'ReadTimeout'をエラーとして解釈せずに使用する方法はありますか? 'ReadLine'ステートメントをリフレッシュするだけですか?私は正しい場所でループを使用したとは思わない。 –

関連する問題