我正在使用 .NET System.IO.Ports.SerialPort,并按照本文中的建议使用 BaseStreamIf you must使用.NET System.IO.Ports.SerialPort http://www.sparxeng.com/blog/software/must-use-net-system-io-ports-serialport
但是当我尝试关闭端口或baseStream时,系统无效操作异常提出“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();
}
我在某处读到串行端口应该在不同的线程上关闭,但我找不到,所以有什么想法吗?
Thanks!!
我面临与你所描述的同样的问题。基本上,我通过正确处理串行端口资源并在调用读取操作之前检查端口状态来解决。这是打开端口、读取和关闭端口的完整代码。
public bool Open()
{
bool result = false;
try
{
this.serialPort.Open();
result = true;
startReading = StartAsyncSerialReading;
startReading();
}
catch (Exception)
{
this.Close();
result = false;
}
return result;
}
private void StartAsyncSerialReading()
{
byte[] buffer = new byte[bufferLength];
serialPort.BaseStream.BeginRead(buffer, 0, bufferLength, delegate(IAsyncResult ar)
{
try
{
if (serialPort.IsOpen)
{
actualReadLength = serialPort.BaseStream.EndRead(ar);
received = new byte[actualReadLength];
DoYourStuffWithDataBuffer();
}
}
catch (IOException exc)
{
//handleAppSerialError(exc);
}
if (serialPort.IsOpen)
startReading();
}, null);
}
protected Stream GetStream()
{
return this.serialPort.BaseStream;
}
public void Dispose()
{
this.Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
this.serialPort.Dispose();
this.disposed = true;
}
}
public void Close()
{
this.serialPort.Close();
this.Dispose();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)