Модуль читает построково файл лога и отображает значения на дисплее в определенном порядке

C++
void graph_log() // Функция вывода лога в графическом представлении
{
  File logFile_graph = SD.open("/log.txt", FILE_READ);
  if (logFile_graph)
  {
    int sum_line = countLinesInFile(logFile_graph); // 1334
    //Serial.print("countLinesInFile: ");
    //Serial.println(sum_line);
    logFile_graph.seek(pos_graf_log); // Перемещаем указатель файла на последнюю позицию чтения
    char value_3_str[16];             // массив символов для хранения value_3_str
    int value_4 = 0;
    int currentLine = 0;
    String data_graph, time_graph;
    // Читаем XXX(100) значений из файла и выводим их в порт
    // logFile_graph.seek(0); // Сбросить указатель на начало файла перед чтением
    // for (int i = 0; i < sum_line; i++)
    for (int i = 0; i < 300; i++)
    {
      if (logFile_graph.available())
      {
        String line = logFile_graph.readStringUntil('\n');
        int pos_4 = 0;
        for (int j = 0; j < 4; j++)
        {
          pos_4 = line.indexOf(';', pos_4) + 1;
        }
        value_4 = line.substring(pos_4, line.indexOf(';', pos_4)).toInt();
        currentLine++; // увеличиваем значение текущей строки
        if (i == 0)
        {
          curve_ch_2[12] = highByte(value_4 + 200);
          curve_ch_2[13] = lowByte(value_4 + 200);
          Serial2.write(curve_ch_2, 14);
          int sep_idx = line.indexOf(';'); // Разбираем строку по разделителю ;
          data_graph = line.substring(sep_idx + 2, sep_idx + 12);
          time_graph = line.substring(sep_idx + 14, sep_idx + 22);
          char start_date[19] = {0x5a, 0xa5, 0x0E, 0x82, 0x68, 0x1E};
          data_graph.toCharArray(&start_date[6], 10 + 1, 0);
          Serial2.write(start_date, sizeof(start_date));
          char start_time[19] = {0x5a, 0xa5, 0x0E, 0x82, 0x68, 0x2A};
          time_graph.toCharArray(&start_time[6], 10 + 1, 0);
          Serial2.write(start_time, sizeof(start_time));
        }
        //if (i == sum_line - 1)
        if (i == 300 - 1 || i == sum_line)
        {
          curve_ch_2[12] = highByte(value_4 + 200);
          curve_ch_2[13] = lowByte(value_4 + 200);
          Serial2.write(curve_ch_2, 14);
          int sep_idx = line.indexOf(';'); // Разбираем строку по разделителю ;
          data_graph = line.substring(sep_idx + 2, sep_idx + 12);
          time_graph = line.substring(sep_idx + 14, sep_idx + 22);
          char start_date[19] = {0x5a, 0xa5, 0x0E, 0x82, 0x68, 0x36};
          data_graph.toCharArray(&start_date[6], 10 + 1, 0);
          Serial2.write(start_date, sizeof(start_date));
          char start_time[19] = {0x5a, 0xa5, 0x0E, 0x82, 0x68, 0x42};
          time_graph.toCharArray(&start_time[6], 10 + 1, 0);
          Serial2.write(start_time, sizeof(start_time));
        }
        else
        {
          curve_ch_2[12] = highByte(value_4 + 200);
          curve_ch_2[13] = lowByte(value_4 + 200);
          Serial2.write(curve_ch_2, 14);
        }
        pos_graf_log = logFile_graph.position(); // Сохраняем позицию последнего прочитанного символа
      }
      else
      {
        pos_graf_log = 0; // Возвращаем указатель на начало файла, если достигнут конец
        logFile_graph.seek(pos_graf_log);
      }
      if (currentLine >= sum_line)
      {
       // Достигнут конец файла, переходим в начало
        currentLine = 0;
      }
    }
    logFile_graph.close();
  }
  else
  {
    Serial.println("Failed to open log file");
  }
}