在我的main.cpp文件中,我调用了类的构造函数。在构造函数中,我从一些静态函数中设置了这个类的变量。所有问题都与从NTP服务器设置时间有关。
作为getter的静态函数使用while循环来检查标志。如果未设置时间,则标记为false;如果NTP服务器至少响应了一次,则标记为true。如果标志为假,则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)第一个getter:
int NTP::getLCThour(){
while(timeNTPSet==false){
Serial.print("kolaw");
getTime();
}
return lcthour;
}2) header上标志的声明:
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对象的声明,它也能正常工作。
我该怎么做呢?
发布于 2013-02-20 21:43:24
将DayTime变量声明为全局变量。这意味着它的构造函数是在调用main函数之前调用的。而且由于串口,以及网络,我猜,没有设置,那么它将不会工作。
您可以在DayTime类中创建一个初始化,它完成构造函数所做的工作,并在设置串行端口和网络之后调用它。
https://stackoverflow.com/questions/14981252
复制相似问题