SIM800C通过NTP同步本地时间

时间仓促,大概记录一下,以后详细贴上C程序

 ----------------------------------简单查询--------------------------------
AT+CSQ                          //查看信号质量
    +CSQ: 25,0
    OK
AT+CREG?                        //查看GSM是否注册成功
    +CREG: 0,1
    OK
AT+CGREG?                       //查看GPRS是否注册成功
    +CGREG: 0,1
    OK
AT+CGATT?                       //查看GPRS附着状态
    +CGATT: 1
    OK
 ----------------------------------以下是重点-----------------------------
AT+SAPBR=3,1,"CONTYPE","GPRS"   //设置网络参数
    OK
AT+SAPBR=3,1,"APN","UNIWAP"     //设置APN
    OK
AT+SAPBR=1,1                    //激活网络场景
    OK
AT+SAPBR=2,1                    //获取分配IP地址
    +SAPBR: 1,1,"10.97.109.220"
    OK
AT+CNTP="ntp1.aliyun.com",32    //设置NTP服务器地址,时区
    OK
AT+CNTP                         //开启网络同步
    OK
    +CNTP: 1
AT+CCLK?                        //查询本地时间
    +CCLK: "18/05/14,13:00:33+00"
    OK

题外话,原本选的是交大NTP,发现没连上。。。。。。换成阿里云的就OK了,给阿里点个赞
另外,北京时区是东八区,我觉得应该是AT+CNTP="ntp1.aliyun.com",8,可实际相差6小时,补加24后,得到正确时间,即AT+CNTP="ntp1.aliyun.com",32,这里比较迷,路过的大哥指点一下,或者以后我明白了,再补充
C代码

extern u8 ABT_SyncTime(void)
{
        if(sim900a_send_cmd((u8 *)"AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"",(u8 *)"OK",100))   
            return 1;

      if(sim900a_send_cmd((u8 *)"AT+SAPBR=3,1,\"APN\",\"UNIWAP\"",(u8 *)"OK",500))  
            return 2;

        sim900a_send_cmd((u8 *)"AT+SAPBR=1,1",(u8 *)"OK",200);

        if(sim900a_send_cmd((u8 *)"AT+SAPBR=2,1",(u8 *)"OK",600))   
            return 4;

        if(sim900a_send_cmd((u8 *)"AT+CNTP=\"ntp1.aliyun.com\",32",(u8 *)"OK",200)) 
            return 5;       

        if(sim900a_send_cmd((u8 *)"AT+CNTP",(u8 *)"CNTP: 1",2000))  
            return 6;       

        return 0;
}

extern void ABT_GetLocalTime(void)
{
    char *timePtr = NULL;
/*  
    if(sim900a_send_cmd((u8 *)"AT+CCLK?",(u8 *)"CCLK:",2000))
        timePtr = strstr(USART2_RX_BUF,(const char *)"CCLK:");
*/
    sim900a_send_cmd((u8 *)"AT+CCLK?",(u8 *)"CCLK:",2000);
    timePtr = strstr((const char*)USART2_RX_BUF,(const char*)"CCLK:");

    G_LocalTime.ALT_year    = 2000 + 10*(timePtr[7] - '0') + timePtr[8] - '0';
    G_LocalTime.ALT_month   = 10*(timePtr[10] - '0') + timePtr[11] - '0';
    G_LocalTime.ALT_day     = 10*(timePtr[13] - '0') + timePtr[14] - '0';
    G_LocalTime.ALT_hour    = 10*(timePtr[16] - '0') + timePtr[17] - '0';
    G_LocalTime.ALT_minute  = 10*(timePtr[19] - '0') + timePtr[20] - '0';
    G_LocalTime.ALT_second  = 10*(timePtr[22] - '0') + timePtr[23] - '0';
}

注释部分也比较迷,真的没道理啊,试了不下于20次,还是不行。时间紧,就暂时用注释后的代码了。
结构体定义部分

struct ABT_LocalTime_TypeDef{
    u16 ALT_year;
    u8  ALT_month;
    u8  ALT_day;
    u8  ALT_hour;
    u8  ALT_minute;
    u8  ALT_second;
};

RX2_BUF收到的数据
这里写图片描述
图1

timePtr指针指向RX2_BUF的子串位置
这里写图片描述
图2

USART2_RX_BUF : 0X20000448,
timePtr:0X20000454,
相差12,

在图1可见,CCLK:起始位置正是12,以后通过timePtr指针索引数据内容即可

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值