c++ - 实现 TimeLib.h 的 Arduino 类

标签 c++ arduino esp8266

我正在为使用 TimeLib.h 库的 ESP8266-Arduino 创建这个库。

在我的标题中我有:

WiFiUDP *_UdpNTP = NULL;
void    setupTime();
time_t  getNtpTime();
void    sendNTPpacket(WiFiUDP *u);

这些是我的功能:

void Konnec::setupTime() {
    setSyncProvider(getNtpTime);
    setSyncInterval(NTP_POL_TIME);
}


time_t Konnec::getNtpTime() {
//WiFiUDP udp;
//udp.begin(localPort);

_UdpNTP = new WiFiUDP();
_UdpNTP->begin(localPort);

while (_UdpNTP->parsePacket() > 0); // discard any previously received packets
for (int i = 0; i < 5; i++) { // 5 retries.
    sendNTPpacket(_UdpNTP);
    uint32_t beginWait = millis();
    while (millis() - beginWait < 1000) {
        if (_UdpNTP->parsePacket()) {
            Serial.println("");
            Serial.println("Receive NTP Response");
            _UdpNTP->read(packetBuffer, NTP_PACKET_SIZE);
            // Extract seconds portion.
            unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
            unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
            unsigned long secSince1900 = highWord << 16 | lowWord;
            _UdpNTP->flush();
            return secSince1900 - 2208988800UL + TIMEZONE * SECS_PER_HOUR;
        }
        delay(10);
    }
}
Serial.println("");
Serial.println("No NTP Response :-(");
return 0; // return 0 if unable to get the time
}

void Konnec::sendNTPpacket(WiFiUDP *u) {
// Zeroise the buffer.
memset(packetBuffer, 0, NTP_PACKET_SIZE);
memcpy(packetBuffer, sendBuffer, 16);

if (u->beginPacket(timeServer, 123)) {
    u->write(packetBuffer, NTP_PACKET_SIZE);
    u->endPacket();
}
}

这是我得到的错误:

konnec.cpp: 991:28: error: cannot convert 'Konnec::getNtpTime' from type 'time_t (Konnec::)() {aka long int (Konnec::)()}' to type 'getExternalTime {aka long int (*)()}
   setSyncProvider(getNtpTime)
Error compiling libraries

有人知道解决方案是什么吗?

最佳答案

问题似乎是 Konnec::getNtpTime 是一个类方法,而 setSyncProvider 需要一个函数。请记住,函数和方法是不同的东西,因为方法还需要知道它正在操作的特定类实例。

虽然查看您的代码,但看起来 getNtpTime 不依赖于您的类的任何特定内容,因此您可以将其声明为:

static time_t Konnec::getNtpTime();

这将使它被用作一个函数,因为它在那个时候是有效的。

关于c++ - 实现 TimeLib.h 的 Arduino 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40198412/

相关文章:

java - 如何为一种小语言构建解释器?

Java RXTX - 通过串行通信检测正确的设备

node.js - Arduino + ESP8266 网络客户端

c++ - 使用带有多重继承的enable_shared_from_this

c++ - 将 .bat 转换为 .exe 而不依赖于 cmd.exe

c++ - 嵌套 C++ 模板

compiler-errors - 可以正常工作的Arduino UNO代码在ESP8266上编译错误-无匹配功能

c++ - 每次我将我的(播放旋律)代码上传到 arduino 并按下按钮时,它都会跳过数组中的相同音符。怎么会?

c# - 使用 C# 在 Windows IOT 和 Arduino Nano 之间进行 I2C 连接

algorithm - 我需要 NodeMCU 中的 Lua 数学库