0

私のmain.cppファイルでは、クラスのコンストラクターを呼び出します。コンストラクターで、いくつかの静的関数からこのクラスの変数を設定します。すべての問題は、NTP サーバーからの時刻の設定に関するものです。

ゲッターである静的関数はwhile、フラグをチェックするためにループを使用します。時間が設定されていない場合、フラグは false であり、NTP サーバーが少なくとも 1 回応答した場合は true です。フラグが false の場合、whileループは永遠に時間を取得しようとする必要があり (時間なしで続行する理由がないため)、true の場合は時間を返します。

コンストラクターは、先ほど説明したように、ゲッターを呼び出して変数を設定します。

そのクラスのオブジェクトを 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 関数は、少なくとも 1 つから時間を取得するために、3 ~ 4 つの異なる NTP サーバーをテストするだけです。また、前述のように DayTime オブジェクトの宣言にコメントを付ければ問題なく動作します。

これどうやってするの?

4

1 に答える 1

1

DayTime変数をグローバル変数として宣言します。つまり、関数が呼び出される前にそのコンストラクターが呼び出されます。mainそして、シリアルポートと、私が推測しているネットワーキングがセットアップされていないため、機能しません。

クラスで初期化を作成しDayTime、コンストラクターが行うことを行い、シリアル ポートとネットワークをセットアップした後にそれを呼び出すことができます。

于 2013-02-20T13:43:23.547 に答える