4

RS232を介してモーターを制御するC#で.NET4.0WPFアプリケーションを開発しています。アプリケーションを終了するときに、comportを閉じるときにアプリケーションがデッドロックすることがあるという問題があります。

インターネットで調べたところ、これは一般的な問題であり、DataReceivedEventでBeginInvokeを使用するか、別のスレッドでシリアルポートを閉じると問題が解決するはずです。これらの回避策の問題はそれです。1.DataReceiveEventを使用しません。2.別のスレッドでシリアルポートを閉じても違いはありません。何が起こるかというと、GUIがシャットダウンしますが、タスクマネージャーでプロセスがまだ実行中であることがわかります。

私が試した他のことは:

  • シリアルポートを閉じず、アプリケーションを終了するだけです。これにより、アプリケーションとプロセスは正常に閉じられますが、シリアルポートはまだブロックされています。シリアルポートのブロックを解除するには、コンピューターを再起動する必要があります。
  • シリアルポートを閉じる前後に数秒寝ています。
  • アプリケーションをWinFormsアプリにする。WPFの代わりに。2つの間のデッドロックに違いはありません。

私がプログラムを実行するコンピューターは、マザーボードにマウントされ、Microsoftドライバーを備えたcomポートを使用しています。

そして今、いくつかのコードについて:

Window_Closingイベントは次のようになります。

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
    window.Closing -= Window_Closing;            
    Thread CloseDown = new Thread(new ThreadStart(server.Dispose)); //Closes serialport everything in another thread to avoid hang on serialport close.
    CloseDown.Start();
}

serverシリアルポートを管理するオブジェクトはどこにありますか。そしてDispose、シリアルポートクローズ関数を呼び出します。

シリアルポートクローズ機能:

public void Close()
{
    DebugLog.Write(3, "-->MacCommSerialPort.Close");
    _com.Close();                        
    DebugLog.Write(3, "<--MacCommSerialPort.Close");
}

シリアルポート設定:

_com = new SerialPort(portNumber);
_com.BaudRate = 19200;
_com.Parity = Parity.None;
_com.DataBits = 8;
_com.Encoding = Encoding.GetEncoding("Windows-1252");
_com.StopBits = StopBits.One;
_com.RtsEnable = false;
_com.DtrEnable = false;
_com.WriteTimeout = 400;
_com.ReadTimeout = 1000;
4

2 に答える 2

3

たまたまコードを見て、GUI を閉じる前に AutoThreadRest イベントを使用する必要があると推測しました。

private static AutoResetEvent PortClosedEvent = new AutoResetEvent(false);

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) 
    { 
        window.Closing -= Window_Closing;             
        Thread CloseDown = new Thread(new ThreadStart(server.Dispose));
        CloseDown.Start(); 
        PortClosedEvent.WaitOne(); 
    } 

接続の破棄が完了したら、server.Dispose メソッド内で、これをコード行の下に追加します。

PortClosedEvent.Set();
于 2012-09-26T05:56:27.787 に答える
0

アプリケーションとモーター (送信側と受信側) の間のハンドシェイク プロトコルが一致することを確認します。

于 2015-01-29T20:59:06.050 に答える