0

SMS の送信に使用される USB 3G ドングルを検出するアプリケーションがあります。私のアプリケーションは、AT コマンドを介してドングルにクエリを実行し、それが正しいドングルであるかどうかを判断します。これは、特定のドングルが私のアプリケーションでのみ使用できることを意味します (ドングルが同じモデルであっても)。送受信は問題なく、何の問題もありません。3G ドングルが USB ポートから取り外されると、システムはこれを検出し、適切な手順を実行します。

これが私の問題です。3G ドングルが同じポート (COM5) などに再挿入されると、アプリケーションはこれを検出し、AT コマンドを実行して、再挿入されたドングルが正しいドングルであることを判断します。しかし、次のようなエラーが発生します。

リソースは使用中です

同じポート (COM5 など) を使用できるようにするには、アプリケーションを終了するか閉じる必要があります。次に、ほぼ同じ機能を持つアプリケーションに遭遇しましたが、再挿入するとドングルを使用できます。

ところで、私のドングルは ZTE MF190 で、私が見たアプリケーションは Huawei のものです。私は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 に答える