循环在catch()块内暂停/停用

时间:2013-08-16 07:18:40

标签: c# .net visual-studio-2010 for-loop try-catch

我正在尝试将AT命令发送到COM端口,因此我可以找到GSM加密狗。以下是代码

public bool findGsmModem()
    {
        bool sendStatus = false;

        //Get all the available ports
        string[] serialPorts = SerialPort.GetPortNames();

        for (int i = 0; i < serialPorts.Length; i++)
        {
            Console.WriteLine(serialPorts[i]);
        }

        //Iterate through all the ports sending AT commands to find a modem
        for (int i = 0; i < 1; i++)
        {
            try
            {
                //port.PortName = serialPorts[i].Trim();
                port.PortName = "COM7";
                openPort();

                string res = ATCommandCaller("AT", 300,"Unable to connect to the phone"); //Connecting to the phone
                //res = ATCommandCaller("AT+CMGF=1", 300); //Setting the message Format

                sendStatus = true;

                break;
            }
            catch (System.InvalidOperationException ex)
            {
                //port.PortName = null;
                port.Close();
                autoInitializer();
                //port = new SerialPort();
                continue;
                //throw ex;
            }
        }

        return sendStatus;
    }

以下是我在另一个类

中调用此方法的方法
if (sms.findGsmModem())
{
    MessageBox.Show("Modem Found: " + sms.getPortName());
}
else
{
    MessageBox.Show("No modem found");
}

好的,现在在findGsmModem()方法中,如果我使用port.PortName = "COM5";,则上述第二个代码成功运行并显示消息。这是因为调制解调器实际上在COM5中并且值是硬编码的,因此该语句不会到达catch()块。

但是,如果我使用port.PortName = serialPorts[i].Trim();port.PortName = serialPorts[i];,那么似乎没有任何事情发生,而不是打印端口名称(在findGsmModem()内)。正在打印以下端口

COM1
COM2
COM8
COM9
COM5
COM4
COM3

正如您所看到的,COM5,gms调制解调器实际存在的端口位于数组的第5个元素中,因此findGsmModem()在访问catch()之前调用COM5部分{1}}。

我相信在使用port.PortName = serialPorts[i].Trim()时我没有得到任何东西,因为它会转到catch()部分并且会发生一些可怕的事情。

有什么想法吗?

以下是openPort()方法

public void openPort()
        {
            try
            {
                port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);

                if (!port.IsOpen)
                {
                    port.Open();
                }

                port.RtsEnable = true;
                port.DtrEnable = true;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

修改 这是最奇怪的部分。我刚刚注意到在调用循环时永远不会到达catch()块!我试过ex.Message打印堆栈跟踪,它没有打印任何东西!

1 个答案:

答案 0 :(得分:2)

    catch (Exception ex)

这是catch-em-all异常处理的问题。您收到InvalidOperationException,因为您更改了打开的端口上的PortName属性。这是你的代码中的一个错误,串口没有任何问题。

如果发现端口未连接到GSM调制解调器,则需要调用Close()方法。

然后你不能再次在同一个SerialPort实例上调用Open(),内部工作线程关闭需要时间。最好的办法是创建一个新的SerialPort实例,而不是试图重复使用相同的实例。