打开的SerialPort使C#应用程序崩溃

打开的SerialPort使C#应用程序崩溃,c#,.net,serial-port,objectdisposedexception,C#,.net,Serial Port,Objectdisposedexception,计算机通过物理COM1连接到测量装置。我有一个简单的表单,我打开一个串口,告诉设备我还活着,偶尔设备会发送数据。(每隔几分钟) 读取功能(有效): 大约一分钟后,应用程序崩溃(即使在调试时)。它报告一个ObjectDisposedException(对于底层流?)。该消息表明安全手柄已关闭。堆栈策略如下所示: 在Microsoft.Win32.UnsafentiveMethods.GetOverlappedResult(SafeFileHandle hFile、NativeOverlapped

计算机通过物理COM1连接到测量装置。我有一个简单的表单,我打开一个串口,告诉设备我还活着,偶尔设备会发送数据。(每隔几分钟)

读取功能(有效):

大约一分钟后,应用程序崩溃(即使在调试时)。它报告一个ObjectDisposedException(对于底层流?)。该消息表明安全手柄已关闭。堆栈策略如下所示:

在Microsoft.Win32.UnsafentiveMethods.GetOverlappedResult(SafeFileHandle hFile、NativeOverlapped lpOverlapped、Int32&LPNumberOfByTestTransfered、Boolean bWait) 位于System.IO.Ports.SerialStream.EventLoopRunner.WaitForCommEvent()处 位于System.Threading.ThreadHelper.ThreadStart\u上下文(对象状态) 在System.Threading.ExecutionContext.Run(ExecutionContext ExecutionContext,ContextCallback回调,对象状态) 位于System.Threading.ThreadHelper.ThreadStart()处*


有什么想法吗?该问题已被广泛报道,但通常涉及设备与PC的物理分离。

ObjectDisposedException表示有人在对象上调用Dispose。启动读取线程后,您在做什么?您是否在退出程序之前等待读取线程完成?否则,可能读取线程仍在运行,程序退出。

大约一年前,我遇到了类似的事情。出于某种原因,读取缓冲区末尾的某些字符会导致串行端口的C#接口自行关闭。这通常发生在
\r\n
位于缓冲区末尾时,尽管它也可能是其他字符

结果只是买了一个商业串行端口DLL的许可证


祝你好运

在阅读之前尝试检查等电位线


另外,是否有可能包含_serialPort的对象被取消引用并被垃圾回收?如果您从未从另一个线程访问过_serialPort,请尝试在Read()中将其设为私有变量。

您在线程启动代码中将_serialPort声明为本地serialPort,那么_serialPort在Read()中指的是什么


尝试在Read()方法中创建_serialPort对象,以确保它位于同一线程的上下文中。

似乎是RS232电缆(适配器)导致了底层串行端口流的崩溃。切换到FTDI电缆,这很有效

查看.NETFramework源代码有很大帮助。但是我认为抛出的ObjectDisposedException应该由SerialPort捕获,而不是由用户捕获。

1) 线程_readThread=新线程(已读)


我知道SerialPort类在Mono上有一些问题。您使用的是Mono还是MS.NET?可能不是解决方案,但您在打开之前调用Write。很抱歉,创建示例时出现复制粘贴错误。谢谢,修正了。我没有退出程序,它只是运行了一段时间,然后突然崩溃。在那之后我真的什么都不做,它也不会在接收时崩溃。如果我自己结束应用程序,我会正确关闭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();
}
// 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