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?
@Murad, 👍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 как есть, чтобы вы могли скопировать ее в свой скетч.
,
@Juraj
Смотрите также:
- ESP8266 ISO 8601 string to tm struct
- Передача функции-члена класса в качестве аргумента
- контент» не захватывается
- esp32 Stack canary watchpoint срабатывает
- Преобразование byte* в int в Arduino
- Как передать нестатический член класса в обратный вызов?
- Что является более быстрой альтернативой parseInt()?
- Как разобрать 20180810T143000Z в time_t
есть два параметра, которые вам нужно передать. В то время как в моем примере только один, @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