3

gsm モデムにデータを読み書きするアプリケーションを開発しています。モデムの電源を切って再び電源を入れると、起動時にATコマンドを送信して、モデムがポートに指定された設定に自動的に設定されるようにする必要があります。ハイパー ターミナルでこのコマンドを実行すると、コマンドは表示されませんが、コマンドはモデムに送信されます。モデムは、ハイパーターミナルのポート設定に指定した設定に自身を設定します。その後、残りのコマンドを送信できます。しかし、私のアプリケーションでは最初の AT コマンドを送信できないため、ハイパー ターミナル経由で手動で送信しています。アプリケーションでこれが発生しないのはなぜですか? ボタンクリックを使用してこのコマンドを送信しようとしましたが、それでもポートで実行されません。

        port.Open();
        port.DtrEnable = true;
        port.RtsEnable = true;

        if (port != null)
        {
            btn_connect.Enabled = false;
            btn_disconnect.Enabled = true;
            port.WriteLine("AT");

            port.WriteLine("AT+CLIP=1");

            port.WriteLine("AT+CMGF=1");

            con_status.Text = "Connected at " + cboPortName.Text;
        }

アプリケーションで指定したポート設定は次のとおりです。

            port.PortName = cboPortName.Text;
            port.BaudRate = Convert.ToInt32(this.cboBaudRate.Text); //9600
            port.DataBits = Convert.ToInt32(this.cboDataBits.Text); //8
            port.ReadTimeout = Convert.ToInt32(this.txtReadTimeOut.Text); //300
            port.WriteTimeout = Convert.ToInt32(this.txtWriteTimeOut.Text); //300
            port.StopBits = StopBits.One; //1
            port.Parity = Parity.None; // None
            port.Encoding = Encoding.GetEncoding("iso-8859-1"); 
            port.Open();
            port.DtrEnable = true;
            port.RtsEnable = true;
4

3 に答える 3

2

チェックする 2 つのこと、ボーレートとエコー。

SerialPort クラスはデフォルトで 9600 を使用します。

通常、モデムは AutoBaud モードにあり、「AT」コマンドが送信されると、COM ポート リンクのボー レートに合わせて調整されます。可能性は低いですが、モデムが固定のボーレートで動作していて調整できない可能性があります...したがって、ハイパーターミナルで使用していたボーレートを確認し、同じものを使用してください。

エコー - コマンドが送信されたこと (およびモデムが応答していること) を確認するには、モデムでエコーをオンにする必要があると思います。つまり、モデムに送信した文字が受信されても​​、それが送信/エコーされて返されます。

(代わりに、ハイパーターミナルでローカル エコーをオンにすることもできます...しかし、それは望ましくありません...モデムが自分のキャラクターを認識したことを本当に知りたいのです)

送信したものをモデムにエコー バックさせることができない場合は、シリアル ポート リンクの設定方法に問題があります (つまり、間違ったフロー制御ハンドシェイク/パリティなどを使用しているか、フロー制御ステータスを上げていません)。行)。

モデムが RTS/CTS フロー制御を使用するように構成されていると仮定して、次のことを試しましたか?

port.Handshake = HandShake.RequestToSend? (つまり、ハードウェア制御ラインのフロー制御)。

したがって、そのモデムの eeprom のデフォルトがエコーしないようになっている (つまり、誰かがエコーを変更して &W0 を実行した) か、ハイパーターミナルがポートを開いたときにモデムでオフにするように構成されている可能性があります。つまり、AT「初期化文字列」があります!)。SerialPort クラスを使用している場合は、そのポートの初期化文字列を確認し、それをコピーして使用する必要があります。

もう 1 つのベスト プラクティスは、次の AT コマンドを発行する前に応答コードを待機することです。遅延はそれを行う 1 つの方法ですが、ベスト プラクティスではありません。コマンドによっては実行に異なる時間がかかる場合があるためです....また、一部のモデムでは実行されないためです。 「ビジー」の間に別のコマンドを受信するようなものです。

最初にこのコマンドを試してください:

  • AT&FE1 (工場出荷時の設定にリセットし、エコーをオンにします)

    (モデムの電源を入れたばかりの場合は、とにかくその時点で工場出荷時の設定になっているはずなので、&F は不要であることに注意してください....しかし、それを行っても害はありません。E1 はターンします。エコーオン)。

  • OK 応答コード

    を待つ HyperTerminal を使用している場合、コマンドを入力している場合 (スクリプトを使用してコマンドを送信している場合はスクリプトを待機させている場合)、または AT コマンドを送信している場合は、応答コードが返されるのを視覚的に待つだけです。コードでは、コードは応答をキャプチャし、それに応じて動作する必要があります。

  • 次のコマンドを発行します (例: AT+CLIP=1)

  • OK、ERROR、またはコマンド固有の応答コードを待ちます。

    注: モデムが異なれば、同じコマンドでも異なる応答コードが使用される場合があります。

  • 次のコマンドなどを発行する

参照用に便利なリンクを次に示します。つまり、フレーバーの表示や AT コマンド、およびハイパーターミナルのリファレンスです。

于 2012-07-22T11:43:05.050 に答える
1

問題は解決された。将来誰かを助けるかもしれません、これは私がやったことです。

接続の確立中に、これらの 2 行の設定をポートに追加しました。

            port.DiscardOutBuffer(); 
            port.DiscardInBuffer();

しかし、これらの設定を追加することで違いが生じ、問題が解決した理由はわかりませんが、うまくいきました:)

于 2012-07-27T10:52:03.747 に答える
0

なぜコマンド間にタイムギャップが必要なのですか... 昔、ATコマンドをモデムに渡す作業をしていました.「AT + FCLASS = 8」「ATS0 = 1」「AT + VTX」などのコマンドを遅延なく連続して渡したのを覚えていますその間に、この遅延について本当によろしいですか?

また、ちょうど

 port.WriteLine("AT+CLIP=1"); 

うまくいかないかもしれませんが、よくわかりませんし、試してみるモデムも今のところありませんが、以前は AT コマンドの後に ENTER キーも渡していたと思うので、コマンドは

 port.WriteLine("AT+CLIP=1" + System.Convert.ToChar(13).ToString()); 

これを変更すると役立つかどうかを確認してください...

于 2012-07-20T05:07:38.040 に答える