在我的main.cpp
文件中,我调用了类的构造函数。在构造函数中,我从一些静态函数设置此类的变量。所有问题都是关于从NTP服务器设置时间。
作为getter的静态函数使用while
循环来检查标志。如果未设置时间,则该标志为false;如果NTP服务器至少响应一次,则该标志为true。如果该标志为false,则while
循环必须尝试永久地获取时间(因为没有理由在没有时间的情况下继续),如果为真,则返回时间。
构造函数通过调用getters来设置变量。
当我在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;
这是在include。之后的.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对象的声明,它也能正常工作。
我该怎么做?
答案 0 :(得分:1)
您将DayTime
变量声明为全局变量。这意味着在调用main
函数之前,它的构造函数被称为。因为串口,以及我猜测的网络都没有设置,所以它不起作用。
您可以在DayTime
类中创建一个初始化,它可以执行构造函数的操作,并在设置串行端口和网络后调用它。