【发布时间】:2015-01-16 16:54:14
【问题描述】:
我正在使用 .NET System.IO.Ports.SerialPort,正如本文If you must use .NET System.IO.Ports.SerialPort中所建议的那样使用 BaseStream
但是当我尝试关闭端口或 baseStream 时,会引发 System.InvalidOperationException 说“BaseStream 仅在端口打开时可用”
这是我的代码:
private void ActionStarted()
{
//ajusta el puerto
setupSerial();
serial.Open(); //conecta al plc
byte[] buffer = new byte[15];
Action kickoffRead = null;
if (serial.IsOpen)
{
kickoffRead = delegate()
{
serial.BaseStream.BeginRead(buffer, 0, buffer.Length,
delegate(IAsyncResult ar)
{
try
{
int actualLength = serial.BaseStream.EndRead(ar);
byte[] received = new byte[actualLength];
Buffer.BlockCopy(buffer, 0, received, 0, actualLength);
raiseAppSerialDataEvent(received);
}
catch
{
//do something
}
kickoffRead();
}, null);
};
kickoffRead();
}
}
//<-- here is where the error occurs -->
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
serial.BaseStream.Flush();
serial.BaseStream.Close();
serial.Close();
}
我在某处读到串行端口应该在不同的线程上关闭,但我找不到,所以有什么想法吗??
谢谢!!
【问题讨论】:
-
很有可能您实际上并没有打开端口,或者在其他地方关闭了它。如果没有a good code example,就无法说明比这更具体的内容了。
-
很难看出重新实现 DataReceived 事件的意义。基本的错误是你继续调用 BeginRead(),即使你得到了告诉你端口已关闭的异常。
-
ActionStarted() 仅在 onLoad 事件上被调用,并且 port.close() 在窗口关闭之前不会被调用,所以,我在其他任何地方调用 beginRead,那不是案例,这就是为什么我要发布我的问题。谢谢
-
franko,我无法帮助您解决您的问题,但您是如何/在哪里实施 raiseAppSerialDataEvent(received)?
标签: c# .net stream serial-port