0

コンピュータは、物理的なCOM1を介して測定デバイスに接続されています。私はシリアルポートを開き、私が生きていることをデバイスに伝え、時々デバイスがデータを送信するという単純なフォームを持っています。(数分ごと)

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");

読み取り機能(機能します):

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

約1分後、アプリケーションがクラッシュします(デバッグ中であっても)。ObjectDisposedExceptionを報告します(基になるストリームに対して?)。このメッセージは、SafeHandleが閉じられたことを示しています。スタックstraceは以下のとおりです。

Microsoft.Win32.UnsafeNativeMethods.GetOverlappedResult(SafeFileHandle hFile、NativeOverlapped lpOverlapped、Int32&lpNumberOfBytesTransferred、Boolean bWait)at System.IO.Ports.SerialStream.EventLoopRunner.WaitForCommEvent()at System.Threading.ThreadHelper.ThreadStart_Context System.Threading.ThreadHelper.ThreadStart()*でのThreading.ExecutionContext.Run(ExecutionContextexecutionContext、ContextCallbackコールバック、オブジェクト状態)

何か案は?この問題は広く報告されていますが、通常、デバイスがPCから物理的に切り離されていることが関係しています。

4

6 に答える 6

1

RS232ケーブル(アダプタ)が基礎となるシリアルポートストリームのクラッシュを引き起こしたように見えました。FTDIケーブルに切り替えました。

.NETFrameworkのソースコードを調べると非常に役立ちました。しかし、スローされたObjectDisposedExceptionは、ユーザーではなく、SerialPortによってキャッチされる必要があると思います。

于 2009-05-10T18:21:22.077 に答える
1

読む前に IsOpen をチェックしてみてください。

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

于 2009-04-28T18:04:47.660 に答える
0

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

于 2009-04-28T11:39:30.940 に答える
0

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

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

幸運を!

于 2009-04-28T12:26:28.970 に答える
0

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

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

于 2009-04-28T18:27:13.767 に答える
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
于 2009-07-02T18:59:36.220 に答える