作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
这是从串口读取数据的代码。为了简单起见,让我们通过单击按钮来完成;
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()
时收到错误消息,“请求的资源正在使用中。”。内部异常中没有任何内容。
我已经用 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/
我是一名优秀的程序员,十分优秀!