串口通信错误,"请求的资源正在使用中."

ABH*_*ABH 14 c# serial-port winforms

这是从串行端口读取数据的代码.为了简单起见,让我们点按一下按钮;

    private System.IO.Ports.SerialPort serialPort;

    private void button1_Click(object sender, EventArgs e)
    {
        if (serialPort == null)
            serialPort = new SerialPort("COM7", 4800, Parity.None, 8, StopBits.One);
            //COM7 is hard coded just for the sake of example

        if (!serialPort.IsOpen)
            serialPort.Open();

        textBox1.AppendText(serialPort.ReadExisting());
    }
Run Code Online (Sandbox Code Playgroud)

除非笔记本电脑进入睡眠状态,否则代码运行完全正常 当系统唤醒后从睡眠状态中,serialPort对象不是null,但serialPort.IsOpen回报false,我得到的错误,"请求的资源正在使用中." 一边打电话serialPort.Open().内部异常中没有任何内容.在此输入图像描述

我已经尝试过很多关于serialPort对象的事情,比如关闭,处理或显式地将它分配给null和重新初始化,但它没有用,每次都在同一行上出现相同的错误.

        if (!serialPort.IsOpen)
        {
            try
            {
                serialPort.Open();
            }
            catch
            {
                serialPort.Close();
                serialPort.Dispose();
                serialPort = null;

                serialPort = new SerialPort("COM7", 4800, Parity.None, 8, StopBits.One);
                serialPort.Open();
            }
        }
Run Code Online (Sandbox Code Playgroud)

我也尝试了serialPort.DataReceived事件,但是一旦系统从睡眠中醒来,事件就不会被触发.

唯一的解决方法是停止应用程序并再次运行它.我真的很感激,如果有人给我一个线索,以一种体面的方式解决它.

Ren*_*iuz 8

正如我在评论中建议的那样,可以通过使用SystemEvents.PowerModeChanged事件来检测系统何时挂起来进行解决.当检测到该状态时,您需要关闭串行端口并在操作系统即将从挂起状态恢复时重新打开它.

哈马德证实这种解决方法有效.

这是代码.

SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged;

void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e)
{
    if (e.Mode != PowerModes.Resume)
        serialPort.Close();
}
Run Code Online (Sandbox Code Playgroud)

事件文件还要注意:

警告

因为这是一个静态事件,所以在处理应用程序时必须分离事件处理程序,否则会导致内存泄漏.