Почему я не могу прочитать другие смс, кроме первого смс?
Мне нужно прочитать входящее SMS на моем GSM-модуле SIM900, и я хочу распечатать номер отправителя и сообщение на последовательном мониторе.
Сначала я настраиваю модуль 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() // Эта функция настраивает наш модуль SIM900, т.е. отправляет начальные AT-команды
{
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() // Получаем ответ каждой AT-команды
{
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() // Получение SMS и извлечение номера мобильного телефона отправителя & Текст сообщения
{
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 я получаю номер своего мобильного телефона и текст сообщения. После этого я получаю только номер отправителя, напечатанный на моем последовательном мониторе, но не тело сообщения.
Где что-то пошло не так. Я не мог понять.
Пожалуйста, помогите мне....... Заранее спасибо.
@NShiva, 👍0
Обсуждение2 ответа
Лучший ответ:
Похоже, RcvdEnd
никогда не сбрасывается до нуля, потому что RcvdConf
устанавливается равным нулю, когда RcvdEnd
равен 2, что означает, что он никогда не будет доберитесь до 3 и сбросьте его (по крайней мере, не тогда, когда вы этого ожидаете). Я не уверен, сколько новых строк вы должны проверять, но то, как это настроено сейчас, или ищет две в первом сообщении и три для каждого сообщения после этого. Возможно, вы захотите переработать логику и, возможно, изменить место, где это значение сбрасывается.
{
MsgTxt[x-46] = RcvdMsg[x];
Serial.print(MsgTxt[x-46]);
}
RcvdEnd =0;
Serial.println();
Serial.flush();
Возможно, вы хотели бы отредактировать свой ответ, чтобы объяснить *почему* вы думаете, что это отвечает на вопрос., @sempaiscuba
- SIM800L GSM-модуль, нет сигнала сети RSSI
- Как запрограммировать nodeMCU через OTA с помощью GPRS?
- Можно ли использовать GSM и Data Logger Shield одновременно на одном Arduino?
- Как отправить сообщение на мой телефон, что моя система Arduino включена при включении моего Arduino
- Разделить вывод последовательного монитора, чтобы сохранить только часть вывода
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Печать string and integer LCD
- Почему мои часы реального времени показывают неверное время с моего ПК?
Можете ли вы предоставить мне этот код, если вы нашли решение для своей ошибки. Это будет очень важно для моего проекта в колледже. Спасибо за Вашу поддержку!, @Prerak Shah