2009-04-28 20 views
0

コンピュータは物理COM1を介して測定装置に接続されています。私はシリアルポートを開いて、私が生きていることをデバイスに伝え、時にはデバイスがデータを送信するという単純なフォームを持っています。アプリケーションのクラッシュ(デバッグ中であっても)、約1分後開かれたSerialPortクラッシュC#アプリケーション

public void Read() 
{ 
    string message = _serialPort.ReadLine(); 
} 

:(すべてのいくつかの分)

Thread _readThread = new Thread(Read); 
SerialPort _serialPort = new SerialPort("COM1", 9600); 
_serialPort.Parity = Parity.None; 
_serialPort.DataBits = 8; 
_serialPort.StopBits = StopBits.One; 
_serialPort.Handshake = Handshake.None; 
_serialPort.DtrEnable = true; 
_serialPort.Open(); 
_readThread.Start(); 
_serialPort.Write("#listening"); 

読み取り機能(働き)。これはObjectDisposedExceptionを報告します(基底のストリーム?)。 SafeHandleが閉じられたことを示すメッセージが表示されます。スタックstraceのは以下の通りです:Microsoft.Win32.UnsafeNativeMethods.GetOverlappedResult(SafeFileHandleのhFile、NativeOverlapped lpOverlapped、のInt32 & lpNumberOfBytesTransferred、ブールBWAIT)System.IO.Ports.SerialStream.EventLoopRunner.WaitForCommEvent() で での

System.Threading.ThreadHelper.ThreadStart_Context(状態オブジェクト) System.Threading.ThreadHelper.ThreadStartでSystem.Threading.ExecutionContext.Run(のExecutionContextのExecutionContext、ContextCallbackコールバック、オブジェクトの状態) (AT)*

任意のアイデア?この問題は広く報告されていますが、通常、PCから物理的に切り離されたデバイスが関与しています。

+0

私はSerialPortクラスがMonoにいくつかの問題があることを知っています。 MonoまたはMS .NETを使用していますか? – Skurmedel

+0

MS .NET Framework 3.5 SP1 –

+0

おそらく解決策ではありませんが、[開く前に書き込み]を呼び出している可能性があります。 – Skurmedel

答えて

1

RS232ケーブル(アダプタ)が原因でシリアルポートストリームのクラッシュが発生したようです。 FTDIケーブルに切り替えられました。

.NET Frameworkのソースコードをよく見てください。しかし、投げられたObjectDisposedExceptionは、ユーザではなく、SerialPortによって捕捉されるべきだと私は思います。

0

ObjectDisposedExceptionは、オブジェクトに対してDisposeを呼び出す誰かを意味します。読んだスレッドを開始した後は何をしていますか?プログラムを終了する前に読んだスレッドが完了するのを待っていますか?それ以外の場合は、プログラムが終了しても読み取りスレッドが実行中である可能性があります。

+0

プログラムを終了せずに突然クラッシュします。それ以降は何もしません。受信時にクラッシュすることはありません。私は自分自身でアプリケーションを終了した場合、私はCOM1を正しく閉じてバッファを破棄します。 –

0

私は約1年前に私に何か似たようなことが起こった。何らかの理由で、読み込みバッファの末尾にある文字によっては、シリアルポートへのC#インターフェイスが閉じられることがあります。それは通常、\r\nがバッファの最後にあったときに起こったが、他の文字であった可能性もある。

商用シリアルポートDLLのライセンスを購入するだけで終了しました。

幸運を祈る!

+0

あなたはどのシリアルポートライブラリがあなたのために働いたのか教えていただけますか? – Marek

+0

@Marek私たちはSerialNET – scraimer

1

読み取る前にIsOpenを確認してください。

また、_serialPortを含むオブジェクトが参照解除され、ガベージコレクションされる可能性はありますか? _serialPortを別のスレッドから決してアクセスしない場合は、それをRead()のプライベート変数にしてみてください。

0

スレッド開始コードでローカルSerialPortとして宣言されている_serialPortがあります。したがって、Read()で参照されている_serialPortは何ですか?

Read()メソッドで_serialPortオブジェクトを作成して、同じスレッドのコンテキスト内にあることを確認してください。

0

1) スレッド_readThread =新しいスレッド(読み取り)。

// is this a local definition of _readThread var in constructor? 
// if so, after some time gabbage collector clear this var from memory, a disposed object 
// shouldnot work (there is no such an object in memory). 
// The same with SerialPort local var 
// To work properly you should somewhere in class define a member 

class foo 
{ 
    // ... 
    Thread _readThread; 
    SerialPort _serialPort; 
    bool bRunningReadTrhead=false; 

    //... 

    // which is static or instanced, than 

    public foo() 
    { 
     // ... 
     _serialPort = new SerialPort("COM1", 9600); 
     _serialPort.Parity = Parity.None; 
     _serialPort.DataBits = 8; 
     _serialPort.StopBits = StopBits.One; 
     _serialPort.Handshake = Handshake.None; 
     _serialPort.DtrEnable = true; 
     _serialPort.Open(); 
     _readThread = new Thread(Read); 

     bRunningReadTrhead=true; 

     _readThread.Start(); 

     //... 
    } 

    // creates a thread which will live a long time in loop: 
    private void Read() 
    { 
     while(bRunningReadTrhead) 
     { 
      try 
      { 
       string message = _serialPort.ReadLine(); 
      } 
      catch(Exception e) 
      { 
      Console.Write(e); 
      } 
     } 

     // exits a worker thread when you set global bool in false 
    } 

    // ... 
} 

// if you do not set a loop the thread also finish all jobs and become disposed 
関連する問題