连接丢失后重新连接到COM

时间:2012-08-09 19:52:25

标签: c# serial-port reconnect

在另一端的设备突然断开连接后,我无法重新连接到COM端口。 只有在我关闭并重新打开应用程序时,我才能再次连接。

这是我的连接功能:

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

如果有人能提供帮助,我真的很感激。

谢谢。

2 个答案:

答案 0 :(得分:1)

如果这是真正的串行端口连接,这没有多大意义。没有“连接”状态,串行端口是非常简单的设备,没有建立连接的底层协议。

如果这实际上是模拟串口的USB设备,那么你确实会遇到这种问题。当端口正在使用时拔出USB连接器时,模拟串行端口的驱动程序总是会非常闷热。实际上 USB设备的连接协议,协商由驱动程序完成。它们最常使端口消失,这往往会给用户代码带来无法恢复的心脏病发作。行为是非常不可预测的,并且因司机而异。没有办法解决这个问题,将连接器粘到端口上,从不认为拔掉它会解决代码中的任何问题,即使这是你唯一能用USB做的事情。

答案 1 :(得分: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;
        }
    }