linux 时间戳 单片机,Unix 时间戳(stm32实现解析与转换)

1.什么是Unix时间戳

Unix时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。 [1]

Unix时间戳(英文为Unix epoch, Unix time, POSIX time 或 Unix timestamp)是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。

UNIX时间戳的0按照ISO 8601规范为 :1970-01-01T00:00:00Z.

一个小时表示为UNIX时间戳格式为:3600秒;

一天表示为UNIX时间戳为86400秒,闰秒不计算。

在大多数的UNIX系统中UNIX时间戳存储为32位,这样会引发2038年问题或Y2038

通俗的讲, 时间戳是一份能够表示一份数据在一个特定时间点已经存在的完整的可验证的数据。

(简单来讲:就是从1970年1月1日开始到你看到这片笔记时经过的秒数)

在线工具:进行时间戳与北京时间的转换

a5ea1d52b40c0b248b343e3848dfc171.png

2.为什么使用Unix时间戳

因为我上位机的程序协议用到了,便于检测设备的反应速度。(就是工作需要。。。。。)

3.如何在单片机中实现Unix时间戳

平台:STM32F103ZET6(ST 的实现方法都差不多)

语言:C语言 (使用 ST hal库 采用stm32cubemx 产生相关工程)

实现内容:

单片机接收到Unix时间戳解析为本地时间,并设置RTC。

RTC读出来本地时间转换为Unix时间戳发送出去

数据:

464bbcfc986a078e0d4a3dafe859536e.png

2760e857f3baaca743dda1083c7a6112.png

1.单片机接收到Unix时间戳解析为本地时间,并设置RTC。

(1)由于上位机发送过来的是16进制。而Unix时间戳是一个Uint32_t的数据,首先要对协议包里的16进制数据进行转换。

将16进制的数据转换为一个uint32_t的数据

r = ((*p++) << 24);

r = r|((*p++) << 16);

r = r|((*p++) << 8);

r = r| (*p++);

(2)将Unix时间戳进行转换(主要使用localtime()函数,该函数在“time.h”里)

/**

* Description:Unix时间戳解析并设置本地时间

* Parameter:UnixNum Unix时间戳

* Return: NULL

* Others:

*/

void Unix_To_Time(uint32_t UnixNum)

{

struct tm *stmU;

RTC_DateTypeDef sdate;

RTC_TimeTypeDef stime;

time_t Count;

Count = UnixNum;

stmU = localtime(&Count);

sdate.Year = stmU->tm_year - 100;

sdate.Month = stmU->tm_mon + 1;

sdate.Date = stmU->tm_mday;

stime.Hours = stmU->tm_hour + 8;

stime.Minutes = stmU->tm_min;

stime.Seconds = stmU->tm_sec;

HAL_RTC_SetDate(&hrtc,&sdate,RTC_FORMAT_BIN);

HAL_RTC_SetTime(&hrtc,&stime,RTC_FORMAT_BIN);

printf("%02d/%02d/%02d\r\n",2000 + sdate.Year, sdate.Month, sdate.Date);

printf("%02d:%02d:%02d\r\n",stime.Hours, stime.Minutes, stime.Seconds);

printf("\r\n");

}

2.RTC读出来本地时间转换为Unix时间戳发送出去(主要使用)

/*

* Description:本地时间生成Unix时间戳

* Parameter:

* Return:

* Others:

*/

void Time_To_Unix()

{

char buf[50];

struct tm stmT;

RTC_DateTypeDef sdate;

RTC_TimeTypeDef stime;

HAL_RTC_GetTime(&hrtc, &stime, RTC_FORMAT_BIN);

HAL_RTC_GetDate(&hrtc, &sdate, RTC_FORMAT_BIN);

stmT.tm_year=sdate.Year+100;

stmT.tm_mon=sdate.Month-1;

stmT.tm_mday=sdate.Date;

stmT.tm_hour=stime.Hours-8;

stmT.tm_min=stime.Minutes;

stmT.tm_sec=stime.Seconds;

sprintf(buf,"%u",mktime(&stmT));

printf("UTC:%s \r\n",buf);

}

效果:

解析成功

r是我上位机发送下来的时间戳,UTC是通过本地时间转换的时间戳

cac6d3262d07088277c353745c888613.png

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值