重新打开封闭式串口

时间:2013-01-15 01:02:07

标签: serial-port at-command

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

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

资源正在使用

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

BTW,我的加密狗是中兴MF190,我看到的应用程序来自华为。我正在使用C#。这有什么工作吗?或者更好,这有更好的逻辑吗?说使用服务等。

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

谢谢!

1 个答案:

答案 0 :(得分:0)

我的Windows串口组件也有类似的问题。 C#代码中似乎存在错误。

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

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

    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");
        }
    }

请注意,如果您在结束时尝试发送/接收,请在尝试发送之前检查_Closing类变量。

希望这有助于任何人。