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.
Here is how I create the serial port:
DeviceSerialPort serialport = new DeviceSerialPort("COM1", 9600, System.IO.Ports.Parity.None, 8, System.IO.Ports.StopBits.One);
serialport.RHDataReceived += new EventHandler<DeviceDataEventArgs>(SerialPort_RHDataReceived);
serialport.Open();
And here is the serial port code:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO.Ports;
using System.Text;
namespace Instrument
{
public class DeviceSerialPort
{
public event EventHandler<DeviceDataEventArgs> 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;
}
}
}