Модуль SIM808: команда определения местоположения GSM (AT+CIPGSMLOC=1,1) дает неверное значение после выполнения команды отправки сообщения (AT+CMGS=+91xxxxxxxx)
Я написал код, который, если генерируется прерывание, получает местоположение GSM и отправляет сообщение.
При первой генерации прерывания я получил правильное местоположение GSM, используя AT+CIPGSMLOC=1,1
, и успешно отправил сообщение, используя AT+CMGS=+91xxxxxxxx
команда.
Но в следующий раз, когда было сгенерировано прерывание, AT+CIPGSMLOC=1,1
указал неверное местоположение. Когда я закомментировал код для отправки сообщения, при каждом сгенерированном прерывании я получаю правильное местоположение GSM. Таким образом, похоже, что проблема возникает после отправки сообщения. Но я понятия не имею, что именно идет не так. Ниже приведен мой код.
Примечание: при перезапуске модуля я снова получаю правильное местоположение в первый раз перед отправкой сообщения.
void setup() {
mySerial.begin(9600);
Serial.begin(9600);
while (!Serial) {
}
// инициализируем контакт кнопки как вход:
pinMode(sensorPin, INPUT);
// Прикрепляем прерывание к вектору ISR
attachInterrupt(0, pin_ISR, FALLING);
}
/////////***ОТВЕТ GSM***///////////
String DisplayGSMResponse() {
if(mySerial.available()) {
String gsm_input="";
while(mySerial.available()) {
gsm_input+= (char)mySerial.read();
}
gsm_input.trim();
delay(1000);
Serial.println(gsm_input);
return gsm_input;
}
}
void SendMessage(String mobNum,String Location) {
Serial.println("Sending message..");
mySerial.println("AT+CMGF=1");
// Устанавливает модуль GSM в текстовый режим
delay(2000);
// Задержка 1000 миллисекунд или 1 секунда
DisplayGSMResponse();
mySerial.println("AT+CMGS=\""+mobNum+"\"\r");
// номер мобильного телефона
delay(4000);
DisplayGSMResponse();
cleanBuffer();
mySerial.print("test");
// Текст SMS, который вы хотите отправить
delay(100);
mySerial.println((char)26);
// ASCII-код CTRL+Z
delay(8000);
DisplayGSMResponse();
}
void gprsInit() {
if (isGPRSInit) {
return;
}
Serial.println("GPRS INITIALIZING");
mySerial.println("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"");
delay(2000);
DisplayGSMResponse();
mySerial.println("AT+SAPBR=3,1,\"APN\",\"INTERNET\"");
delay(2000);
DisplayGSMResponse();
mySerial.println("AT+SAPBR=1,1");
delay(8000);
DisplayGSMResponse();
mySerial.println("AT+SAPBR=2,1");
delay(2000);
DisplayGSMResponse();
isGPRSInit = true;
}
void gprsterm() {
mySerial.println("AT+SAPBR=0,1");
delay(1000);
DisplayGSMResponse();
isGPRSInit = false;
}
String getGPS() {
Serial.println("GETTING GPS LOCATION");
String loc = "";
String location = "";
mySerial.println("AT+CIPGSMLOC=1,1");
delay(3000);
loc = DisplayGSMResponse();
return location;
}
void loop() {
if (buttonState == 1) {
detachInterrupt(0);
gprsInit();
location = getGPS();
SendMessage(mobileNumber, location);
gprsterm();
Serial.println("location = " + location);
buttonState = 0;
location = "";
attachInterrupt(0, pin_ISR, FALLING );
}
}
void pin_ISR() {
buttonState = 1;
Serial.println("interrupt");
}
EDIT: добавлена функция gprsterm.
Примечание. Я удалил прерывание и дважды вызвал код внутри функции цикла. Первый раз получил правильный результат. Второй раз неправильный результат. Таким образом, похоже, что проблема не в прерывании.
EDIT2:
Одна интересная вещь, которую я обнаружил, заключается в том, что у меня дома он каждый раз показывает правильные результаты, но в офисе он показывает неправильное местоположение при втором вызове местоположения, т.е. после того, как SMS было отправлено, и мы получаем местоположение GSM, используя AT+ CIPGSMLOC=1,1
.
@Suri, 👍1
Обсуждение2 ответа
Serial.println("location = " + location);
Я думаю, что в верхней строке вы должны удалить знак +
из кода.
Возможно, это связано с тем, что команда указывает местоположение ближайшей вышки сотовой связи. А для отправки SMS может потребоваться переход на другую вышку сотовой связи в зависимости от вашей сети. Это может быть легко проверено с помощью другого оператора сотовой связи или, как вы сказали, он работает у вас дома, поэтому я считаю, что я прав, предполагая, что это ответ
- Arduino Mega + SIM808 GSM + модуль GPS + программа включается без нажатия кнопки?
- Как извлечь широту и долготу из GPS
- Можно ли изменить официальную библиотеку шилдов arduino GSM для работы с аппаратным serial на mega?
- Соединение AI A7 Thinker с Arduino
- Как подключить SIM7100A к Arduino?
- Как разделить входящую строку?
- Как отправить команду AT на sim800l с помощью SoftwareSerial
- Какова максимальная длина провода для последовательной связи между двумя Arduino?
Что делает ваша функция gprsterm()? Но что еще более важно, проверьте, как вы используете прерывания, пожалуйста, проконсультируйтесь, как использовать [attachInterrupt() на arduino.cc](https://www.arduino.cc/en/Reference/AttachInterrupt), @jogco
добавлена функция gprsterm. Я удалил прерывание и дважды вызвал функцию кода внутри цикла. первый раз получил правильный результат. второй раз неправильный результат. поэтому прерывание, кажется, не вызывает проблемы., @Suri
Проверьте функцию getGPS(). Особенно использование локальных переменных String. Может там что-то найдете :), @Mikael Patel
Я проверил локальную строковую переменную, все хорошо означает, что она инициализирована пустой строкой, а затем данными. интересная вещь, которую я обнаружил, заключается в том, что у меня дома он каждый раз дает правильные результаты, но в офисе он показывает неправильное местоположение при втором вызове местоположения,, @Suri