你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

智能手表雏形之SIM908通信处理

[复制链接]
颩色四葉愺 发布时间:2015-1-7 12:33
本帖最后由 颩色四葉愺 于 2015-1-7 17:41 编辑 用到sim908进行拨话,与短信、GPS、GPRS服务,需要对模块返回来的信息进行处理,源程序如下:
  1. #include "sim908.h"
  2. #include "stdio.h"
  3. #include "string.h"
  4. #include "usart.h"
  5. #include "ff.h"
  6. #include "includes.h"
  7. #include "rtc.h"
  8. #include "i2c_ee.h"
  9. #include "includes.h"
  10. u8 Sim_Battery[4];        //电池
  11. u8 Sim_RSSI[3];                //信号强度
  12. u8 Sim_Operator        =        0; //运营商 1为中国移动
  13. u8 GSM_Response[10];
  14. u8 RingNumber[20];        //来电号码
  15. u8 Messagenum;                        //保存短信数目
  16. u8 Messagebuff[50];        //保存短信状态 0 空   1 未读   2 命令短信   3非命令短信
  17. char ADMINISTRATORPHONE[20] = "13729058953";
  18. char IPADDR[20] = "220.170.79.210";
  19. char COM[6] = "40487";
  20. char PASSWORD[10] = "0000000000";
  21. u8 LOCATION[30];
  22. Messagestr MES_STR;
  23. GPSStruct GPS_STR;
  24. /*
  25.         函数名:Sim908_IOConfig
  26.         描述:        复位
  27.         输入:        无
  28.         输出:        无
  29. */
  30. void Sim908_IOConfig( void )
  31. {
  32.         GPIO_InitTypeDef GPIO_InitStructure;
  33.         RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);
  34.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;        
  35.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   
  36.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  37.         GPIO_Init(GPIOA, &GPIO_InitStructure);        
  38.         
  39. }
  40. void Sim908_Reset( void )
  41. {
  42.         OS_ERR err;
  43.         GPIO_SetBits(GPIOA, GPIO_Pin_1);
  44.         OSTimeDlyHMSM( 0, 0, 2, 0, OS_OPT_TIME_HMSM_STRICT, &err);
  45.         GPIO_ResetBits(GPIOA, GPIO_Pin_1);
  46. }
  47. /*
  48.         函数名:Sim908_SendCmd
  49.         描述:        发送at命令,并检验是否收到想要的响应
  50.         输入:        u8 *cmd 要发送的命令
  51.                                         u8 *ack        期待的响应
  52.                                         u16 waittime 等待时间 单位10ms
  53.                                         u8 *pBuff        接收响应的缓存区地址 为NULL则不保存响应数据
  54.         输出:        
  55. */
  56. u8 Sim908_SendCmd(u8 *cmd, u8 *ack, u16 waittime, u8 *pBuff)
  57. {
  58.         u8 res = SIM_ERR_OTHER;
  59.         u8 *pdata = NULL;
  60.         CPU_TS ts;
  61.         OS_ERR err;
  62.         OS_MSG_SIZE msg_size;
  63.         
  64.         OSMutexPend(&Mutex_USART2, 30000, OS_OPT_PEND_BLOCKING, &ts, &err);
  65.         if( (u32)cmd <= 0xff )                //用于发送结束标志 0x1A
  66.         {
  67.                 USART2->DR = (u32)cmd;
  68.         }
  69.         else
  70.         {
  71.                 printf("%s\r\n", ( char *)cmd);
  72.         }
  73.         if(ack != NULL)
  74.         {
  75.                 strcpy((char *)&GSM_Response[0], (char *)ack);
  76.                 while(waittime--)
  77.                 {
  78.                         //OSSemPend(&Sem_GSMResponse, 10, OS_OPT_PEND_BLOCKING, &ts, &err);        //等待信号量
  79.                         pdata = OSQPend(&Q_GSMResponse, 10, OS_OPT_PEND_BLOCKING, &msg_size, &ts, &err);
  80.                         if(err == OS_ERR_NONE)
  81.                         {
  82.                                 if((NULL != pBuff)&&(NULL != pdata))
  83.                                 {
  84.                                         strcpy((char *)pBuff, (char *)pdata);
  85.                                 }
  86.                                 OSMemPut(&MyPartition, pdata, &err);
  87.                                 res = SIM_ERR_NONE;
  88.                                 break;
  89.                         }
  90.                 }
  91.                 if(err != OS_ERR_NONE)
  92.                 {
  93.                         res = SIM_ERR_TIMEOUT;
  94.                 }
  95.         }
  96.         OSMutexPost(&Mutex_USART2, OS_OPT_POST_NONE, &err);
  97.         
  98.         return res;
  99. }
复制代码
收藏 评论4 发布时间:2015-1-7 12:33

举报

4个回答
颩色四葉愺 回答时间:2015-1-7 17:41:43
  1. /*
  2.         函数名:Sim908_ReadMessage
  3.         描述:        读短信
  4.         输入:        u8 addr 短信位置
  5.                                         u8 mode  1: 英文短信  0:中文短信
  6.         输出: 0 发送失败   1 发送成功
  7. */
  8. u8 Sim908_ReadMessage(u8 addr, u8 mode)
  9. {
  10.         u8 res = SIM_ERR_OTHER;
  11.         u8 messageaddr[20];
  12.         u8 address[3];
  13.         u8 *p1 = NULL;
  14.         u8 *p2 = NULL;
  15.         
  16.         if(addr > 50 || addr < 1)
  17.         {
  18.                 return 0;
  19.         }
  20.         
  21.         if(addr < 10)
  22.         {
  23.                 address[0] = addr + '0';
  24.                 address[1] = '\0';
  25.         }
  26.         else
  27.         {
  28.                 address[0] = addr/10 + '0';
  29.                 address[1] = addr%10 + '0';
  30.                 address[2] = '\0';
  31.         }
  32.         
  33.         if( mode ) //英文短信
  34.         {
  35.                 u8 databuff[350];
  36.                
  37.                 Sim908_SendCmd("AT+CMGF=1", "OK", 100, NULL);
  38.                 Sim908_SendCmd("AT+CSCS="GSM"", "OK", 100, NULL);               
  39.                
  40.                 sprintf((char *)messageaddr, "AT+CMGR=%s", address);
  41.                
  42.                
  43.                 if(SIM_ERR_NONE == Sim908_SendCmd(messageaddr, "+CMGR:", 250, &databuff[0]))
  44.                 {
  45.                         p1 = (u8 *)strstr((char *)&databuff[0], ",");
  46.                         p2 = (u8 *)strstr((char *)(p1+2), """);
  47.                         p2[0] = '\0';        //添加结束符
  48.                         
  49.                         strcpy((char *)MES_STR.Phonenum, (char *)(p1+2));        //保存电话号码
  50.                
  51.                         p1 = (u8 *)strstr((char *)(p2+1), "/");
  52.                         p2 = (u8 *)strstr((char *)(p1), "+");
  53.                         p2[0] = '\0';
  54.                         
  55.                         strcpy((char *)MES_STR.Time, (char *)(p1-2));        //保存接收时间
  56.                         
  57.                         p1 = (u8 *)strstr((char *)(p2+1), "\r");
  58.                         p2 = (u8 *)strstr((char *)(p1+1), "\r");
  59.                         p2[0] = '\0';
  60.                         
  61.                         strcpy((char *)MES_STR.Message, (char *)(p1+2));
  62.                         if(SIM_ERR_NONE == Sim908_JudgeMessage( &MES_STR ))
  63.                         {                                
  64.                                 res = SIM_ERR_NONE;
  65.                         }
  66.                         
  67.                 }               
  68.         }
  69.         else        //中文短信
  70.         {
  71.                 u8 databuff[350];
  72.                 u8 number[80];
  73.                 u8 messtr[256];
  74.                
  75.                 Sim908_SendCmd("AT+CMGF=1", "OK", 100, NULL);
  76.                 Sim908_SendCmd("AT+CSCS="UCS2"", "OK", 100, NULL);
  77.                 sprintf((char *)messageaddr, "AT+CMGR=%s", address);
  78.                
  79.                 if(SIM_ERR_NONE == Sim908_SendCmd(messageaddr, "+CMGR:", 300, &databuff[0]))
  80.                 {
  81.                         p1 = (u8 *)strstr((char *)databuff, ",");
  82.                         p2 = (u8 *)strstr((char *)(p1+2), """);
  83.                         p2[0] = '\0';        //添加结束符
  84.                         
  85.                         Sim908_UCS2GBK((char *)number, (char *)(p1+2));
  86.                         strcpy((char *)MES_STR.Phonenum, (char *)number);        //保存电话号码
  87.                         //LCD_ShowChEnStr(10, 10, MES_STR.Phonenum, RED, 16, 1);
  88.                         p1 = (u8 *)strstr((char *)(p2+1), "/");
  89.                         p2 = (u8 *)strstr((char *)(p1), "+");
  90.                         p2[0] = '\0';
  91.                         
  92.                         strcpy((char *)MES_STR.Time, (char *)(p1-2));        //保存接收时间
  93.                         
  94.                         p1 = (u8 *)strstr((char *)(p2+1), "\r");
  95.                         p2 = (u8 *)strstr((char *)(p1+1), "\r");
  96.                         p2[0] = '\0';
  97.                         
  98.                         Sim908_UCS2GBK((char *)messtr, (char *)(p1+2));
  99.                         strcpy((char *)MES_STR.Message, (char *)messtr);
  100.                         //LCD_ShowChEnStr(10, 40, MES_STR.Message, RED, 16, 1);
  101.                
  102.                         res = SIM_ERR_NONE;
  103.                 }
  104.                
  105.         }
  106.         return res;
  107. }
  108. /*
  109.         函数名:Sim908_SendMessage
  110.         描述:        发送短信
  111.         输入:        char *number        要发送的电话号码
  112.                                         char *message 要发送的短信内容
  113.                                         u8 mode                                 1为英文短信
  114.                                                                                                  0为中文短信
  115.         输出:        1:发送成功
  116.                                         0:发送失败
  117. */
  118. u8 Sim908_SendMessage(char *number, char *message, u8 mode)
  119. {
  120.         
  121.         char phonenumber[100];
  122.         u8 res = SIM_ERR_OTHER;
  123.         
  124.         if( mode )        //英文短信
  125.         {
  126.                 Sim908_SendCmd("AT+CMGF=1", "OK", 100, NULL);
  127.                 Sim908_SendCmd("AT+CSCS="GSM"", "OK", 100, NULL);
  128.                
  129.                 sprintf(phonenumber, "AT+CMGS="%s"", number);        //合并命令
  130.                
  131.                
  132.                 if(SIM_ERR_NONE == Sim908_SendCmd((u8 *)phonenumber, ">", 300, NULL))
  133.                 {
  134.                         USART_printf(USART2, "%s", message);        //发送内容
  135.                         
  136.                         if(SIM_ERR_NONE == Sim908_SendCmd((u8 *)0x1A, "+CMGS:", 1000, NULL))        
  137.                         {
  138.                                 
  139.                                 res = SIM_ERR_NONE;
  140.                         }
  141.                 }
  142.         }
  143.         else        //中文短信
  144.         {
  145.                
  146.                 char ucs2buff[256];
  147.                
  148.                 Sim908_SendCmd("AT+CMGF=1", "OK", 100, NULL);
  149.                 Sim908_SendCmd("AT+CSCS="UCS2"", "OK", 100, NULL);
  150.                 Sim908_SendCmd("AT+CSMP=17,0,2,25", "OK", 100, NULL);
  151.                
  152.                 Sim908_GBK2UCS(ucs2buff, number);
  153.                 sprintf(phonenumber, "AT+CMGS="%s"", ucs2buff);        //合并命令
  154.                
  155.                 if(SIM_ERR_NONE == Sim908_SendCmd((u8 *)phonenumber, ">", 300, NULL))
  156.                 {
  157.                         Sim908_GBK2UCS(ucs2buff, message);
  158.                         USART_printf(USART2, "%s", ucs2buff);        //发送内容
  159.                         if(SIM_ERR_NONE == Sim908_SendCmd((u8 *)0x1A, "+CMGS:", 1000, NULL))        
  160.                         {
  161.                                 res = SIM_ERR_NONE;
  162.                         }
  163.                 }
  164.         }
  165.         
  166.         return res;
  167. }
  168. /*
  169.         函数名:Sim908_Call
  170.         描述:        打电话
  171.         输入:        u8 * number        //电话号码
  172.         输出:        0 拨打失败   1 拨打成功
  173. */
  174. u8 Sim908_Call( u8 *number )
  175. {
  176.         char phonenum[30];
  177.         u8 res = SIM_ERR_OTHER;
  178.         
  179.         sprintf(phonenum, "ATD%s;", number);
  180.         if(SIM_ERR_NONE == Sim908_SendCmd(( u8 *)phonenum, NULL, 500, NULL))
  181.         {
  182.                 res = SIM_ERR_NONE;
  183.         }
  184.         
  185.         return res;
  186. }
  187.         
  188.         
  189. /*
  190.         函数名:Sim908_Hangup
  191.         描述:        挂电话
  192.         输入:        无
  193.         输出:        0 操作失败   1 操作成功
  194. */
  195. u8 Sim908_Hangup( void )
  196. {
  197.         u8 res = SIM_ERR_OTHER;
  198.         
  199.         
  200.         if(SIM_ERR_NONE == Sim908_SendCmd("ATH", "OK", 100, NULL))
  201.         {
  202.                 res = SIM_ERR_NONE;
  203.         }
  204.         
  205.         return res;
  206. }
  207. /*
  208.         函数名:Sim908_AnswerPhone
  209.         描述:        接电话
  210.         输入:        无
  211.         输出:        
  212. */
  213. u8 Sim908_AnswerPhone( void )
  214. {
  215.         u8 res = SIM_ERR_OTHER;
  216.         
  217.         if(SIM_ERR_NONE == Sim908_SendCmd("ATA", "OK", 100, NULL))
  218.         {
  219.                 res = SIM_ERR_OTHER;
  220.         }
  221.         
  222.         return res;
  223. }
  224. /*
  225.         函数名:Sim908_DeleteMes
  226.         描述:        删除短信
  227.         输入:        u8 addr        要删除的短信编号 1~50 (实际最大为16)
  228.         输出:        0 删除失败   1 删除成功
  229. */
  230. u8 Sim908_DeleteMes(u8 addr)
  231. {
  232.         u8 address[3];
  233.         u8 deletecmd[15];
  234.         u8 res = SIM_ERR_OTHER;
  235.         
  236.         if(addr > 50 || addr < 1)
  237.         {
  238.                 return 0;
  239.         }
  240.         
  241.         if(addr < 10)
  242.         {
  243.                 address[0] = addr + '0';
  244.                 address[1] = '\0';
  245.         }
  246.         else
  247.         {
  248.                 address[0] = addr/10 + '0';
  249.                 address[1] = addr%10 + '0';
  250.                 address[2] = '\0';
  251.         }
  252.         
  253.         sprintf((char *)deletecmd, "AT+CMGD=%s", (char *)address);
  254.         
  255.         if(SIM_ERR_NONE == Sim908_SendCmd(deletecmd, "OK", 100, NULL))
  256.         {
  257.                 res = SIM_ERR_NONE;
  258.         }
  259.         
  260.         return res;
  261. }
复制代码
颩色四葉愺 回答时间:2015-1-7 17:44:48
  1. /*
  2.         函数名:Sim908_GPSSet
  3.         描述:        开关GPS
  4.         输入:        u8 status   1:开GPS   0:关GPS
  5.         输出:        1:操作成功   0:操作失败
  6. */
  7. u8 Sim908_GPSSet( u8 status )
  8. {
  9.         u8 res = SIM_ERR_OTHER;
  10.         
  11.         if( status )
  12.         {
  13.         
  14.                 if(SIM_ERR_NONE == Sim908_SendCmd("AT+CGPSPWR=1", "OK", 100, NULL))
  15.                 {
  16.                         if(SIM_ERR_NONE == Sim908_SendCmd("AT+CGPSRST=1", "OK", 100, NULL))
  17.                         {
  18.                                 res = SIM_ERR_NONE;
  19.                         }
  20.                 }
  21.         }
  22.         else
  23.         {
  24.                 if(SIM_ERR_NONE == Sim908_SendCmd("AT+CGPSPWR=0", "OK", 100, NULL))
  25.                 {
  26.                         
  27.                         res = SIM_ERR_NONE;
  28.                 }
  29.         }
  30.         return res;
  31. }
  32. /*
  33. 函数名:Sim908_TCPConnect
  34. 描述: 建立tcp连接
  35. 输入: u8 *ipaddr 要连接的ip地址
  36. u8 *com 要连接的端口
  37. 输出: 1 连接成功
  38. 0 连接失败
  39. */
  40. u8 Sim908_TCPConnect(u8 *ipaddr, u8 *com)
  41. {
  42. u8 cmd[50];
  43. OS_ERR err;
  44. u8 res = SIM_ERR_OTHER;
  45. sprintf(cmd, "AT+CIPSTART="TCP","%s","%s"", ipaddr, com);
  46. if(SIM_ERR_NONE != Sim908_SendCmd("AT+CGCLASS="B"", "OK", 200, NULL))
  47. {
  48. return SIM_ERR_CGCLASS;
  49. }
  50. if(SIM_ERR_NONE != Sim908_SendCmd("AT+CGDCONT=1,"IP","CMNET"", "OK", 200, NULL))
  51. {
  52. return SIM_ERR_CGDCONT;
  53. }
  54. if(SIM_ERR_NONE != Sim908_SendCmd("AT+CGATT=1", "OK", 200, NULL))
  55. {
  56. return SIM_ERR_CGATT;
  57. }
  58. if(SIM_ERR_NONE != Sim908_SendCmd("AT+CIPCSGP=1,"CMNET"", "OK", 200, NULL))
  59. {
  60. return SIM_ERR_CIPCSGP;
  61. }
  62. if(SIM_ERR_NONE != Sim908_SendCmd("AT+CLPORT="TCP","2000"", "OK", 200, NULL))
  63. {
  64. return SIM_ERR_CLPORT;
  65. }
  66. if(SIM_ERR_NONE != Sim908_SendCmd(cmd, "CONNECT OK", 1000, NULL))
  67. {
  68. return SIM_ERR_CIPSTART;
  69. }
  70. else
  71. {
  72. OSFlagPost(&GPRSFlagGrp, FlagGPRSConnect, OS_OPT_POST_FLAG_SET, &err);
  73. res = SIM_ERR_NONE;
  74. }
  75. return res;
  76. }
  77. /*
  78. 函数名:Sim908_TCPSendData
  79. 描述: 在TCP建立连接成功后 调用此函数发送数据
  80. 输入: u8 *data 要发送的数据
  81. 输出: 1 发送成功
  82. 0 发送失败
  83. */
  84. u8 Sim908_TCPSendData( u8 * data)
  85. {
  86. u8 res = SIM_ERR_NONE;
  87. if(NULL == data)
  88. {
  89. return 0;
  90. }
  91. if(SIM_ERR_NONE == Sim908_SendCmd("AT+CIPSEND", ">", 1000, NULL))
  92. {
  93. //Sim908_SendCmd(data, NULL, 1);
  94. USART_printf(USART2, "%s", data);
  95. if(SIM_ERR_NONE == Sim908_SendCmd((u8 *)0x1A, "SEND OK", 1000, NULL))
  96. {
  97. res = SIM_ERR_NONE;
  98. }
  99. }
  100. else
  101. {
  102. res = SIM_ERR_CGATT;
  103. }
  104. return res;
  105. }
  106. /*
  107. 函数名:Sim908_TCPClose
  108. 描述: 关闭TCP连接
  109. 输入: 无
  110. 输出: 1 操作成功
  111. 0 操作失败
  112. */
  113. u8 Sim908_TCPClose( void )
  114. {
  115. OS_ERR err;
  116. u8 res = SIM_ERR_OTHER;
  117. Sim908_SendCmd("AT+CIPCLOSE=1", "CLOSE OK", 100, NULL);
  118. if(SIM_ERR_NONE == Sim908_SendCmd("AT+CIPSHUT", "SHUT OK", 100, NULL))
  119. {
  120. //OSFlagPost(&GPRSFlagGrp, FlagGPRSConnect, OS_OPT_POST_FLAG_CLR, &err);
  121. res = SIM_ERR_NONE;
  122. }
  123. return res;
  124. }
  125. <blockquote>
复制代码
颩色四葉愺 回答时间:2015-1-7 17:45:12
/*        函数名:Sim908_GetGPSInformation        描述:        获取GPS的相关数据        输入:        GPSStruct *gpsstruct   保存gps数据的结构体                                        u8 *str        保存gps数据的数组指针        输出:        1 操作成功   0 操作失败*/u8 Sim908_GetGPSInformation(GPSStruct *gpsstrucr, u8 *pdatabuff){                u8 *p1 = NULL;        u8 *p2 = NULL;        u8 res = SIM_ERR_OTHER;        u8 gpsdatabuff[100];                if(SIM_ERR_NONE == Sim908_SendCmd("AT+CGPSSTATUS?", "D Fix", 200, NULL))        {                if(SIM_ERR_NONE == Sim908_SendCmd("AT+CGPSINF=32", ",A,", 200, &gpsdatabuff[0]))                {                        if(NULL != pdatabuff)                        {                                strcpy(pdatabuff, gpsdatabuff);                        }                        p1 = (u8 *)strstr((char *)gpsdatabuff, ",");                        p2 = (u8 *)strstr((char *)(p1+1), ",");                        Sim908_CopyStr(gpsstrucr->Time, p1+1, p2);                                                p1 = (u8 *)strstr((char *)(p2+1), ",");                        p2 = (u8 *)strstr((char *)(p1+1), ",");                        Sim908_CopyStr(gpsstrucr->Latitude, p1+1, p2+2);                                                                                                        p1 = p2 + 3;                        p2 = (u8 *)strstr((char *)p1, ",");                        Sim908_CopyStr(gpsstrucr->Longtude, p1, p2+2);                                                                                p1 = p2 + 3;                        p2 = (u8 *)strstr((char *)p1, ",");                        Sim908_CopyStr(gpsstrucr->Speed, p1, p2);                                                p1 = p2 + 1;                        p2 = (u8 *)strstr((char *)p1, ",");                        Sim908_CopyStr(gpsstrucr->Direction, p1, p2);                                                p1 = p2 + 1;                        p2 = (u8 *)strstr((char *)p1, ",");                        Sim908_CopyStr(gpsstrucr->Data, p1, p2);                                                res = SIM_ERR_NONE;                }        }        else        {                res = SIM_ERR_GPSNOTFIX;        }        return res;}/*        函数名:Sim908_GPSConvert        描述:        GPS单位转换 GPS读出的数据单位是 (ddmm.mmmm) 要转换为d        输入:        u8 *latitude 转换前的纬度                                        u8 *longtude 转换前的经度                                        u8 *location 转换后的经纬度信息        输出:        无*/void Sim908_GPSConvert(u8 *latitude, u8 *longtude, u8 *location ){        u8 *p1 = NULL;        u8 *p2 = NULL;         u32 data = 0;        u8 i = 0;        u8 j = 0;        u8 a = 0;                p1 = (u8 *)strstr((char *)latitude, ".");        a = p1 - latitude;        if(a == 5)        {                for(j=0; j<3; j++)                {                        location[i] = latitude[i];                        i++;                }        }        if(a == 4)        {                for(j=0; j<2; j++)                {                        location[i] = latitude[i];                        i++;                }        }        if(a == 3)        {                for(j=0; j<1; j++)                {                        location[i] = latitude[i];                        i++;                }        }                location[i] = '.';        data = 0;        data += (*(p1 - 2) - '0') * 10000000;        data += (*(p1 - 1) - '0') * 1000000;        data += (*(p1 + 1) - '0') * 100000;        data += (*(p1 + 2) - '0') * 10000;        data += (*(p1 + 3) - '0') * 1000;        data += (*(p1 + 4) - '0') * 100;        data += (*(p1 + 5) - '0') * 10;        data += (*(p1 + 6) - '0') ;                data /= 60;        for(j=6; j>0;j--)        {                location[i+j] = data%10 + '0' ;                data /= 10;        }        if(strstr((char *)latitude, "N"))        {                location[i+7] = 'N';                location[i+8] = ' ';        }        if(strstr((char *)latitude, "S"))        {                location[i+7] = 'N';                location[i+8] = ' ';        }                i += 9;        p2 = (u8 *)strstr((char *)longtude, ".");        a = p2 - longtude;        if(a == 5)        {                for(j=0; j<3; j++)                {                        location[i] = longtude[j];                        i++;                }        }        if(a == 4)        {                for(j=0; j<2; j++)                {                        location[i] = longtude[j];                        i++;                }        }        if(a == 3)        {                for(j=0; j<1; j++)                {                        location[i] = longtude[j];                        i++;                }        }                location[i] = '.';        data = 0;        data += (*(p2 - 2) - '0') * 10000000;        data += (*(p2 - 1) - '0') * 1000000;        data += (*(p2 + 1) - '0') * 100000;        data += (*(p2 + 2) - '0') * 10000;        data += (*(p2 + 3) - '0') * 1000;        data += (*(p2 + 4) - '0') * 100;        data += (*(p2 + 5) - '0') * 10;        data += (*(p2 + 6) - '0') ;                        data /= 60;                for(j=6; j>0;j--)        {                location[i+j] = data%10 + '0' ;                data /= 10;        }        if(strstr((char *)longtude, "W"))        {                location[i+7] = 'W';                location[i+8] = '\0';        }        if(strstr((char *)GPS_STR.Longtude, "E"))        {                location[i+7] = 'E';                location[i+8] = '\0';        }        }
颩色四葉愺 回答时间:2015-1-7 17:45:59
  1. /*
  2.         描述:在str1中查找str2,忽略str2中的不可显示字符
  3. */
  4. u8 Sim908_CheckPassword(u8 *str1, u8 *str2)
  5. {
  6.         u8 i = 0;
  7.         if((NULL == str1) || (NULL == str2))
  8.         {
  9.                 return SIM_ERR_OTHER;
  10.         }
  11.         
  12.         while( *str1 )
  13.         {
  14.                 i = 0;
  15.                 while( 1 )
  16.                 {
  17.                         if(str2[i] == 0)
  18.                         {
  19.                                 return SIM_ERR_NONE;
  20.                         }
  21.                         if(str2[i] != str1[i])
  22.                         {
  23.                                 break;
  24.                         }
  25.                         i++;
  26.                 }
  27.                 str1++;
  28.         }
  29.         return SIM_ERR_OTHER;
  30. }
  31.                
  32.         
  33. /*
  34.         函数名:Sim908_TimeAdjust
  35.         描述:        用gps获取的时间来校准RTC
  36.         输入:        struct tm *tm_t        //保存日历时间的结构体指针
  37.         输出:        无
  38. */
  39. void Sim908_TimeAdjust(struct tm *tm_t)
  40. {
  41.         
  42.                 tm_t->tm_sec = (GPS_STR.Time[4] - '0') * 10 + GPS_STR.Time[5] - '0';
  43.                 tm_t->tm_min = (GPS_STR.Time[2] - '0') * 10 + GPS_STR.Time[3] - '0';
  44.                 tm_t->tm_hour = (GPS_STR.Time[0] - '0') * 10 + GPS_STR.Time[1] - '0' + 8;        //GPS为UTC时间 与中国时差为8
  45.                 tm_t->tm_mday = (GPS_STR.Data[0] - '0') * 10 + GPS_STR.Data[1] - '0';
  46.                 tm_t->tm_mon = (GPS_STR.Data[2] - '0') * 10 + GPS_STR.Data[3] - '0' - 1;
  47.                 tm_t->tm_year = (GPS_STR.Data[4] - '0') * 10 + GPS_STR.Data[5] - '0' + 2000;
  48.         
  49.                 if(tm_t->tm_hour > 23)
  50.                 {
  51.                         tm_t->tm_hour -= 24;
  52.                         tm_t->tm_mday++;
  53.                         if(tm_t->tm_mon==0||tm_t->tm_mon==2||tm_t->tm_mon==4||tm_t->tm_mon==6||tm_t->tm_mon==7||\
  54.                                 tm_t->tm_mon==9||tm_t->tm_mon==11)
  55.                         {
  56.                                 if(tm_t->tm_mday > 31)
  57.                                 {
  58.                                         tm_t->tm_mday = 1;
  59.                                         tm_t->tm_mon++;
  60.                                         if(tm_t->tm_mon > 11)
  61.                                         {
  62.                                                 tm_t->tm_mon = 0;
  63.                                                 tm_t->tm_year++;
  64.                                         }
  65.                                 }
  66.                         }
  67.                         else if(tm_t->tm_mon==4||tm_t->tm_mon==6||tm_t->tm_mon==9||tm_t->tm_mon==10)
  68.                         {
  69.                                 if(tm_t->tm_mday > 30)
  70.                                 {
  71.                                         tm_t->tm_mday = 1;
  72.                                         tm_t->tm_mon++;
  73.                                        
  74.                                 }
  75.                         }
  76.                         else
  77.                         {
  78.                                 if((tm_t->tm_year%4==0&&tm_t->tm_year%100!=0)||(tm_t->tm_year%400))        //闰年
  79.                                 {
  80.                                         if(tm_t->tm_mday > 29)
  81.                                         {
  82.                                                 tm_t->tm_mday = 1;
  83.                                                 tm_t->tm_mon++;
  84.                                         }
  85.                                 }
  86.                                 else        //非闰年
  87.                                 {
  88.                                         if(tm_t->tm_mday > 28)
  89.                                         {
  90.                                                 tm_t->tm_mday = 1;
  91.                                                 tm_t->tm_mon++;
  92.                                         }
  93.                                 }
  94.                         }
  95.                 }
  96.                 RTC_SetCalendarTime( *tm_t );
  97.         
  98. }
复制代码

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版