C++ Adafruit RTClib TimeSpan计算在ESP32上失败

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

我目前正在尝试使用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)
在这种情况下,该条件从未满足。 我遗漏了什么吗?

您的代码行:

  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()值是多少,以回答您的其他问题。这可能是计算剩余
的方式有问题,这是另一个问题。

你是对的。将类型强制转换为字符串或字符数组似乎有效。我认为类型应该与时间戳中的类型相同。谢谢你的回答,你是对的。将类型强制转换为字符串或字符数组似乎有效。我认为类型应该与时间戳中的类型相同。谢谢你的回答。