单片机SNTP问题
2024-06-064949
AI 快速预览详细
本文介绍了单片机SNTP时间同步的实现方法及常见故障排查。文章详细描述了如何通过调整Udp.parsePacket的调用频率和优化packetBuffer的初始化方式,解决只能收到5-6个包后停止的问题。通过这些步骤,用户可以稳定地获取NTP时间数据,确保项目的准确性。
|
void sendNTPpacket(IPAddress address) { memset(packetBuffer, 0, ETHERNET_BUF_MAX_SIZE); packetBuffer[0] = 0xE3; // LI, Version, Mode packetBuffer[1] = 0; // Stratum, or type of clock packetBuffer[2] = 6; // Polling Interval packetBuffer[3] = 0xEC; // Peer Clock Precision packetBuffer[12] = 49; packetBuffer[13] = 0x4E; packetBuffer[14] = 49; packetBuffer[15] = 52; Udp.beginPacket(address, 123);//NTP requests are to port 123 Udp.write(packetBuffer, ETHERNET_BUF_MAX_SIZE); Udp.endPacket(); } void loop() { delay(1000); if (bStr) { bStr = false; sendNTPpacket(IPAddress(198,120,0,100));//10秒执行一次 } if (Udp.parsePacket()) { Udp.read(packetBuffer, ETHERNET_BUF_MAX_SIZE); unsigned long highWord = word(packetBuffer[40], packetBuffer[41]); unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]); unsigned long secsSince1900 = highWord << 16 | lowWord; Serial.print("Seconds since Jan 1 1900 = "); Serial.println(secsSince1900); Serial.print("Unix time = "); const unsigned long seventyYears = 2208988800UL; unsigned long epoch = secsSince1900 - seventyYears; Serial.println(epoch); Serial.print("The UTC time is "); // UTC is the time at Greenwich Meridian (GMT) Serial.print((epoch % 86400L) / 3600); // print the hour (86400 equals secs per day) Serial.print(':'); if (((epoch % 3600) / 60) < 10) { Serial.print('0'); } Serial.print((epoch % 3600) / 60); // print the minute (3600 equals secs per minute) Serial.print(':'); if ((epoch % 60) < 10) { Serial.print('0'); } Serial.println(epoch % 60); // print the second memset(packetBuffer, 0, ETHERNET_BUF_MAX_SIZE); } } 老是只能收到5 6个包,就不动了,怎么办? |



