2012-08-27 105 views
14

这里是从串行端口读取数据的代码。为了简单起见,让我们点击一​​下按钮;串口通讯错误,“请求的资源正在使用中。”

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

代码运行得很好,除非我的笔记本电脑进入睡眠状态。当系统唤醒后从睡眠状态中,serialPort对象不是nullserialPort.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事件,但一旦系统醒来时从睡眠不触发事件。

唯一的解决办法是停止应用程序并再次运行它。如果有人给我一个线索,以一种体面的方式对它进行整理,我将非常感激。

+1

那么你可以尝试关闭时,系统进入睡眠的连接,并尝试重新上简历。 – Reniuz

+0

你使用真正的串口还是某种端口仿真?在真实的串行端口上试试这个程序。 –

+0

@AlexFarber这是一个真正的串行端口,一个GPS设备连接到它。 – ABH

回答

8

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

哈马德确认这变通办法。

这是代码。

SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged; 

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

而且从事件的文档注意:

注意

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

+0

感谢您的帮助:) – ABH