1

我正在尝试向ATCOM 端口发送命令,以便找到 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打印堆栈跟踪,但它没有打印任何东西!

4

1 回答 1

2
    catch (Exception ex)

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

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

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

于 2013-08-16T08:11:38.613 回答