在我的main.cpp
文件中,我调用了一个类的构造函数。在构造函数中,我从一些静态函数中设置了这个类的变量。所有的问题都是关于从 NTP 服务器设置时间。
作为 getter 的静态函数使用while
循环来检查标志。如果未设置时间,则该标志为假,如果 NTP 服务器至少有一次响应,则该标志为真。如果标志为假,则while
循环必须尝试永远获取时间(因为没有理由在没有时间的情况下继续),如果为真,则返回时间。
正如我所说的,构造函数通过调用 getter 来设置变量。
当我在 main 中声明该类的对象时,程序没有运行,因为我在串行打印上什么也没得到。如果我评价它的声明,它会起作用。此外,它不像卡在里面,while
因为我在里面放了一个串行打印,它也没有出现。我给出下面的代码:
构造函数:
#import "DayTime.h"
#include "NTP.h"
DayTime::DayTime(){
hour = NTP::getLCThour();
minutes = NTP::getMin();
seconds = NTP::getSec();
}
main.cpp
文件:
#include <Arduino.h>
#include <SPI.h>
#include "NTP.h"
#include "DayTime.h"
#include "DayNumber.h"
DayTime DT;
DayNumber DN;
int main(void)
{
init();
setup();
for (;;)
loop();
return 0;
}
void setup() {
Serial.begin(9600);
NTP::startEthernetAndUdp();
}
void loop() {
NTP::getTime();
// Serial.println(DT.hour);
// Serial.println(DT.getTimeToDec());
delay(3000);
如果我注释了名为 DT 的 DayTime 对象的声明,那么 getTime 函数在这里起作用。
NTP.cpp 部分:
1)第一个吸气剂:
int NTP::getLCThour(){
while(timeNTPSet==false){
Serial.print("kolaw");
getTime();
}
return lcthour;
}
2) 标头上的标志声明:
static bool timeNTPSet;
这是一个公共变量。
3)它在.cpp文件开头的定义:
bool NTP::timeNTPSet= false;
这是在包含后的 .cpp 文件中设置的。
最后将标志设置为 true 的函数的一部分:
NTP NTP::getTime(){
if (testNtpServer()){
timeNTPSet = true;
// We've received a packet, read the data from it
Udp.read((unsigned char*)packetBuffer, NTP_PACKET_SIZE);
testNTPServer 函数仅测试 3-4 个不同的 NTP 服务器,以便从至少一个服务器中获取时间。此外,如果我像之前所说的那样评论 DayTime 对象的声明,它也可以正常工作。
我怎样才能做到这一点?