以下是从串行端口读取数据的代码。为了简单起见,让我们点击一下按钮就可以了;
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
对象不是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();
}
}
我也尝试了serialPort.DataReceived
事件,但是一旦系统从睡眠中醒来,事件就不会被触发。
唯一的解决方法是停止应用程序并再次运行它。我真的很感激,如果有人给我一个线索,以一种体面的方式解决它。
答案 0 :(得分:8)
正如我在评论中建议的那样,可以使用SystemEvents.PowerModeChanged
事件来检测系统即将暂停的时间。当检测到该状态时,您需要关闭串口并在操作系统即将从挂起状态恢复时重新打开它。
这是代码。
SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged;
void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e)
{
if (e.Mode != PowerModes.Resume)
serialPort.Close();
}
还要记录事件文件:
<强>注意强>
因为这是一个静态事件,所以在处理应用程序时必须分离事件处理程序,否则会导致内存泄漏。