1

I cannot reconnect to COM port after device on the other end abruptly drops connection. I can connect again only if I close and re-open the application.

ここに私の接続機能があります:

public bool connectTurboPump()
    {
        try
        {
            if (TPumpSerialPort != null && TPumpSerialPort.IsOpen == true)
                return true;

            DataRow dr = tblTPump.Rows[0];

            Types.Connection TPumpConnection = new Types.Connection();
            TPumpConnection.PORT = dr["port"].ToString();
            TPumpConnection.BAUD_RATE = Convert.ToInt32(dr["baud"]);
            TPumpConnection.PARITY = (Parity)Enum.Parse(typeof(Parity), dr["parity"].ToString(), true);
            TPumpConnection.DATA_BITS = Convert.ToInt32(dr["dataBits"]);
            TPumpConnection.STOP_BITS = (StopBits)Enum.Parse(typeof(StopBits), dr["stopBits"].ToString(), true);
            TPumpConnection.HANDSHAKE = (Handshake)Enum.Parse(typeof(Handshake), dr["handshake"].ToString(), true);

            TPumpSerialPort = new SerialPort(TPumpConnection.PORT, TPumpConnection.BAUD_RATE, TPumpConnection.PARITY, TPumpConnection.DATA_BITS, TPumpConnection.STOP_BITS);
            TPumpSerialPort.Handshake = TPumpConnection.HANDSHAKE;
            TPumpSerialPort.Open();
            TPumpSerialPort.NewLine = "\r";
            TPumpSerialPort.ReadTimeout = 10000;
            TPumpSerialPort.WriteTimeout = 10000;

            if (TPumpSerialPort.IsOpen != true)
                return false;

            return true;
        }
        catch { return false; }
    }

そして、ここに私の再接続機能があります:

public bool reconnectTurboPump(int attempts = 3)
    {
        try
        {
            if (TPumpSerialPort != null && TPumpSerialPort.IsOpen == true)
            {
                TPumpSerialPort.Close();
                TPumpSerialPort.Dispose();
            }

            int i = 1;
            while (true)
            {
                Log(string.Format("Reconnecting Turbo Pump attempt {0}", i));

                if (connectTurboPump())
                    break;

                if (i == attempts)
                    return false;

                i++;
            }

            return true;
        }
        catch (Exception ex)
        {
            Log(string.Format("Could not reconnect to Turbo Pump: {0}", ex.Message));
            return false;
        }
    }

誰かが助けてくれれば本当にありがたいです。

ありがとうございました。

4

2 に答える 2

2

これが真のシリアル ポート接続である場合、これはあまり意味がありません。「接続」状態はありません。シリアル ポートは非​​常に単純なデバイスであり、接続を確立する基本的なプロトコルはありません。

これが実際にシリアル ポートをエミュレートする USB デバイスである場合、実際にこの種の問題が発生します。シリアル ポートをエミュレートするドライバは、ポートの使用中に USB コネクタを取り外すと、常に不機嫌になります。実際にUSB デバイス用の接続プロトコルがあり、ネゴシエーションはドライバーによって行われます。ほとんどの場合、ポートが消えてしまいます。これは、ユーザー コードに回復不能な心臓発作を引き起こす傾向があります。動作は非常に予測不可能で、ドライバーごとに異なります。これを解決する方法はありません。コネクタをポートに接着し、プラグを抜くことでコードの問題が解決するとは決して考えないでください。USB でできることはそれだけです。

于 2012-08-10T12:44:32.273 に答える
0

Thomas のアドバイスに従って、再接続スクリプトを次のように変更しました。現在テスト中。

 public bool reconnectTurboPump(int attempts = 3)
    {
        try
        {
            //if (TPumpSerialPort != null && TPumpSerialPort.IsOpen == true)
            if (TPumpSerialPort != null)
            {
                TPumpSerialPort.Close();
                TPumpSerialPort.Dispose();
            }

            int i = 1;
            while (true)
            {
                Log(string.Format("Reconnecting Turbo Pump attempt {0}", i));

                Thread.Sleep(2000);

                if (connectTurboPump())
                    break;

                if (i == attempts)
                    return false;

                i++;
            }

            return true;
        }
        catch (Exception ex)
        {
            Log(string.Format("Could not reconnect to Turbo Pump: {0}", ex.Message));
            return false;
        }
    }
于 2012-08-10T09:41:04.587 に答える