C# 循环在catch()块内暂停/激活
我正在尝试向COM端口发送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;
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)