C++ Adafruit RTClib TimeSpan计算在ESP32上失败
我目前正在尝试使用Adafruit的方法测量给定时间戳之前的剩余时间。我的RTC模块是DS3231。 以下是代码中的TimeSpan对象:C++ Adafruit RTClib TimeSpan计算在ESP32上失败,c++,esp32,real-time-clock,C++,Esp32,Real Time Clock,我目前正在尝试使用Adafruit的方法测量给定时间戳之前的剩余时间。我的RTC模块是DS3231。 以下是代码中的TimeSpan对象: TimeSpan remaining = next.depart - rtc.now(); 然而,当我试图打印剩余的分钟数时,我没有得到任何数据。 以下是我打印输出的代码: Serial.println(String("current time: " + rtc.now().timestamp())); Serial.print
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()
不键入String
。您正在将其添加到指向C字符串的C字符指针剩余时间:
-如果该值大于该字符串的长度,则生成的指针无效,您很幸运您的程序没有崩溃
例如,如果remaining.minutes()
为3,则输出为:
aining time:
相反,您的代码应该更像这样:
Serial.println("remaining time: " + String(remaining.minutes()));
或者更好:
Serial.print("remaining time: ");
Serial.println(remaining.minutes());
第二种形式的好处是避免不必要的字符串对象实例化和分配内存
您选择这两行的原因是:
Serial.println(String("current time: " + rtc.now().timestamp()));
Serial.println(String("targetTime: " + next.depart.timestamp()));
工作是使用timestamp()
方法,因此向其中添加C字符串将导致字符串串联,而不是向字符指针添加整数
在这两种情况下,对String()
的封闭调用是多余的,应该避免:
Serial.println("current time: " + rtc.now().timestamp());
Serial.println("targetTime: " + next.depart.timestamp());
您已经在计算String
值;无需从中创建新的String
对象
找出剩余的.minutes()值是多少,以回答您的其他问题。这可能是计算剩余的方式有问题,这是另一个问题。您的代码行:
Serial.println(String("remaining time: " + remaining.minutes()));
不是在做你认为它在做的事
remaining.minutes()
不键入String
。您正在将其添加到指向C字符串的C字符指针剩余时间:
-如果该值大于该字符串的长度,则生成的指针无效,您很幸运您的程序没有崩溃
例如,如果remaining.minutes()
为3,则输出为:
aining time:
相反,您的代码应该更像这样:
Serial.println("remaining time: " + String(remaining.minutes()));
或者更好:
Serial.print("remaining time: ");
Serial.println(remaining.minutes());
第二种形式的好处是避免不必要的字符串对象实例化和分配内存
您选择这两行的原因是:
Serial.println(String("current time: " + rtc.now().timestamp()));
Serial.println(String("targetTime: " + next.depart.timestamp()));
工作是使用timestamp()
方法,因此向其中添加C字符串将导致字符串串联,而不是向字符指针添加整数
在这两种情况下,对String()
的封闭调用是多余的,应该避免:
Serial.println("current time: " + rtc.now().timestamp());
Serial.println("targetTime: " + next.depart.timestamp());
您已经在计算String
值;无需从中创建新的String
对象
找出剩余的.minutes()值是多少,以回答您的其他问题。这可能是计算剩余的方式有问题,这是另一个问题。你是对的。将类型强制转换为字符串或字符数组似乎有效。我认为类型应该与时间戳中的类型相同。谢谢你的回答,你是对的。将类型强制转换为字符串或字符数组似乎有效。我认为类型应该与时间戳中的类型相同。谢谢你的回答。