#c #esp32 #real-time-clock
#c #esp32 #часы реального времени
Вопрос:
В настоящее время я пытаюсь измерить оставшееся время до заданной метки времени, используя библиотеку RTClib Adafruit. Мой модуль RTC — это DS3231. вот мой объект TimeSpan в коде:
TimeSpan remaining = next.depart - rtc.now();
Однако, когда я пытаюсь распечатать оставшиеся минуты, я не получаю данных.
Вот мой код, который выводит результат:
Serial.println(String("current time: " rtc.now().timestamp()));
Serial.println(String("targetTime: " next.depart.timestamp()));
Serial.println(String("remaining time: " remaining.minutes()));
И вывод правильный, за исключением оставшегося времени в минутах:
current time: 2020-12-06T05:38:55
target time: 2020-12-06T05:42:30
aining time:
Обратите внимание, что последняя строка обрезается в последовательном выводе, а оставшиеся минуты не отображаются. текущее и целевое время указаны в показаниях правильно.
Я также не могу выполнять какие-либо операции с оставшимся временем:
if(remaining.minutes() >= 10)
В этом случае условие никогда не выполняется.
Я что-то упустил?
Ответ №1:
Ваша строка кода:
Serial.println(String("remaining time: " remaining.minutes()));
делает не то, что вы думаете, что он делает.
remaining.minutes()
возвращает тип int8_t
, а не тип String
. Вы добавляете его к указателю символа C на строку remaining time:
C — если значение больше длины этой строки, то результирующий указатель недействителен, и вам повезло, что ваша программа не вылетает.
Например, если remaining.minutes()
бы было 3, то ваш результат был бы:
aining time:
Вместо этого ваш код должен выглядеть примерно так:
Serial.println("remaining time: " String(remaining.minutes()));
или лучше:
Serial.print("remaining time: ");
Serial.println(remaining.minutes());
Преимущество второй формы заключается в том, что она позволяет избежать ненужных String
экземпляров объектов и выделения памяти.
Причина, по которой ваши две строки:
Serial.println(String("current time: " rtc.now().timestamp()));
Serial.println(String("targetTime: " next.depart.timestamp()));
работа заключается в том, что timestamp()
метод возвращает a String
, поэтому добавление к нему символьной строки C приводит к конкатенации строк, а не к добавлению целого числа к символьному указателю.
В этих двух случаях ваш заключающий вызов String()
является излишним, и его следует избегать:
Serial.println("current time: " rtc.now().timestamp());
Serial.println("targetTime: " next.depart.timestamp());
Вы уже вычисляете String
значения; нет необходимости создавать String
из них новые объекты.
Узнайте, какое значение remaining.minutes()
имеет, чтобы ответить на ваш другой вопрос. Вероятно, это проблема со способом remaining
вычисления, и это вопрос для другого вопроса.
Комментарии:
1. Вы были правы. Похоже, что приведение типа к строке или массиву символов работает. Я думал, что тип будет таким же, как в метке времени. Спасибо за ваш ответ.