我正在尝试将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
打印堆栈跟踪,它没有打印任何东西!
答案 0 :(得分:2)
catch (Exception ex)
这是catch-em-all异常处理的问题。您收到InvalidOperationException,因为您更改了打开的端口上的PortName属性。这是你的代码中的一个错误,串口没有任何问题。
如果发现端口未连接到GSM调制解调器,则需要调用Close()方法。
然后你不能再次在同一个SerialPort实例上调用Open(),内部工作线程关闭需要时间。最好的办法是创建一个新的SerialPort实例,而不是试图重复使用相同的实例。