esp8266提供了SNTP的功能,但时间获取后输出的是字符串,不能直接用于数据的处理,然后我自己写了一个数据转换的程序,可以直接将数据传变成BCD码输出,用于同步本地时钟模块。
串口显示数据:
代码如下:
sntp_change.h
/*
* sntp_change.h
*
* Created on: 2018年12月26日
* Author: 王杰龙
*/
#ifndef APP_INCLUDE_USER_DRIVER_SNTP_CHANGE_H_
#define APP_INCLUDE_USER_DRIVER_SNTP_CHANGE_H_
//使用结构体变量保存转换后的数据
typedef struct sntp_data{
unsigned char week;
unsigned char month;
unsigned char day;
unsigned char hour;
unsigned char minute;
unsigned char second;
unsigned char year;
} sntp_data;
sntp_data sntp_get_time_change(char *s);
#endif /* APP_INCLUDE_USER_DRIVER_SNTP_CHANGE_H_ */
sntp_change.c
* sntp_change.c
*
* Created on: 2018年12月26日
* Author: 王杰龙
*/
#include "user_driver/sntp_change.h"
#include "c_types.h"
#include "osapi.h"
//使用结构体变量作为函数的返回值
sntp_data
ICACHE_FLASH_ATTR
sntp_get_time_change(char *s){
sntp_data data;
unsigned char status[7]={3,3,2,2,2,2,4};
unsigned char c[5],i=0,j=0;
while(*s!='\0'){
if(*s==' '||*s==':'){
s++;
i++;
}
else{
os_memset(c,'\0', 5);//赋初值
for(j=0;j<status[i];j++){
c[j]=*s;
s++;
}
switch(i){
case 0: if(strcmp(c,"Mon")==0) data.week=0x01;//星期一
else if(strcmp(c,"Tue")==0) data.week=0x02;//星期二
else if(strcmp(c,"Wed")==0) data.week=0x03;//星期三
else if(strcmp(c,"Thu")==0) data.week=0x04;//星期四
else if(strcmp(c,"Fri")==0) data.week=0x05;//星期五
else if(strcmp(c,"Sat")==0) data.week=0x06;//星期六
else if(strcmp(c,"Sun")==0) data.week=0x07;//星期天
break;
case 1: if(strcmp(c,"Jan")==0) data.month=0x01;//一月
else if(strcmp(c,"Feb")==0) data.month=0x02;//二月
else if(strcmp(c,"Mar")==0) data.month=0x03;//三月
else if(strcmp(c,"Apr")==0) data.month=0x04;//四月
else if(strcmp(c,"May")==0) data.month=0x05;//五月
else if(strcmp(c,"Jun")==0) data.month=0x06;//六月
else if(strcmp(c,"Jul")==0) data.month=0x07;//七月
else if(strcmp(c,"Aug")==0) data.month=0x08;//八月
else if(strcmp(c,"Sep")==0) data.month=0x09;//九月
else if(strcmp(c,"Oct")==0) data.month=0x10;//十月
else if(strcmp(c,"Nov")==0) data.month=0x11;//十一月
else if(strcmp(c,"Dec")==0) data.month=0x12;//十二月
break;
case 2://日
data.day=(c[0]&0x0f)<<4;
data.day=data.day|(c[1]&0x0f);
break;
case 3://时
data.hour=(c[0]&0x0f)<<4;
data.hour=data.hour|(c[1]&0x0f);
break;
case 4://分
data.minute=(c[0]&0x0f)<<4;
data.minute=data.minute|(c[1]&0x0f);
break;
case 5://秒
data.second=(c[0]&0x0f)<<4;
data.second=data.second|(c[1]&0x0f);
break;
case 6://年
data.year=(c[2]&0x0f)<<4;
data.year=data.year|(c[3]&0x0f);
break;
default :
break;
}
}
}
return data;
}
驱动sntp_change的例程:
uint32 time = sntp_get_current_timestamp();//查询当前距离基准时间 (1970.01.01 00: 00: 00 GMT + 8)的时间戳
SNTP_Init();//SNTP 初始化
char *p=sntp_get_real_time(time);
p[24]='\0';//不要年份后面的数据
i2c_SH1106_Str_UI(p);//显示所获得的ip地址
os_printf("%s\n",p);
data=sntp_get_time_change(p);
os_printf("20%x_%x_%x_%x:%x:%x_%x\n",data.year,data.month,data.day,data.hour,data.minute,data.second,data.week);
sntp_stop();//sntp停止