1

在另一端的设备突然断开连接后,我无法重新连接到 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;
        }
    }

如果有人可以提供帮助,我将不胜感激。

谢谢你。

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 回答