ESP8266: ошибка: 'getLocalTime' was not declared in this scope

Я получаю

ошибка: "GetLocalTime" не был объявлен в этой области

когда я компилирую этот код для ESP8266, однако он работает для ESP32:

#include "time.h"

void gettime()
{
  static int16_t delaycount = 0 ;                         // To reduce number of NTP requests
  static int16_t retrycount = 100 ;

  if ( timeinfo.tm_year )                                 // Legal time found?
  {
    sprintf ( timetxt, "%02d:%02d:%02d",                  // Yes, format to a string
              timeinfo.tm_hour,
              timeinfo.tm_min,
              timeinfo.tm_sec ) ;
  }
  if ( --delaycount <= 0 )                                // Sync every few hours
  {
    delaycount = 7200 ;                                   // Reset counter
    if ( timeinfo.tm_year )                               // Legal time found?
    {
      dbgprint ( "Sync TOD, old value is %s", timetxt ) ;
    }
    dbgprint ( "Sync TOD" ) ;
    if ( !getLocalTime ( &timeinfo ) )                    // Read from NTP server
    {
      dbgprint ( "Failed to obtain time!" ) ;             // Error
      timeinfo.tm_year = 0 ;                              // Set current time to illegal
      if ( retrycount )                                   // Give up syncing?
      {
        retrycount-- ;                                    // No try again
        delaycount = 5 ;                                  // Retry after 5 seconds
      }
    }
    else
    {
      sprintf ( timetxt, "%02d:%02d:%02d",                // Format new time to a string
                timeinfo.tm_hour,
                timeinfo.tm_min,
                timeinfo.tm_sec ) ;
      dbgprint ( "Sync TOD, new value is %s", timetxt ) ;
    }
  }
}

Чем я должен заменить GetLocalTime?

, 👍1


1 ответ


3

Похоже, что ядро esp8266 Arduino не имеет подобной функции.

GetLocalTime в ядре esp32 arduino-это простая функция, реализованная в esp32-hal-time.c.

bool getLocalTime(struct tm * info, uint32_t ms)
{
    uint32_t start = millis();
    time_t now;
    while((millis()-start) <= ms) {
        time(&now);
        localtime_r(&now, info);
        if(info->tm_year > (2016 - 1900)){
            return true;
        }
        delay(10);
    }
    return false;
}

Функция компилируется на esp8266 arduino как есть, чтобы вы могли скопировать ее в свой скетч.

,

есть два параметра, которые вам нужно передать. В то время как в моем примере только один, @Murad

@BJackson, объявление в заголовочном файле имеет значение по умолчанию для второго параметра bool GetLocalTime(struct tm * info, uint32_t ms = 5000); (вы не можете установить значение по умолчанию для определения функции). вы можете вызвать функцию с 5000 в качестве второго параметра или удалить параметр и использовать фиксированное значение в функции., @Juraj

Это работает, спасибо. Но есть ли способ ESP8266? Я смотрел на https://github.com/scanlime/esp8266-Arduino/blob/master/cores/esp8266/time.c и нет ничего подобного, @Murad

@BJackson, это единственная удобная функция, позволяющая только ждать с таймаутом, пока не будет получен самый первый ответ от сервера NTP и не будет установлен RTC, @Juraj