Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 循环在catch()块内暂停/激活_C#_.net_Visual Studio 2010_For Loop_Try Catch - Fatal编程技术网

C# 循环在catch()块内暂停/激活

C# 循环在catch()块内暂停/激活,c#,.net,visual-studio-2010,for-loop,try-catch,C#,.net,Visual Studio 2010,For Loop,Try Catch,我正在尝试向COM端口发送AT命令,以便找到GSM加密狗。下面是代码 public bool findGsmModem() { bool sendStatus = false; //Get all the available ports string[] serialPorts = SerialPort.GetPortNames(); for (int i = 0; i < serialPorts.Length;

我正在尝试向COM端口发送
AT
命令,以便找到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;
    }
好的,现在在
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()
在访问
COM5
之前调用
catch()

当使用
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
打印堆栈跟踪,但它没有打印任何东西

    catch (Exception ex)
这就是catch-em-all异常处理的问题。您将获得InvalidOperationException,因为您更改了已打开端口的PortName属性。这是代码中的一个bug,串口实际上没有任何问题

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


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

您能提供openPort()方法的定义吗?@AndreidelaCruz:谢谢您的回复。我把它添加到问题中只是一个小提示:在你的
openPort()
方法中,你应该替换
throw-ex带有
抛出。这样你就不会丢失信息(stacktrace)。事实上,你的整个
catch
-block在
openPort()
中现在是无用的(比无用更糟糕,因为它删除了信息),并且可以安全地删除(然后它在
try
-子句中也没有那么重要,所以只剩下真正的代码)。您好,谢谢你的回复。我注意到,如果我使用像'COM7'这样的硬线端口,我可以得到异常'UnauthorizedAccess'。错误似乎发生在'COM1'和'COM2'之间,可能很少发生其他错误。问题继续:(我按照您建议的方式编辑了代码,但我没有得到应该处理的异常,因为我是C#新手。我正在方法autoInitializer()内创建一个新的serialport。代码在上面进行了编辑。请帮助。如果我执行类似端口1的操作,我得到的唯一结果就是“线程”(0x484)已退出,代码为0(0x0)。'您必须始终调用Close并创建一个新线程,无论是否存在异常。忽略调试器通知,您只看到工作线程正在退出,这就是我在回答中提到的。
    catch (Exception ex)