1

コマンドを 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;
    }

別のクラス内でこのメソッドを呼び出す方法は次のとおりです

if (sms.findGsmModem())
{
    MessageBox.Show("Modem Found: " + sms.getPortName());
}
else
{
    MessageBox.Show("No modem found");
}

上記の 2 番目のコードを使用すると、findGsmModem()メソッドで正常に動作し、メッセージが表示されます。これは、モデムが実際には COM5 にあり、値がハード コードされているため、ステートメントがブロックport.PortName = "COM5";に到達しないためです。catch()

しかし、port.PortName = serialPorts[i].Trim();orを使用するport.PortName = serialPorts[i];と、ポート名を出力する代わりに何も起こっていないように見えます(内部findGsmModem())。次のポートが印刷されています

COM1
COM2
COM8
COM9
COM5
COM4
COM3

ご覧のとおりCOM5、 gms モデムが実際に存在するポートは配列の 5 番目の要素にあるため、 part を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)

これは、すべてをキャッチする例外処理の問題です。開いているポートの PortName プロパティを変更したため、InvalidOperationException が発生しています。これはコードのバグです。実際にはシリアル ポートに問題はありませんでした。

ポートが GSM モデムに接続されていないことがわかった場合は、Close() メソッドを呼び出す必要があります。

その後、同じ SerialPort インスタンスで Open() を再度呼び出すことはできません。内部ワーカー スレッドがシャットダウンするのに時間がかかります。最善の方法は、同じものを繰り返し使用し続けるのではなく、SerialPort の新しいインスタンスを作成することです。

于 2013-08-16T08:11:38.613 に答える