Как преобразовать форматированный оператор 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
@Simon Markham, 👍4
Обсуждение1 ответ
Лучший ответ:
Для достижения желаемого вы, вероятно, захотите использовать функцию «время форматирования строки» 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
- Преобразование строки в IP-адрес
- Как прочитать входящие ШЕСТНАДЦАТИРИЧНОЕ значение из serial метод read ()?
- Использование c_str() для String для IPAddress с NTPClient дает неправильные значения
- Каков наилучший способ преобразования std::string в строку?
- Предотвращает ли toCharArray создание строки в куче?
- Как я могу отделить значения от полной строки, входящая строка всегда меняет свои позиции?
- Инициализатор ошибок-строка для массива символов слишком длинная с использованием веб-сервера ESP32
- ESP32 Невозможно присвоить значение строке. Получение неправильного значения
Это умно. Как вы заставляете Serial.println реагировать на этот формат?, @Majenko
попробуйте CStringBuilder из StreamLib, @Juraj
@Маженко, это основной пакет ESP32 Arduino., @Juraj
О, тогда с Ардуино ничего общего. Это нестандартный функционал., @Majenko
Лично я бы использовал sprintf() для помещения данных в массив символов, хотя вам придется самостоятельно выполнять форматирование текста (названия дней и т. д.). Или вам могут подойти стандартные функции библиотеки C (а могут и нет)., @Majenko
Вероятно, вызов strftime вызывает перегрузку (http://www.cplusplus.com/reference/ctime/strftime/)., @Maximilian Gerhardt