Serial port 重新打开关闭的串行端口

Serial port 重新打开关闭的串行端口,serial-port,at-command,Serial Port,At Command,我有一个应用程序,检测一个USB 3G加密狗,将用于发送短信。我的应用程序通过AT命令查询加密狗以确定它是否是正确的加密狗,这意味着某些加密狗只能在我的应用程序中使用(即使加密狗是同一型号)。发送和接收都很好,没有任何问题。如果从USB端口卸下3G加密狗,系统会检测到这一点并执行正确的程序 这是我的问题。当3G加密狗重新插入时,比如在同一端口(COM5),我的应用程序会检测到这一点,并执行一些AT命令来确定重新插入的加密狗是正确的加密狗。但出现了一个错误,说明: 资源正在使用中 必须终止或关闭应

我有一个应用程序,检测一个USB 3G加密狗,将用于发送短信。我的应用程序通过AT命令查询加密狗以确定它是否是正确的加密狗,这意味着某些加密狗只能在我的应用程序中使用(即使加密狗是同一型号)。发送和接收都很好,没有任何问题。如果从USB端口卸下3G加密狗,系统会检测到这一点并执行正确的程序

这是我的问题。当3G加密狗重新插入时,比如在同一端口(COM5),我的应用程序会检测到这一点,并执行一些AT命令来确定重新插入的加密狗是正确的加密狗。但出现了一个错误,说明:

资源正在使用中

必须终止或关闭应用程序才能使用同一端口(例如COM5)。然后我遇到了一个应用程序,几乎具有相同的功能,但在重新插入时可以使用加密狗

顺便说一句,我的加密狗是中兴MF190,我看到的应用程序来自华为。我用的是C#。这方面有什么工作吗?或者更好,有没有更好的逻辑?比如说使用服务等等

编辑: 对加密狗的每个查询都在一个单独的线程中完成,以便在发送和接收时能够使用我的应用程序


谢谢

我也有类似的windows串行端口组件问题。C代码中似乎有bug

长话短说,我通过在后台线程中关闭端口来解决这个问题

这是我的代码,请注意,您可能需要修改以适合您的应用程序:

    private bool ClosePort()
    {
        _Closing = true;
        _SerialPort.DiscardInBuffer();
        _SerialPort.DiscardOutBuffer();
        if (!_SerialPort.IsOpen) return true;
        //We run this in a new thread to avoid issue when opening and closing
        //The .NET serial port sucks apparently - and has issues such as hanging and random exceptions
        System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(DoClosePort));
        t.Start();
        //here we wait until is **SHOULD*** be closed - note the better way is to fire an internal event when its finished 
        //We may need to tinker with this wait time
        System.Threading.Thread.Sleep(500);
        return _SerialPort.IsOpen;
    }

    private void DoClosePort()
    {
        try
        {
            //System.Threading.Thread.Sleep(500);
            _SerialPort.Close();
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error closing " + _SerialPort.PortName + ". Error Message: " + ex.Message + "\r\n");
        }
    }
请注意,如果在关闭时尝试发送/接收,请在尝试发送之前检查
\u closing
类变量


希望这对任何人都有帮助。

可能重复感谢您的解决方案,但它对我不起作用。即使我尝试将所有内容设置为null或dispose,错误也是一样的。问题是,用户总是可以随时从USB端口拉出加密狗,无论是在应用程序发送、接收等过程中。您可能需要在尝试发送/接收时捕获异常,如果是,则提示用户。上面的代码使我能够正确关闭端口,并使您能够重用我已经做过的相同端口号。随函附上与串行端口有关的所有信息。。无论我何时检查“_closing”类,我都无法控制它,因为用户可能会删除加密狗(可能是为了好玩)。添加了一些关于我问题的信息