esp8266_SNTP时间获取处理成BCD码

17 篇文章 0 订阅
13 篇文章 0 订阅

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停止
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值