0

ArduinoUnoとTC35GSMモジュールの間にSMSメッセージを送受信するためのソフトウェアシリアルリンクがあります。SMS'/呼び出しの送信は、適切なATコマンドをGSMモジュールに送信する問題であるため、問題ではありません。ただし、AT + CMGR = 1コマンド(SIMカードに保存されている最初のSMSをチェックする)を使用してメッセージがあるかどうかを確認し、メッセージをchar配列として保存して、SMSにLEDをアクティブにするには、「オン」または「オフ」という単語を使用します。

AT + CMGR = 1コマンドは、次を返す必要があります。

AT+CMGR=1
+CMGR: "REC READ","+3538xxxxxxxx",,"13/03/23,14:29:37+00"
Set

OK

しかし、以下のメソッドでは、「データ」を出力すると、次のように返されます。

メッセージに含まれるもの:

任意のポインタをいただければ幸いです。

void checkMessage() {

    gsmSerial.println("AT+CMGR=1");    //Reads the first SMS

    for (x=0;x < 255;x++){            
        data[x]='\0';                        
    } 
    x=0;
    do{
        while(gsmSerial.available()==0);
        data[x]=gsmSerial.read();  
        x++;           
        if(data[x-1]==0x0D&&data[x-2]=='"'){
            x=0;
        }
    }while(!(data[x-1]=='K'&&data[x-2]=='O'));

    data[x-3]='\0';        //finish the string before the OK

    Serial.println("\r\nMessage contains: \r");
    Serial.println(data);    //shows the message

    delay(1000);
}
4

1 に答える 1

3

私はこれを行うあなたの意図を理解していません:

if(data[x-1]==0x0D&&data[x-2]=='"'){ 
    x=0; 
}

末尾の引用符と改行を含む行にヒットするたびに、データを破棄して新しいデータを読み取っているように見えます。したがって、対象のコマンドへの応答は破棄されます。私はそれをテストしていませんが、これらの3行を削除すればうまくいくと思います。

また、バッファの前にメモリを参照していること[x-1]にも言及する必要があります。これは非常に悪い習慣であり、未定義の動作を引き起こす可能性があります。その計算の結果が正の値になる場合にのみ、インデックスから値を引いた値をチェックする必要があります。負の配列インデックス、配列の開始前にメモリにアクセスします。[x-2]data

于 2013-03-25T20:26:16.967 に答える