1

gsm モジュール SIM900 (Arduino に接続されている) で着信 SMS を読み取る必要があり、送信者番号とメッセージをシリアル モニターに出力したいと考えています。

最初に gsm モジュールを AT コマンドで構成すると、Response() 関数が AT コマンドへの応答を返します。

SMSは次のパターンになるため

+CMT: "[携帯番号]", "[日時]" [メッセージ本文]

したがって、最初に +CMT を抽出し、その後、携帯電話番号を取得し、最後にメッセージ本文を取得します。私が使用したコードは

char RcvdMsg[200] = "";
int RcvdCheck = 0;
int RcvdConf = 0;
int index = 0;
int RcvdEnd = 0;
char MsgMob[15];
char MsgTxt[50];
int MsgLength = 0;

void Config() // This function is configuring our SIM900 module i.e. sending the initial AT commands
{
delay(1000);
Serial.print("ATE0\r");
Response();
Serial.print("AT\r");
Response();
Serial.print("AT+CMGF=1\r");
Response();
Serial.print("AT+CNMI=1,2,0,0,0\r");
Response();
}


void setup()
{
  Serial.begin(9600);
  Config();
}

void loop()
{
  RecSMS();
}


void Response() // Get the Response of each AT Command
{
int count = 0;
Serial.println();
while(1)
{
if(Serial.available())
{
char data =Serial.read();
if(data == 'K'){Serial.println("OK");break;}
if(data == 'R'){Serial.println("GSM Not Working");break;}
}
count++;
delay(10);
if(count == 1000){Serial.println("GSM not Found");break;}

}
}

void RecSMS() // Receiving the SMS and extracting the Sender Mobile number & Message Text
{
if(Serial.available())
{
char data = Serial.read();
if(data == '+'){RcvdCheck = 1;}
if((data == 'C') && (RcvdCheck == 1)){RcvdCheck = 2;}
if((data == 'M') && (RcvdCheck == 2)){RcvdCheck = 3;}
if((data == 'T') && (RcvdCheck == 3)){RcvdCheck = 4;}
if(RcvdCheck == 4){RcvdConf = 1; RcvdCheck = 0;}

if(RcvdConf == 1)
{
if(data == '\n'){RcvdEnd++;}
if(RcvdEnd == 3){RcvdEnd = 0;}
RcvdMsg[index] = data;

index++;
if(RcvdEnd == 2){RcvdConf = 0;MsgLength = index-2;index = 0;}
if(RcvdConf == 0)
{
Serial.print("Mobile Number is: ");
for(int x = 4;x < 17;x++)
{
  MsgMob[x-4] = RcvdMsg[x];
  Serial.print(MsgMob[x-4]);
}
  Serial.println();
  Serial.print("Message Text: ");
for(int x = 46; x < MsgLength; x++)
{
  MsgTxt[x-46] = RcvdMsg[x];
  Serial.print(MsgTxt[x-46]);
}

Serial.println();
Serial.flush();


}
}
}
}

コードの問題は、

最初の SMS を受信した後、携帯電話番号とメッセージ本文を取得しています。その後、送信者番号のみがシリアル モニターに出力されますが、メッセージ本文は出力されません。

どこが間違っているのか。理解できませんでした。

助けてください.......よろしくお願いします。

4

2 に答える 2

0

最初は機能するが、それ以降は機能しない場合は、おそらくいくつかの変数がリセットされていないことが原因です。関数でのみ必要な場合でも、すべての変数をファイルの先頭で宣言しますRecSMS()。宣言を の先頭に移動してみてくださいRecSMS()

void RecSMS() {
  char RcvdMsg[200] = "";
  int RcvdCheck = 0;
  int RcvdConf = 0;
  int index = 0;
  int RcvdEnd = 0;
  char MsgMob[15];
  char MsgTxt[50];
  int MsgLength = 0;

  if(Serial.available()) {

  // Rest of the code goes here
于 2015-08-04T18:40:42.937 に答える
0

ありがとう@マイケル。これで問題も解決すると思います。

コードで見つかった問題は、RecSMS 関数のすべての変数をリセットしていないことです。したがって、これを解決するには、Serial.flush() ステートメントの前に以下のコードを保持してください。

RcvdCheck = 0;
RcvdConf = 0;
index = 0;
RcvdEnd = 0;
MsgMob[15];
MsgTxt[50];
MsgLength = 0;

これで問題は解決します

于 2015-08-06T04:00:09.587 に答える