需求背景:
每次程序修改,变更以及发布,都要手动修改程序版本以及版本日期,有些程序员难免会粗心忘记修改。
原理:
因为编译器每次编译后都会记录日期,我们可以通过一个宏 __TIME__ __DATE__ 来获取日期和时间,获取到之后,是一个字符串形式。
实验条件:
MDK集成工具V5.0版本以上。
实现方法:
今天,他来了!
首先定义日期结构体:
#ifndef __VERSION_H#define __VERSION_H #include <string.h> #include <stdlib.h> typedef struct version_date { int tm_mday; /* 月中的第几天,范围从 1 到 31*/ int tm_mon; /* 月份,范围从 1 到 12*/ int tm_year; /* 实际的年数 */ }version_date; extern version_date v_date; void mcu_get_version_date(void); #endif
复制代码#include "version.h"/********************************************************** 本文件包含2个功能: 1. 软件版本日期 2. mbus ID,从芯片的唯一ID号读取 软件版本号不可控,统一使用软件版本日期。 1. 读软件版本日期 格式如下:3字节协议: Byte0 : 00~99 表示[2020 ~ 2099] Byte1 : 1~12 月Mon Byte2 : 1~31 日day exp : Nov 4 2020 *********************************************************/ char TimeStr[]= __TIME__; char DataStr[]= __DATE__; //"Nov 4 2020"; version_date v_date; char Month_tab[][12] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "September", "November", "December", }; /* 获取编译后的字符日期版本,转换成整数后保存 // Nov 4 2020 */ void mcu_get_version_date(void) { /*比较前3个字符,找出月份*/ for(int i = 0; i < 12; i++) { char *ptr = Month_tab[i]; if(*ptr == DataStr[0]) { ptr++; if(*ptr == DataStr[1]) { ptr++; if(*ptr == DataStr[2]) { v_date.tm_mon = i+1; break; } } } } /*找出日+年*/ char *pstr = DataStr; pstr = strchr(pstr, ' '); /*寻找空格*/ pstr++; if(*pstr == ' ') /*如果为1~9日,则字符串中隔有2个空格*/ { pstr++; // 字符转数字 char b = *pstr; v_date.tm_mday = (b - 0x30); } else { char a = *pstr; pstr++; char b = *pstr; v_date.tm_mday = (a - 0x30)*10 + (b - 0x30); } pstr++; v_date.tm_year = atoi(pstr); }
复制代码

个人认为这个功能非常有用,配合自动化bat编译脚本,可以完全实现自动化。
最后附上源文件,欢迎下载:
游客,如果您要查看本帖隐藏内容请回复