Некорректные данные GPS у Ai Thinker A9G

Добрый вечер. Делаю GPS трекер с отправлением данных на свой сервер. Имеется: esp32 и Ai Thinker A9G.
Получаю GPS данные с помощью модуля и в нем же отправляю на сервер по HTTP. При просто выводе данных в порт, все отлично. Но если отправлять данные на сервер - данные становятся некорректными. Если я перестаю отправлять их на сервер (просто комментирую строку с вызовом функции, например) - данные снова возвращаются в норму (показывают верные координаты, правильное время).
Если снова включаю отправку - они опять становятся некорректными. Вместо текущих даты/времени показывают 06.01.2080 (иногда постоянно 0 часов 0 минут, иногда время начинает идти). Он показывает верные координаты, но при перемещении модуля они не меняются (такое ощущение, что он их ставит как заглушку, каким то образом запомнив их в тот момент когда данные были верными).
Такое поведение проявляется и при питании от юсб порта компьютера, и при питании от 18650 (как одной для питания есп+модуля так и отдельных для каждого)
В чем может быть проблема? Недостаток питания или что то другое?
Прилагаю код:

#include <MicroNMEA.h>
#include <ArduinoJson.h>
#include <Base64.h>
#include <SoftwareSerial.h>

char buffer[85];
MicroNMEA nmea(buffer, sizeof(buffer));
SoftwareSerial gpsSerial(19, 21);

bool startA9() {
  Serial2.println("AT");
  unsigned long timeout = millis() + 5000; 
  while (millis() < timeout) {
    if (Serial2.find("OK")) {
      return true;
    }
  }
  return false;
}

void sendATs() {
  Serial2.println("AT+GPS=0");
  Serial.println("AT+GPS=0");
  delay(1000);
  while (Serial2.available()) {
    char receivedChar = Serial2.read();
    Serial.write(receivedChar);
  }
  Serial.println();

  Serial2.println("AT+CREG?");
  Serial.println("AT+CREG?");
  delay(1000);
  while (Serial2.available()) {
    char receivedChar = Serial2.read();
    Serial.write(receivedChar);
  }
  Serial.println();

  Serial2.println("AT+CGATT=1");
  Serial.println("AT+CGATT=1");
  delay(1000);
  while (Serial2.available()) {
    char receivedChar = Serial2.read();
    Serial.write(receivedChar);
  }
  Serial.println();

  Serial2.println("AT+CGDCONT=1,\"IP\",\"internet\"");
  Serial.println("AT+CGDCONT=1,\"IP\",\"internet\"");
  delay(1000);
  while (Serial2.available()) {
    char receivedChar = Serial2.read();
    Serial.write(receivedChar);
  }
  Serial.println();

  Serial2.println("AT+CGACT=1,1");
  Serial.println("AT+CGACT=1,1");
  delay(1000);
  while (Serial2.available()) {
    char receivedChar = Serial2.read();
    Serial.write(receivedChar);
  }
  Serial.println();

  Serial2.println("AT+CMHTTPTERM");
  Serial.println("AT+CMHTTPTERM");
  delay(1000);
  while (Serial2.available()) {
    char receivedChar = Serial2.read();
    Serial.write(receivedChar);
  }
  Serial.println();

  Serial2.println("AT+CMHTTPINIT");
  Serial.println("AT+CMHTTPINIT");
  delay(1000);
  while (Serial2.available()) {
    char receivedChar = Serial2.read();
    Serial.write(receivedChar);
  }
  Serial.println();

  Serial2.println("AT+GPS=1");
  Serial.println("AT+GPS=1");
  delay(1000);
  while (Serial2.available()) {
    char receivedChar = Serial2.read();
    Serial.write(receivedChar);
  }
  Serial.println();

  
}

void sendData(String data) {
   
  Serial2.println("AT+CMHTTPSET=\"АДРЕС СЕРВЕРА"+data+"\"");
  Serial.println("AT+CMHTTPSET=\"АДРЕС СЕРВЕРА"+data+"\"");
  delay(1000);
  while (Serial2.available()) {
    char receivedChar = Serial2.read();
    Serial.write(receivedChar);
  }
  Serial.println();

  Serial2.println("AT+CMHTTPGET");
  Serial.println("AT+CMHTTPGET");
  delay(1000);
  while (Serial2.available()) {
    char receivedChar = Serial2.read();
    Serial.write(receivedChar);
  }
  Serial.println();
}

void setup() {
  Serial.begin(9600);
  Serial2.begin(9600);
  gpsSerial.begin(9600);

  while (!startA9()) {
    Serial.println("GSM модуль не отвечает. Перезагрузка...");
    delay(1000);
  }
  sendATs();
}

unsigned long previousMillis = 0;

void loop() {
    while (gpsSerial.available()) {
      char c = gpsSerial.read();
      if (nmea.process(c)) {
          unsigned long currentMillis = millis();
          DynamicJsonDocument jsonDocument(256);
          float latt = nmea.getLatitude();
          float lng = nmea.getLongitude();
          jsonDocument["latt"] = latt/1000000;
          jsonDocument["lng"] = lng/1000000;
          long alt;
          nmea.getAltitude(alt);
          jsonDocument["alt"] = alt;
          jsonDocument["year"] = nmea.getYear();
          jsonDocument["month"] = nmea.getMonth();
          jsonDocument["day"] = nmea.getDay();
          jsonDocument["hour"] = nmea.getHour();
          jsonDocument["minute"] = nmea.getMinute();
          jsonDocument["second"] = nmea.getSecond();
          jsonDocument["course"] = nmea.getCourse();
          jsonDocument["speed"] = nmea.getSpeed();
          float hdop = nmea.getHDOP();
          jsonDocument["HDOP"] = hdop/10;
          jsonDocument["isEnd"] = true;

          String jsonString;
          serializeJson(jsonDocument, jsonString);
        

          if (currentMillis - previousMillis >= 5000) {
            String base64String = base64::encode(jsonString);
            Serial.println(jsonString);

            Serial2.println("AT+GPS=0");
            Serial.println("AT+GPS=0");
            // delay(1000);
            while (Serial2.available()) {
              char receivedChar = Serial2.read();
              Serial.write(receivedChar);
            }
            Serial.println();

            sendData(base64String);

            Serial2.println("AT+GPS=1");
            Serial.println("AT+GPS=1");
            // delay(1000);
            while (Serial2.available()) {
              char receivedChar = Serial2.read();
              Serial.write(receivedChar);
            }
            Serial.println();

            previousMillis = currentMillis;
          } 

      }
    }
}


По схеме подключения: есп и модуль общаются через два RX/TX: один для передачи AT команд, со второго поступают только данные о GPS.

какой именно ESP32?

ESP32 DEVKIT v1

и где там второй сериал, допиливал определения в ядре?

На выводах GPIO 16,17

в упор не вижу )))

#ifndef Pins_Arduino_h
#define Pins_Arduino_h

#include <stdint.h>

static const uint8_t TX = 1;
static const uint8_t RX = 3;

static const uint8_t SDA = 21;
static const uint8_t SCL = 22;

static const uint8_t SS    = 5;
static const uint8_t MOSI  = 23;
static const uint8_t MISO  = 19;
static const uint8_t SCK   = 18;

static const uint8_t A0 = 36;
static const uint8_t A3 = 39;
static const uint8_t A4 = 32;
static const uint8_t A5 = 33;
static const uint8_t A6 = 34;
static const uint8_t A7 = 35;
static const uint8_t A10 = 4;
static const uint8_t A11 = 0;
static const uint8_t A12 = 2;
static const uint8_t A13 = 15;
static const uint8_t A14 = 13;
static const uint8_t A15 = 12;
static const uint8_t A16 = 14;
static const uint8_t A17 = 27;
static const uint8_t A18 = 25;
static const uint8_t A19 = 26;

static const uint8_t T0 = 4;
static const uint8_t T1 = 0;
static const uint8_t T2 = 2;
static const uint8_t T3 = 15;
static const uint8_t T4 = 13;
static const uint8_t T5 = 12;
static const uint8_t T6 = 14;
static const uint8_t T7 = 27;
static const uint8_t T8 = 33;
static const uint8_t T9 = 32;

static const uint8_t DAC1 = 25;
static const uint8_t DAC2 = 26;

#endif /* Pins_Arduino_h */

они есть, но я не нашел какой модуль в IDE выбрать где они прописаны, значит на 16 и 17 у тебя поднимается софтовый сериал (ИМХО), отсюда и проблемы
PS проверил, добавил определение пинов, код не изменился ни на байт, значит проблема в чёи то другом и я заблуждался
PPS может просто скорости на портах не хватает?

Что имеешь в виду под не хватает скорости на портах? Не совсем понимаю.

9600 на хардовых, может поднять?

Попробую. По результатам отпишу

Объявление:
HardwareSerial S2Serial ( 2 );

В сетапе:
S2Serial.begin( 9600 , SERIAL_8N1, 16, 17 ); // pin16 RX, pin17 TX

В принципе можно любые ноги объявить и будет хардовый сериал на любых ногах.

Попробовал поднять. Использовал 115200 и 19200. Модуль общается AT командами, но почему то перестает принимать GPS сигнал

Сейчас по какой то причине совсем перестал выдавать нормальные данные, даже при отключенной отправке. Но при подключении модуля напрямую через TTL адаптер все данные верны (смотрю через ublox u-center) - координаты правильные, дата/время тоже. Скриншот софта прилагается

Верные данные поймал секунд через 10-15 после включения GPS (при подключении через есп минут 5 работал и ловил неправильные данные)
P.S. при подключении через TTL верные данные он показывает всегда