Как преобразовать форматированный оператор print в строковую переменную?

Я использую следующую процедуру для вывода текущего времени на COM-порт. Я хотел бы записать это в виде строки, чтобы можно было отобразить ее с помощью ePaper.

    void printLocalTime()
    {
      time_t rawtime;
      struct tm timeinfo;
      if(!getLocalTime(&timeinfo))
      {
        Serial.println("Failed to obtain time");
       return;
      }
     Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
    }

производит -

Суббота, 12 мая 2018 г., 12:18:27

, 👍4

Обсуждение

Это умно. Как вы заставляете Serial.println реагировать на этот формат?, @Majenko

попробуйте CStringBuilder из StreamLib, @Juraj

@Маженко, это основной пакет ESP32 Arduino., @Juraj

О, тогда с Ардуино ничего общего. Это нестандартный функционал., @Majenko

Лично я бы использовал sprintf() для помещения данных в массив символов, хотя вам придется самостоятельно выполнять форматирование текста (названия дней и т. д.). Или вам могут подойти стандартные функции библиотеки C (а могут и нет)., @Majenko

Вероятно, вызов strftime вызывает перегрузку (http://www.cplusplus.com/reference/ctime/strftime/)., @Maximilian Gerhardt


1 ответ


Лучший ответ:

8

Для достижения желаемого вы, вероятно, захотите использовать функцию «время форматирования строки» strftime (документы ). Вы должны записать результат в символьный буфер, который также можно распечатать напрямую, без необходимости преобразования его в объект String.

Итак, следующий код должен работать:

void printLocalTime()
{
  time_t rawtime;
  struct tm timeinfo;
  if(!getLocalTime(&timeinfo))
  {
    Serial.println("Failed to obtain time");
   return;
  }
  char timeStringBuff[50]; //50 символов должно быть достаточно
  strftime(timeStringBuff, sizeof(timeStringBuff), "%A, %B %d %Y %H:%M:%S", &timeinfo);
  //печатаем как "const char*"
  Serial.println(timeStringBuff);

  //Необязательно: создать объект String
  String asString(timeStringBuff);
}

Перегрузка для Serial.print также выполняет то же самое:

size_t Print::print(struct tm * timeinfo, const char * format)
{
    const char * f = format;
    if(!f){
        f = "%c";
    }
    char buf[64];
    size_t written = strftime(buf, 64, f, timeinfo);
    print(buf);
    return written;
}
,

Отлично, кроме '&time_info);' должно быть &timeinfo);, Как раз то, к чему я стремился и чего не хватало., @Simon Markham

@SimonMarkham исправлено, спасибо, что заметили., @Maximilian Gerhardt