title: Serial Port and ObjectDisposedException Safe Handle has been closed
body: <p>I am receiving data from a device that's sending information over the serial port and I get this exception: "ObjectDisposedException Safe Handle has been closed".  It may happen within seconds to several minutes and there doesn't seem to be a pattern.  Another thing that happens is that it will stop receiving data with no exception and I can see in the VS IDE output window tab that a thread has exited.  I have no idea why it's doing that also.</p>
  
  <p>Here is how I create the serial port:</p>
  
  <pre><code>DeviceSerialPort serialport = new DeviceSerialPort("COM1", 9600, System.IO.Ports.Parity.None, 8, System.IO.Ports.StopBits.One);
  serialport.RHDataReceived += new EventHandler&lt;DeviceDataEventArgs&gt;(SerialPort_RHDataReceived);
  serialport.Open();
  </code></pre>
  
  <p>And here is the serial port code:</p>
  
  <pre><code>namespace Instrument
  {
      public class DeviceSerialPort
      {
          public event EventHandler&lt;DeviceDataEventArgs&gt; RHDataReceived;
  
          private SerialPort _serialPort;
          private byte[] _readBuffer = new byte[1024];
  
          public DeviceSerialPort(string portName, int baudRate, Parity parity, 
              int dataBits, StopBits stopBits)
          {
              _serialPort = new SerialPort(portName, baudRate, parity, dataBits, stopBits);
              _serialPort.DataReceived +=new SerialDataReceivedEventHandler(SerialPort_DataReceived);
  
          }
  
          public void Open()
          {
              _serialPort.Open();
          }
  
          private void SerialPort_DataReceived(object sender, EventArgs e)
          {
              //SerialPort sp = (SerialPort)sender;
  
              int bytesRead = _serialPort.Read(_readBuffer, 0, _readBuffer.Length);
  
  
              if (_readBuffer[0] == 5)
              {
                  onRHDataReceivedEvent(new DeviceDataEventArgs(_readBuffer[0], _readBuffer[1], _readBuffer[2], _readBuffer[3]));
              }
          }
  
  
          protected void onRHDataReceivedEvent(DeviceDataEventArgs e)
          {
              if (RHDataReceived != null)
              {
                  RHDataReceived(this, e);
              }
          }
  
      }
  
      public class DeviceDataEventArgs : EventArgs
      {
          public byte Command { get; set; }
          public byte Data0 { get; set; }
          public byte Data1 { get; set; }
          public byte Crc { get; set; }
  
          public DeviceDataEventArgs(byte cmd, byte data0, byte data1, byte crc)
          {
              Command = cmd;
              Data0 = data0;
              Data1 = data1;
              Crc = crc;
          }
      }
  }
  </code></pre>