GSMモバイルを使用したATコマンドによるSMSでエラーが発生している

StackOverflow https://stackoverflow.com/questions/1210934

  •  06-07-2019
  •  | 
  •  

質問

GSM携帯電話でATコマンドでSMSを送信しています。大量のメッセージを大量に送信したい。 GSMモバイルでは、1分あたり6〜8 SMSを送信できることを読みました。しかし、私がメッセージを送信すると、誰かが行き、誰かが行きません。 Excelファイルから情報を取得しています。宛先番号とメッセージテキストを意味しています。いくつかのSMSが行っているのとそうでないのを教えてください。私のコードは

です
        SmsFields smsObj = null;
        List<SmsFields> smsColl = null;
        SerialPort serialport = null;
        StringBuilder strbuild = new StringBuilder();
        try
        {
            //Validate the form 
            if (!Validation()) return;

            serialport = new SerialPort();

            ////Sets the properties of serial port object
            serialport.PortName = cboPort.SelectedItem.ToString();
            serialport.BaudRate = 9600;
            serialport.Parity = Parity.None;
            serialport.DataBits = 8;
            serialport.StopBits = StopBits.One;
            serialport.Handshake = Handshake.RequestToSend;
            serialport.DtrEnable = true;
            serialport.RtsEnable = true;

            //Open the port to send sms
            serialport.Open();

            //Check if port is opened or not
            if (!serialport.IsOpen)
            {
                MessageBox.Show("Serial port is not opened. Please try with other port");
                return;
            }

            //Create smsFields class's object and fill the data in the generic collection
            smsObj = SmsFields.Instance;
            smsColl = smsObj.FillData(txtFilePath.Text);

            if (smsColl == null)
            {
                MessageBox.Show("No data found in the excel table");
                return;
            }
            //Gets the single record from SmsFields class and sends the message
            foreach (SmsFields sms in smsColl)
            {

                //checks phone status
                serialport.WriteLine("AT" + Environment.NewLine);
                //Configures message as SMS (0 for PDU format) and (1 for text format)
                serialport.WriteLine("AT+CMGF=1" + Environment.NewLine);

                //Sets message center number
                serialport.WriteLine("AT+CSCA=\"" + txtServiceNo.Text + "\"" + Environment.NewLine);

                //Sets destination number
                serialport.WriteLine("AT+CMGS=\"" + sms.DestinationNo + "\"" + Environment.NewLine);

                //Specifies message and sends Ctrl+z
                serialport.WriteLine(sms.Message + (char)26);

                //Displays buffer containing output messages
                System.Threading.Thread.Sleep(4000);
   }
役に立ちましたか?

解決

あなたの問題は、次のコマンドを送信する前に最終結果コード(つまり、OK、ERRORなど)を待っていないことだと思います。問題は、新しいコマンドが終了していない場合、進行中のコマンドの中止をトリガーすることです。 V.250 を引用するには:

  

5.6.1コマンドの中止

     

...

     

中止   コマンドの実行は   DTEからDCEへの送信   どんなキャラクターでも。

したがって、常に ATコマンドを送信する場合、次のコマンドを送信する前に、最終結果コードを必ず待つ必要があります。

serialport.WriteLine(&quot; ATxxx&quot; + Environment.NewLine) sendCommand(serialport、&quot; ATxxx&quot;)関数にリファクタリングすることをお勧めしますか?そして、その関数の最後に最終結果コードを待つことを追加できます。

他のヒント

送信されていないメッセージにパターンがあるかどうかを確認してください。それは、メッセージの数値形式または無効な文字に問題がある可能性があるためです。

また、いくつかのメモ:

  1. エラーチェックを行っていません。各コマンドを呼び出した後、予想される応答が返されることを確認します。

  2. Environment.NewLineを使用して各行を終了しています。これは、基礎となるオペレーティングシステムによって変化するプロパティであると想定しています。ただし、AT標準では、コマンドラインの終了に使用する文字を正確に明確にしています。

  3. 携帯電話は本当の野郎です。あなたが仕様やドキュメントに従っているからといって、そうではありません。各電話モデルは他のすべてのモデルと異なる動作をすると仮定します。ポイント1を参照してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top