1、串口筛选出GPS模块RMC指令
RMC指令的格式如下:
$GNRMC,022326.000,A,2238.3443,N,11403.0962,E,0.01,169.33,120421,,,A,V*07
2、在RMC指令字符串中提取UTC时间与UTC日期
if(uart_rx_flag == 1)
{
uart_rx_flag = 0;
//解析GPS 协议
if(memcmp(rec_buff.data,"$GNRMC",strlen("$GNRMC")) == 0)
{
u8 cnt = 0;
for(u8 i = 0; i < sizeof(rec_buff.data); i++)
{
if(rec_buff.data[i] == ',')
{
cnt ++;
if(cnt == 1) //
{
time_cnt = i+1;
}
if(cnt == 2)
{
if(i < time_cnt + 6)
{
break;
}
else
{
// 解析数据出UTC时间
memcpy(gps_time.data,&rec_buff.data[time_cnt],6);
}
}
if(cnt == 9)
{
data_cnt = i+1;
}
if(cnt == 10)
{
if(i < data_cnt + 3)
{
break;
}
else
{
//解析数据出UTC日期
memcpy(gps_data.data,&rec_buff.data[data_cnt],6);
//授时时钟芯片
user_recieve_data. second = (gps_time.data[4]-'0')*10 gps_time.data[5]-'0';
user_recieve_data. minute = (gps_time.data[2]-'0')*10 + gps_time.data[3]-'0';
user_recieve_data. hour = (gps_time.data[0]-'0')*10 + gps_time.data[1]-'0' + 8;
user_recieve_data. day = (gps_data.data[0]-'0')*10 + gps_data.data[1]-'0';
user_recieve_data. month = (gps_data.data[2]-'0')*10 + gps_data.data[3]-'0';
user_recieve_data. year = (gps_data.data[4]-'0')*10 + gps_data.data[5]-'0';
user_recieve_data. week = get_week(2000 + user_recieve_data. year,user_recieve_data. month,user_recieve_data. day);
rtc_set_time(user_recieve_data. second,user_recieve_data. minute,user_recieve_data. hour,user_recieve_data. day,user_recieve_data. week,user_recieve_data. month,2000+user_recieve_data. year);
}
}
}
}
}
}
3、如果需要知道当前是星期几,可以通过蔡勒公式确定
int get_week(int year,int month,int day)//根据日期判断出星期几
{
if(month==1||month==2)
{
month+=12;
year--;
}
int c=year/100;
int y=year%100;
int m=month;
int d=day;
int w=c/4-2*c+y+y/4+26*(m+1)/10+d-1;
if(w<0)
return (w+(-w/7+1)*7)%7;
w=w%7;
if (w == 0 ) //星期日不作为一周的第一天
w= 7;
return w;
}