В моем файле 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, как я уже говорил.
Как это сделать?
Какая ошибка? –
:) внутри функции getTime, которую вы видите в основном, есть serial.prints. Я ничего не получаю, если не комментировать декларацию. Также, если я не объявляю подобное, и я нахожу внутри цикла void: DayTime DT = DayTime(); он работает. Но я думал, что декларация запускает конструктор – kyrpav