3

SM5100B GSM デバイスを制御するために Arduino を使用しています。別の SMS を受信した後に SMS を送信する場合を除いて、すべてが機能します。私はこれを得る、

エラーコード:

OK > + CMGS: 2 5 OK + CMEERROR: 4

前述の受信 SMS を処理するための私のコード:

     #include <SoftwareSerial.h>  //Include the NewSoftSerial library to send serial commands to the cellular module. 
        char inchar;                //Will hold the incoming character from the Serial Port. 
        SoftwareSerial cell(2,3); 
        char mobilenumber[] = "0597010129";
        void setup() { 
        //GSM
        Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
        Serial.println("Initialize GSM module serial port for communication.");                       
        cell.begin(9600); 
        delay(35000); // give time for GSM module to register on network etc. 
        Serial.println("delay off");
        cell.println("AT+CMGF=1"); // set SMS mode to text 
        delay(200); 
        cell.println("AT+CNMI=3,3,0,0"); // set module to send SMS data to serial out upon receipt 
        delay(200); 
        } 



        void loop() {   

         if(cell.available() >0)//If a character comes in, from the cellular module
         { 
         inchar=cell.read(); 
         Serial.println(inchar); 
         if (inchar=='#'){ // OK - the start of our command 

           delay(10); 
           inchar=cell.read();
           Serial.println(inchar);  

             if (inchar=='a'){ 

               delay(10); 
               Serial.println("The folowing SMS : \n");
               inchar=cell.read();
               Serial.println(inchar); 

               if (inchar=='0'){ //sequance = #a0

                 Serial.println("#a0 was received"); 

             }
             else if (inchar=='1'){//sequance = #a1

                Serial.println("#a1 was received ");
                sendSms();

             }
         }
         cell.println("AT+CMGD=1,4");// AT command to delete all msgs
         Serial.println(" delete all SMS"); 
          } 
        }//end of  if(cell.available() >0) {...}
        }

        void sendSms(){
        //cell.println("AT+CMGF=1"); // set SMS mode to text 
        cell.print("AT+CMGS=");  // now send message... 
        cell.print((char)34); // ASCII equivalent of " 
        cell.print(mobilenumber); 
        cell.println((char)34);  // ASCII equivalent of " 
        delay(500); // give the module some thinking time 
        cell.print(":D hello m3alleg :D");   // our message to send 
        cell.println((char)26);  // ASCII equivalent of Ctrl-Z 
        delay(20000);
}
4

2 に答える 2

16

ATコマンドの取り扱いに関する一般的な注意事項。

ダメダメダメ!この方法では、確実に機能することはありません。「送信するテキスト」を送信する前に 、文字が受信されるのを待つ必要があります>または、実際には>キャラクターだけでなく、4文字です。3GPP仕様27.005からの引用:

  • TAは、コマンドラインが;<CR><LF><greater_than><space> で終了した後、4文字のシーケンス(IRA 13、10、62、32)を送信する必要 があります。<CR>その後、テキストをTEからME/TAに入力できます。

(ここでのTA(ターミナルアダプタ)とは、ATコマンドの送信者であるモデムとTE(ターミナル機器)を意味します)

中止可能なATコマンド(および27.005がAT + CMGSについて明確に述べている This command should be abortable.)の場合、任意の文字を送信すると、コマンドの操作が中止されます。ITU V.250を引用するには:

5.6.1コマンドの中止

..。

コマンドの中止は、任意の文字のDTEからDCEへの送信によって実行されます。

(ここでのDCE(データ通信機器)とは、ATコマンドの送信者であるモデムとDTE(データ端末機器)を意味します)

これは、モデムから「\ r \ n>」が送信される前に「送信するテキスト」を送信すると、コマンドが中止されることを意味します。応答が送信されることを期待するために「十分長く」待つ方法はありません。モデムから返される応答テキストを読んで解析する必要があります

同じことが、各コマンドの後の最終結果コードにも当てはまります(たとえば、、、OKおよび その他いくつか)。たとえば、「AT + CMGF = 1」を送信してから、最初にOKを待たずに次のコマンドを送信すると、問題が発生します。したがって、ATコマンドを送信するときは常に、次のコマンドを送信する前に最終結果コードを待つ必要があります。ERRORCME ERROR

delayATコマンドの応答を待つために使用しないでください。それは彼らを動かすためにあなたの邪魔をする犬を蹴るのと同じくらい便利です。はい、実際にはうまくいく場合もありますが、ある時点で、そのアプローチを採用して申し訳ありません...

あなたの質問に答えてください。

取得した応答に基づいて、問題はコマンドの中止ではないことがわかります(ただし、上記のように解析には修正が必要な深刻な問題があります)。CMEエラーが最善の手がかりです。27.007のセクション「9.2.1一般的なエラー」からoperation not supported、値4の説明として示されています。

27.005は次のように述べています。

ネットワークで送信に失敗した場合、またはMEエラーが発生した場合は、最終結果コード+ CMS ERROR:が返されます。

これは+CMEERRORではなく+CMSERRORですが、該当することに注意してください。以下を参照してください。

アクションのシーケンスは次のとおりだと思います。

SM100B GSMモデムのATコマンド処理部分は、SMSデータを受け取り、それを適切な形式にフォーマットして、GSMネットワークと通信するモデムの部分に送信します。SMSデータをネットワークに正常に送信し、これをATコマンド処理部分に報告します。ATコマンド処理部分は+CMGS: 25、最終結果コードを出力しますOK。ただし、しばらくすると、ネットワークはSMSの拒否メッセージを送り返します。これは、+CMEERROR応答として返されます。

上記の私の推測が正しければ、応答は代わりに+ CMS ERRORとして配信されるべきでしたか?いいえ、AT + CMGSコマンドに対する最終応答はすでに与えられているため(OK)、コマンドに対して複数の最終結果コードを返すことは絶対に行わないでください(誤って(注1)を除く)。+ CME ERRORはERRORの最終結果コードを置き換えることができますが、それは最終結果コードだけではありません。AT + CMEEコマンドの説明から:

Setコマンドは、MTの機能に関連するエラーの表示として結果コード+ CME ERROR:の使用を無効または有効にします。有効にすると、MT関連のエラーにより+ CME ERROR:通常のERROR最終結果コードではなく最終結果コードが発生します。エラーが構文、無効なパラメーター、またはTA機能に関連している場合、通常はERRORが返されます。

したがって、+ CME ERRORは、最終結果コードであると同時に、一方的な結果コード(おそらく中間結果コードでもある)である可能性があります。

しかし、AT + CMGSコマンドがネットワーク拒否を受信するのを待って、+ CMSエラーを返すことはできませんでしたか?おそらくそうではありません。SMS送信のネットワークの詳細についてあまり知らなくても、今日の拒否が以前よりもはるかに遅い時間に発生する可能性があります。このような変更は、元々GSMの動作に密接に関連していた古い遺産を持つGSM関連のATコマンドで問題になることがありますが、テクノロジーがGPRS、UMTS、LTEなどに移行するにつれて真実性が低下することがあります。

注1:

私の以前の同僚の1人は、ATD1234の後、標準が音声通話処理を指定する方法について不平を言っていました。コマンドを実行すると、最初に最終結果コードOKが取得され、後で呼び出しが終了すると、新しい最終結果コードNOCARRIERが取得されます。これはひどく悪い設計であり、コール終了の表示は、最終的な応答ではなく、特定の一方的な応答である必要があります。

要約すると

あなたのSMSはネットワークによって拒否されたようです。理由を調べてみてください。また、ATコマンドの処理に深刻な問題があり、修正する必要があります。モデムからの応答テキストを読み取って解析せずにATコマンドを処理する方法はありません。

于 2013-03-23T20:25:41.377 に答える