【问题标题】:Serial Port and ObjectDisposedException Safe Handle has been closed串行端口和 ObjectDisposedException 安全句柄已关闭
【发布时间】:2009-12-26 19:16:41
【问题描述】:

我正在从通过串行端口发送信息的设备接收数据,并且收到此异常:“ObjectDisposedException 安全句柄已关闭”。它可能会在几秒钟到几分钟内发生,而且似乎没有规律。发生的另一件事是它将无一例外地停止接收数据,我可以在 VS IDE 输出窗口选项卡中看到线程已退出。我也不知道它为什么会这样。

这是我创建串行端口的方法:

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

这是串口代码:

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;
        }
    }
}

【问题讨论】:

    标签: c# .net serial-port .net-3.5


    【解决方案1】:

    您的线程寿命很短,它的寿命与打开串行端口所需的时间完全一致,然后它就结束了。当它发生时,你的串口就会被处理掉。

    这就是我的看法。您正在使用基于事件的方法(处理DataReceived 事件),在这种情况下,您不需要另一个线程,这在框架和操作系统资源方面是昂贵的。在您的情况下,只需摆脱 Thread 对象,然后直接调用 serialPort.Open() 。您将在现有线程中收到DataReceived 事件。

    【讨论】:

    • 是的,你的权利!这似乎解决了过早的线程退出问题。它一直在持续运行,现在没有停止。
    • 但是,“ObjectDisposedException 安全句柄已被关闭”仍然出现。
    • 从创建 DeviceSerialPort 对象的代码中缩小一点。它在申请期间是否保持活动状态?
    • 好的,我想问题已经解决了。我在初始化函数中创建了 DeviceSerialPort 对象作为局部变量!为了让它保持活力,我将 SerialPort 变量变成了我表单中的私有字段。感谢您的帮助!
    【解决方案2】:

    form_load 中注册未处理的异常处理程序:

    AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf UnhandledException_Handler
    

    并添加处理程序:

    'This sub does the magic
    Private Sub UnhandledException_Handler(ByVal sender As Object, ByVal args As UnhandledExceptionEventArgs)
        Dim ex As Exception = DirectCast(args.ExceptionObject, Exception)
        Thread.CurrentThread.Suspend()
    End Sub
    

    【讨论】:

    • 问题是在C#中,你没有帮助
    猜你喜欢
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    相关资源
    最近更新 更多