本帖最后由 颩色四葉愺 于 2015-1-7 17:41 编辑
用到sim908进行拨话,与短信、GPS、GPRS服务,需要对模块返回来的信息进行处理,
源程序如下:- #include "sim908.h"
- #include "stdio.h"
- #include "string.h"
- #include "usart.h"
- #include "ff.h"
- #include "includes.h"
- #include "rtc.h"
- #include "i2c_ee.h"
- #include "includes.h"
- u8 Sim_Battery[4]; //电池
- u8 Sim_RSSI[3]; //信号强度
- u8 Sim_Operator = 0; //运营商 1为中国移动
- u8 GSM_Response[10];
- u8 RingNumber[20]; //来电号码
- u8 Messagenum; //保存短信数目
- u8 Messagebuff[50]; //保存短信状态 0 空 1 未读 2 命令短信 3非命令短信
- char ADMINISTRATORPHONE[20] = "13729058953";
- char IPADDR[20] = "220.170.79.210";
- char COM[6] = "40487";
- char PASSWORD[10] = "0000000000";
- u8 LOCATION[30];
- Messagestr MES_STR;
- GPSStruct GPS_STR;
- /*
- 函数名:Sim908_IOConfig
- 描述: 复位
- 输入: 无
- 输出: 无
- */
- void Sim908_IOConfig( void )
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
-
- }
- void Sim908_Reset( void )
- {
- OS_ERR err;
- GPIO_SetBits(GPIOA, GPIO_Pin_1);
- OSTimeDlyHMSM( 0, 0, 2, 0, OS_OPT_TIME_HMSM_STRICT, &err);
- GPIO_ResetBits(GPIOA, GPIO_Pin_1);
- }
- /*
- 函数名:Sim908_SendCmd
- 描述: 发送at命令,并检验是否收到想要的响应
- 输入: u8 *cmd 要发送的命令
- u8 *ack 期待的响应
- u16 waittime 等待时间 单位10ms
- u8 *pBuff 接收响应的缓存区地址 为NULL则不保存响应数据
- 输出:
- */
- u8 Sim908_SendCmd(u8 *cmd, u8 *ack, u16 waittime, u8 *pBuff)
- {
- u8 res = SIM_ERR_OTHER;
- u8 *pdata = NULL;
- CPU_TS ts;
- OS_ERR err;
- OS_MSG_SIZE msg_size;
-
- OSMutexPend(&Mutex_USART2, 30000, OS_OPT_PEND_BLOCKING, &ts, &err);
- if( (u32)cmd <= 0xff ) //用于发送结束标志 0x1A
- {
- USART2->DR = (u32)cmd;
- }
- else
- {
- printf("%s\r\n", ( char *)cmd);
- }
- if(ack != NULL)
- {
- strcpy((char *)&GSM_Response[0], (char *)ack);
- while(waittime--)
- {
- //OSSemPend(&Sem_GSMResponse, 10, OS_OPT_PEND_BLOCKING, &ts, &err); //等待信号量
- pdata = OSQPend(&Q_GSMResponse, 10, OS_OPT_PEND_BLOCKING, &msg_size, &ts, &err);
- if(err == OS_ERR_NONE)
- {
- if((NULL != pBuff)&&(NULL != pdata))
- {
- strcpy((char *)pBuff, (char *)pdata);
- }
- OSMemPut(&MyPartition, pdata, &err);
- res = SIM_ERR_NONE;
- break;
- }
- }
- if(err != OS_ERR_NONE)
- {
- res = SIM_ERR_TIMEOUT;
- }
- }
- OSMutexPost(&Mutex_USART2, OS_OPT_POST_NONE, &err);
-
- return res;
- }
复制代码
|
/*
函数名: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';
}
}