![](/img/trans.png)
[英]Will a serial port connection close outside of the SerialPort.Close() method?
[英]SerialPort.Close() freezes application if the USB COM Port in use has been removed
在当前连接的 COM 端口被删除后关闭.NET C# SerialPort
时,我遇到了我的应用程序冻结。
执行SerialPort.Dispose()
也会冻结。
我阅读了这篇博客,其中对可能的问题进行了一些解释(谨慎行事): https : //www.sparxeng.com/blog/software/must-use-net-system-io-ports-serialport
你能帮我解决这个问题吗?
我找到了一种解决方法,但不确定这是解决问题的好方法。
我正在使用dmitrynogin / PnP优秀库来处理串行 COM 端口添加/删除事件。
private SerialPort _serialPort;
...
private void Main()
{
...
Open(); // Open COM Port
... // Do Stuff
}
...
// COM Port removed event
private void PortCOMRemoved()
{
...
Close(true);
...
}
...
private void Close(bool currentCOMPortRemoved = false)
{
...
if (currentCOMPortRemoved)
{
_serialPort.DtrEnable = false;
_serialPort.RtsEnable = false;
_serialPort.DiscardInBuffer();
_serialPort.DiscardOutBuffer();
// Do not close the COM Port, otherwise, it will freeze
// This is a Bug in SerialPort class management Framework
// On next connexion, it will create a new SerialPort instance
// Application can close itself
}
else
{
_serialPort.Close();
}
...
}
...
private bool Open()
{
bool success = false;
Close();
try
{
_serialPort = new SerialPort();
_serialPort.ErrorReceived += HandleErrorReceived;
_serialPort.PortName = _portName;
_serialPort.BaudRate = _baudRate;
_serialPort.StopBits = _stopBits;
_serialPort.Parity = _parity;
_serialPort.DataBits = (int)_dataBits;
_serialPort.ReadTimeout = 1000;
// We are not using serialPort.DataReceived event for receiving data since this is not working under Linux/Mono.
// We use the readerTask instead (see below).
_serialPort.Open();
success = true;
}
catch (Exception e)
{
Close();
}
return success;
}
当尝试正确Close()
SerialPort
,应用程序冻结。 那么,如果当前的 COM 端口已被删除,为什么不关闭它呢? 稍后当 COM 端口将再次插入时,对Open()
的调用将创建一个新的SerialPort
实例,然后忘记之前未正确关闭的SerialPort
实例。 然后应用程序不会冻结并且可以正常关闭。
我试过了,它作为一种解决方法工作,希望有人能找到更好的解决方案。
另一种方法可能是通过 SerialPortStream 绕过本机 .Net SerialPort 类: jcurl / SerialPortStream System.IO.Ports.SerialPort 和 SerialStream 的独立实现,以获得更好的可靠性和可维护性。
此致
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.