GPS模块授时时钟芯片

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值