How can I reliably get GPS, ADC, and LoRa values ​​without breaking down?

The individual behavior now works well. However, if all sources are integrated and activated, it will stop in only 4 seconds.

In short,
GPS values are extracted and stored once a second. (GPS_SaveBuffer)
The LoRa value is obtained by extracting the extracted value from the command value. (LoRa_SaveBuffer)
Then, the timer integrates all of this data once every 2 seconds, and outputs it to serial0 and serial2 (LoRa) in sequence along with the RTC time value
and I have saved sensor values in SDCARD.

However, the values are always output in serial0 and break down in 4 seconds.
I removed all String characters type for optimization and prevented the delay function in the timer function.
The guess is that when gps and lora extract text values for two seconds in the loop statement
It seems that memory is overflowed because it does too much work.

If the guess is correct, how can I reliably receive text characters?

Here is a code summary:

#include <DueTimer.h>
#include <Wire.h>
#include <ADS1115.h>
#include <SPI.h>
#include <SD.h>
#include "RTClib.h"

void setup() {
Serial.begin(115200);  // Debug
Serial1.begin(9600);    // GPS
Serial2.begin(9600);    // LoRa
.
.

Timer4.attachInterrupt(SENSOR_DISPLAY).start(2000000);
.
.

}
void loop() {
   LoRa_SaveBuffer();
   GPS_SaveBuffer();    
   ADS1115_SaveBuffer();
} // loop 

void SENSOR_DISPLAY(){
  DateTime now = rtc.now();
  char tempDisp[200] = "";

  sprintf(tempDisp, "%d %.2f %.2f %.2f %.2f %.2f %d %d %d %d %d %d %d %d %d %d %.5f %.5f %d %d %d %d %d %d %d %d %d %d %d \r\n", 
  now.unixtime(), get3231Temp()
  , InputVoltage3Result, InputVoltage5Result, InputVoltage12Result, InputVoltage24Result, averageDoor_average_value, maxErrTotalCount
  , ADS1115_str[0] , ADS1115_str[1], ADS1115_str[2] , ADS1115_str[3], ADS1115_str[4] , ADS1115_str[5], ADS1115_str[6] , ADS1115_str[7]
  , FINAL_GPS_VALUE[0], FINAL_GPS_VALUE[1], LoRaParameter[0], LoRaParameter[1], LoRaParameter[2], LoRaParameter[3], LoRaParameter[4]
  , LoRaParameter[5], LoRaParameter[6], LoRaParameter[7], LoRaParameter[8], LoRaParameter[9], LoRaParameter[10]);
   
  // Most of the variables in the above sprintf function are global variables.
 

  Serial.print(tempDisp);
  Serial2.write(TbupcLoRa1);
  Serial2.write(tempDisp);
  Serial2.write('\n');
  SDCARD_LOGDATA(now.year(),now.month());
}

void LoRa_SaveBuffer(){
  static boolean recvInProgress = false;
    static byte ndx = 0;
    char startMarker = 'D';
    char endMarker = '\n';
    char rc;
    Serial2.println("AT_PARAMETER_CALL");
    while (Serial2.available() > 0 && newData == false) {
        rc = Serial2.read();

        if (recvInProgress == true) {
            if (rc != endMarker) {
                receivedChars[ndx] = rc;
                ndx++;
                if (ndx >= numChars) {
                    ndx = numChars - 1;
                }
            }
            else {
                receivedChars[ndx] = '\0'; // terminate the string
                recvInProgress = false;
                ndx = 0;
                newData = true;                
            }
        }

        else if (rc == startMarker) {
            recvInProgress = true;
        }
    }

    if (newData == true ) {     
       if(receivedChars[3] == 'e' && receivedChars[4] == 'v'){   
        LoRaParameter[0]= receivedChars[15] - '0';
       }
.
.
.
        
       else if(receivedChars[9] == 'e' && receivedChars[10] == 'p'){ 
        LoRaParameter[9] = checkDigit(receivedChars,23,27);
       } 
       else if(receivedChars[3] == 'p' && receivedChars[4] == 'l'){
        if(receivedChars[16] == 'T'){
          LoRaParameter[10] = 0;
          LoRaParameter_oneTime=false;
        }else if(receivedChars[16] == 'M'){
          LoRaParameter[10] = 1;
          LoRaParameter_oneTime=false;   
        }         
       }else{
         
       }
 
      newData = false;
      
    }
}

void GPS_SaveBuffer(){
    static boolean recvInProgress = false;
    static byte ndx = 0;
    char startMarker = '

;
   char endMarker = ’


;
    char rc;
    
    while (Serial1.available() > 0 && newData == false) {
        rc = Serial1.read();

        if (recvInProgress == true) {
            if (rc != endMarker) {
                receivedChars[ndx] = rc;
                ndx++;
                if (ndx >= numChars) {
                    ndx = numChars - 1;
                }
            }
            else {
                receivedChars[ndx] = '\0'; // terminate the string
                recvInProgress = false;
                ndx = 0;
                newData = true;                
            }
        }

        else if (rc == startMarker) {
            recvInProgress = true;
        }
    }
    
       
    if ((newData == true) ) { 
       String GPS_TEMP_VALUE ="";     
       if(receivedChars[1] == 'P'
       && receivedChars[2] == 'G' &&receivedChars[3] == 'G'
       && receivedChars[4] == 'A'){
        for(int i = 0 ; i < 45 ; i++){
          GPS_TEMP_VALUE += receivedChars[i];
        }
        int gps00 = GPS_TEMP_VALUE.indexOf(",");
        int gps01 = GPS_TEMP_VALUE.indexOf(",",gps00+1); 
        int gps02 = GPS_TEMP_VALUE.indexOf(",",gps01+1);
        int gps03 = GPS_TEMP_VALUE.indexOf(",",gps02+1); 
        int gps04 = GPS_TEMP_VALUE.indexOf(",",gps03+1); 
        FINAL_GPS_VALUE[0] = GPS_TEMP_VALUE.substring(gps01, gps02).toFloat(); 
        FINAL_GPS_VALUE[1] = GPS_TEMP_VALUE.substring(gps03, gps04).toFloat(); 
       } 
      newData = false;         
    }
}

void ADS1115_SaveBuffer(){
    byte error1;
    int8_t address1;
    address1 = ads1.ads_i2cAddress;
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    
    Wire.beginTransmission(address1);
    Wire.beginTransmission(address2);
    error1 = Wire.endTransmission();
    
    if (error1 == 0 )
    {
        ADS1115_str[0] = ads1.Measure_SingleEnded(0);   
        ADS1115_str[1] = ads1.Measure_SingleEnded(1);        
        ADS1115_str[2] = ads1.Measure_SingleEnded(2);
        ADS1115_str[3] = ads1.Measure_SingleEnded(3);
    }
    else
    {
        Serial.println("ADS1115 Disconnected!");
    }
}