Модуль 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.

, 👍1

Обсуждение

Что делает ваша функция gprsterm()? Но что еще более важно, проверьте, как вы используете прерывания, пожалуйста, проконсультируйтесь, как использовать [attachInterrupt() на arduino.cc](https://www.arduino.cc/en/Reference/AttachInterrupt), @jogco

добавлена функция gprsterm. Я удалил прерывание и дважды вызвал функцию кода внутри цикла. первый раз получил правильный результат. второй раз неправильный результат. поэтому прерывание, кажется, не вызывает проблемы., @Suri

Проверьте функцию getGPS(). Особенно использование локальных переменных String. Может там что-то найдете :), @Mikael Patel

Я проверил локальную строковую переменную, все хорошо означает, что она инициализирована пустой строкой, а затем данными. интересная вещь, которую я обнаружил, заключается в том, что у меня дома он каждый раз дает правильные результаты, но в офисе он показывает неправильное местоположение при втором вызове местоположения,, @Suri


2 ответа


-1
Serial.println("location = " + location);

Я думаю, что в верхней строке вы должны удалить знак + из кода.

,

1

Возможно, это связано с тем, что команда указывает местоположение ближайшей вышки сотовой связи. А для отправки SMS может потребоваться переход на другую вышку сотовой связи в зависимости от вашей сети. Это может быть легко проверено с помощью другого оператора сотовой связи или, как вы сказали, он работает у вас дома, поэтому я считаю, что я прав, предполагая, что это ответ

,