Почему я не смог прочитать другие полученные смс кроме первого смс?
Я должен прочитать входящее SMS на моем модуле gsm SIM900 (который подключен к Arduino), и я хочу напечатать номер отправителя и сообщение на последовательном мониторе.
Сначала я настраиваю модуль gsm с помощью AT-команд, а функция Response() дает мне ответ на AT-команды.
как и любое смс будет по следующей схеме
+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 я получаю свой номер мобильного телефона и текст сообщения. После этого я получаю только номер отправителя, напечатанный на моем последовательном мониторе, но не тело сообщения.
Где это пошло не так. Я не мог понять.
Пожалуйста, помогите мне....... Спасибо заранее.
2 ответа
Если это работает в первый раз, но не в последующие, это, вероятно, связано с тем, что некоторые переменные не сбрасываются. Вы объявляете все свои переменные в начале файла, даже если они нужны только в 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
Спасибо @Майкл. Я думаю, что это также решает проблему.
Проблема, которую я обнаружил в коде, заключается в том, что мы не сбрасываем все переменные в функции RecSMS. Поэтому для решения этой проблемы сохраните приведенный ниже код перед оператором Serial.flush().
RcvdCheck = 0;
RcvdConf = 0;
index = 0;
RcvdEnd = 0;
MsgMob[15];
MsgTxt[50];
MsgLength = 0;
Это решит проблему