У меня есть программная последовательная связь между Arduino Uno и GSM-модулем TC35 для отправки и получения SMS-сообщений. Отправка SMS / вызовов не является проблемой, так как это вопрос отправки соответствующей AT-команды в модуль GSM. Однако я хочу использовать команду AT + CMGR = 1 (которая проверяет первое SMS-сообщение, сохраненное на SIM-карте), чтобы проверить, есть ли какие-либо сообщения, и сохранить сообщение в виде массива char, чтобы я мог затем проверить, содержит ли SMS слово «включен» или «выключен», чтобы активировать светодиод.
Команда 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);
}
Я не понимаю ваше намерение сделать это:
if(data[x-1]==0x0D&&data[x-2]=='"'){
x=0;
}
Похоже, что вы отбрасываете свои данные и читаете новые данные всякий раз, когда попадаете в строку, содержащую завершающую кавычку и новую строку. Таким образом, ответ на интересующую команду отбрасывается. Я не проверял это, но я думаю, что это сработает, если вы удалите эти три строки.
Я должен также упомянуть, что [x-1]
а также [x-2]
ссылаются на память до data
буфер. Это очень плохая практика, которая может и приведет к неопределенному поведению. Вы должны проверять индекс только за вычетом некоторого значения, когда результат этого вычисления будет положительным значением. Отрицательный индекс массива будут доступ к памяти до начала массива.
Других решений пока нет …