Adafruit RTClib TimeSpan 计算在 ESP32 上失败
Adafruit RTClib TimeSpan calculation fails on ESP32
我目前正在尝试使用 Adafruit 的 RTClib library 测量给定时间戳之前的剩余时间。我的 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)
在这种情况下,条件永远不会满足。
我错过了什么吗?
你的代码行:
Serial.println(String("remaining time: " + remaining.minutes()));
没有按照您的想法去做。
remaining.minutes()
returns type int8_t
不输入 String
。您将它添加到指向 C 字符串的 C 字符指针 remaining time:
- 如果该值大于该字符串的长度,则生成的指针无效,您很幸运您的程序没有崩溃。
例如,如果 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()
方法returns a String
,因此向其添加C字符串导致字符串连接而不是向字符指针添加整数。
在这两种情况下,您对 String()
的封闭调用是多余的,应该避免:
Serial.println("current time: " + rtc.now().timestamp());
Serial.println("targetTime: " + next.depart.timestamp());
您已经在计算 String
个值;无需从中创建新的 String
对象。
找出 remaining.minutes()
的值,以便回答您的其他问题。 remaining
的计算方式可能存在问题,并且是不同问题的问题。
我目前正在尝试使用 Adafruit 的 RTClib library 测量给定时间戳之前的剩余时间。我的 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)
在这种情况下,条件永远不会满足。 我错过了什么吗?
你的代码行:
Serial.println(String("remaining time: " + remaining.minutes()));
没有按照您的想法去做。
remaining.minutes()
returns type int8_t
不输入 String
。您将它添加到指向 C 字符串的 C 字符指针 remaining time:
- 如果该值大于该字符串的长度,则生成的指针无效,您很幸运您的程序没有崩溃。
例如,如果 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()
方法returns a String
,因此向其添加C字符串导致字符串连接而不是向字符指针添加整数。
在这两种情况下,您对 String()
的封闭调用是多余的,应该避免:
Serial.println("current time: " + rtc.now().timestamp());
Serial.println("targetTime: " + next.depart.timestamp());
您已经在计算 String
个值;无需从中创建新的 String
对象。
找出 remaining.minutes()
的值,以便回答您的其他问题。 remaining
的计算方式可能存在问题,并且是不同问题的问题。