c# - 串口通信错误, "The requested resource is in use."

标签 c# winforms serial-port

这是从串口读取数据的代码。为了简单起见,让我们通过单击按钮来完成;

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

除非我的笔记本电脑进入休眠状态,否则代码运行得非常好。当系统从 sleep 中唤醒时,serialPort 对象不是null,而是 serialPort.IsOpen 返回 false 并且我在调用 serialPort.Open() 时收到错误消息,“请求的资源正在使用中。”。内部异常中没有任何内容。 enter image description here

我已经用 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();
            }
        }

我也尝试过 serialPort.DataReceived 事件,但一旦系统从 sleep 中唤醒,该事件就不会触发。

唯一的解决方法是停止应用程序并再次运行它。如果有人给我提供线索,让我以体面的方式解决问题,我将不胜感激。

最佳答案

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

hamad 确认此解决方法有效。

这是代码。

SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged;

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

另请注意事件文档:

注意

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

关于c# - 串口通信错误, "The requested resource is in use.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12139196/

相关文章:

c# - 使用一个 observable 作为时钟来测试另一个是否超时

c# - Windows 窗体 C# 中的图片框和面板

c# - 使用 List<Func<T,object>> 时索引超出数组范围

c# - 在其他页面中找到控件

C# 右键单击​​ TreeView 节点

带中断的 Linux 串行通信

c++ - 错误的 libserial 接收数据序列

python - 如何使用 pyserial 和 picocom 打印仅十六进制缓冲区?

c# - 如何以编程方式确定系统设备声音设置?

c# - 从其他窗体更改 DataGridView 的单元格的值