c# - 如果正在使用的 USB COM 端口已被移除,SerialPort.Close() 会卡住

我面临我的应用程序卡住,当关闭 .NET C# SerialPort 在当前连接到的 COM 端口之后,已被删除。

执行 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 的独立实现,以实现更好的可靠性和可维护性。

最好的问候

关于c# - 如果正在使用的 USB COM 端口已被移除,SerialPort.Close() 会卡住应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60460561/

相关文章:

imagemagick - 由于 magick_image_readpath 中的错误,无法将 ka

java - 使用 Jacoco Agent 远程触发 jacoco 执行数据转储

r - 在 Shiny 的服务器上增加堆栈维度

javascript - nuxt layout - 为移动端和桌面端提供不同的布局

reactjs - 故事书:ReferenceError: Jest 未定义

javascript - 调用一次从 API 获取数据

android-studio - 如何禁用 Android-Studio 3.6 中引入的多预览功能

reactjs - 清理本地存储后如何进行重定向?

json - 将 GeoJSON 文件导入 React-Leaflet

django - 发出命令时出现静态错误 "python manage.py collectstat