0

在我的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 对象的声明,它也可以正常工作。

我怎样才能做到这一点?

4

1 回答 1

1

您将DayTime变量声明为全局变量。这意味着它的构造函数在你的函数被调用之前main被调用。并且由于串行端口以及我猜测的网络没有设置,因此它将无法工作。

您可以在类中创建一个初始化DayTime,它执行构造函数的操作,并在设置串行端口和网络后调用它。

于 2013-02-20T13:43:23.547 回答