1、问题2019年4月6日,由于GPS的周计数,很多GPS模块的时间回到了99年,但由于GPS模块价格便宜,有些GPS模块在工厂也找不到。 这种情况下,那么多物品的网络定位产品怎么办?
2、解决方案由于GPS周计数变量采用10位变量,1024周后计数器将从零开始计数。 这样,今年就这样后退了20多年。 那么怎么解决这个问题呢? 我们读了GPRMC的信息后,直接时间加上1024周,相当于帮GPS进位。 于是这个问题解决了。 具体实施时,该如何操作?
首先将年月日换算为秒,然后1024周也换算为秒进行加法运算,然后将总秒数反算为成年月日。 到此结束。 年换算成秒的过程和秒换算成年的过程必须考虑闰年、闰月等相关因素,不计算也有问题。 当然,任何事情都必须站在巨人的肩膀上,所以直接调用时间库的函数,即time.h。
# define _ dlib _ time _ uses _ 641 time _ tt1; 结构TM tmin; 结构TM tmout; staticintweekoversizedatechange (char * cdate in,char *cDateOut ) { struct tm *tminp=tmin; 结构TM * tmoutp=tmout; char tmp[8 1]; 短信(tmp,0,sizeof ) tmp ); //strptime(cdatein,' %Y%m%d ',tminp ); tmin.tm_year=cDateIn[0]; tmin.tm_mon=cDateIn[1] - 1; tmin.tm_mday=cDateIn[2]; /* tmin.tm_year=99; tmin.tm_mon=7; tmin.tm_mday=25; (/)将tm结构数据转换为自1970年1月1日起计算的秒数)/T1=mktime(tminp ); /*计算需要增加或减少与天数对应的秒数。 因此,最后日期对应于从1970年1月1日开始计算的秒数*/t1=1024*7*60*60*24。 /*tm类型的时间转换,将time_t信息转换为真实世界的日期和时间表示,并将结果从结构tm返回到*/tmoutp=localtime(T1 )。 将tm转换为%Y%m%d格式并分配给输出。 最大长度为8 1*/strftime(tmp,81,' %Y%m%d ',tmoutp ); srcpy(cdateout,tmp ); 返回0; }记录了几个问题。
关于strptime函数
在IAR编译器中的time.h中没有这个函数,我相当不高兴。 这个函数主要起什么作用呢? 原本cDateIn和cDateOut都是字符型的数据输入,通过这个函数可以将整个字符型的年月日直接变换为十进制的数值,直接代入tm结构体的变量中。 然后调用所有库函数。 但是,IAR的time.h中没有这个函数,所以只能自己用十进制编程cDateIn,然后将其赋值给相应的结构变量,然后执行以下操作:
关于月亮
进入tm结构体后,可以看到月亮表示0-11到1-12月。 所以,对于通常显示的东西,减去1后再参加运算。 否则计算有问题。
关于tm结构赋值问题
结构TM tmin; 这个结构显然只是局部变量,而且只在局部函数中运算,所以理论上不应该定义为全部变量,但奇怪的是,我定义为局部变量后,年换算为秒的数值经常会自己发生变化。 把这个变量变更为全局变量就可以了。 我写到这里的时候,其实我还有点莫名其妙。
结果,这个结构体不应该只初始化年月日,而应该初始化时分秒。 这是因为,在计算后面的秒数的函数中,时分秒都参与运算,所以如果不初始化,后面的值就会一直跳动。