2013-02-20 3 views
0

В моем файле main.cpp я вызываю конструктор класса. В конструкторе я устанавливаю переменные этого класса из некоторых статических функций. Вся проблема заключается в настройке времени с сервера NTP.Спецификация конструктора и объекта

Статические функции, которые являются геттерами, используют петлю while, чтобы проверить флаг. Флаг является ложным, если время не установлено и не истинно, если хотя бы один раз сервер NTP ответил. Если флаг является ложным, цикл while должен попытаться получить время навсегда (потому что нет причин для продолжения без времени), и если оно истинно, оно возвращает время.

Конструктор устанавливает переменные, как я сказал, вызывая геттеры.

Когда я объявляю объект этого класса в основном, программа не запускается, потому что я ничего не получаю при серийной печати. Если я изгоню декларацию, она работает. Кроме того, он не действует как затухание внутри 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); 

Здесь функция GetTime работает, если я комментирую заявление объекта DAYTIME имени DT.

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 после включить.

И в последней части функции, которая устанавливает флаг верно:

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

Какая ошибка? –

+0

:) внутри функции getTime, которую вы видите в основном, есть serial.prints. Я ничего не получаю, если не комментировать декларацию. Также, если я не объявляю подобное, и я нахожу внутри цикла void: DayTime DT = DayTime(); он работает. Но я думал, что декларация запускает конструктор – kyrpav

ответ

1

Вы объявляете переменную DayTime глобальной переменной. Это означает, что его конструктор называется до вызывается функция main. И поскольку последовательный порт, а также сеть, которую я угадываю, не настроен, это не сработает.

Вы можете создать инициализацию в классе DayTime, что делает конструктор, и вызвать это после настройки последовательного порта и сети.

+0

об этой проблеме с последовательным портом, но в цикле() у меня есть функция gettime, которая не имеет никакого отношения к классу DayTime. И он не работает и дает свои серийные отпечатки. Кроме того, объект DT вызывает свой конструктор раньше, но серийная печать в цикле(), поскольку вы можете видеть комментарии, не работала, поэтому я мог читать переменные. Они установлены в цикле, так что внутри моей основной. – kyrpav