0

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

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

资源正在使用中

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

顺便说一句,我的加密狗是中兴MF190,我看到的应用程序来自华为。我正在使用 C#。有什么解决办法吗?或者更好,这有更好的逻辑吗?说使用服务等。

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

谢谢!

4

1 回答 1

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尝试发送之前检查类变量。

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

于 2013-01-15T01:13:57.523 回答