我正在尝试向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();
or port.PortName = serialPorts[i];
then 似乎什么都没有发生,而不是打印端口名称(内部findGsmModem()
)。正在打印以下端口
COM1
COM2
COM8
COM9
COM5
COM4
COM3
如您所见,gmsCOM5
调制解调器实际存在的端口位于数组的第 5 个元素中,因此在访问.findGsmModem()
catch()
COM5
我确实相信我在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
打印堆栈跟踪,但它没有打印任何东西!