?? m32.c
字號:
gsm_task++;
}
else
{
putstring1("No \"RING\"!\r\n");
putbyte('\r');
delay_ms(20);
ATSend("AT\r");
}
break;
case 4://get call number:
ATSend("AT+CLCC\r");
ReadSerail(ans, 128, &n,5);
putstring1("CLCC:\r\n");
putstring1(ans);
putstring1("\r\n");
if((strstr(ans,"+CLCC: ")) == NULL){
putbyte('\r');
delay_ms(200);
break;
}
if((ptr=strstr(ans,",\"")) == NULL){
putbyte('\r');
delay_ms(200);
break;
}
else
{
putstring1("Phone Number=:\r\n");
putstring1(ptr);
putstring1("\r\n");
ClearBuf(TPA,16);
if(strncpy(TPA,ptr,16)== NULL)
{
putstring1("Number copy fail!\r\n");
putstring1("HangUpCall\r\n");
HangUpCall();
SysTimer=10;
while(SysTimer);
putbyte('\r');
gsm_task = 0;
return 0;
}
putstring1("Number copy ok!\r\n");
putstring1("HangUpCall\r\n");
HangUpCall();
for(i=0;i<16;i++)
{
//if((i>10)&&(TPA[i]=='\"'))
if((TPA[i]=='\"')&&(TPA[i+1]==','))
{
TPA[i]='\0'; //第二個"后面清0;
break;
}
}
if(strlen(TPA)<12)
{
gsm_task=0;
return 0;
}
gsm_task++;
}
break;
case 5:
//實時查詢:
putstring1("Check Right PhoneNumber?\r\n");
if(gsmSearchPhone("M")==0 && gsmSearchPhone("A")==0 \
&& gsmSearchPhone("B")==0 && gsmSearchPhone("C")==0 \
&& gsmSearchPhone("D")==0)
{
//如果沒有設(shè)置任何授權(quán)號碼,追蹤器則會回復(fù)位置信息。
gsm_task++;
break;
}
if(gsmCheckRightNumber("M",0)==NULL && gsmCheckRightNumber("A",0)==NULL \
&& gsmCheckRightNumber("B",0)==NULL && gsmCheckRightNumber("C",0)==NULL \
&& gsmCheckRightNumber("D",0)==NULL)
{
//如果撥打的號碼不是已授權(quán)號碼,追蹤器不會回應(yīng)
gsm_task=0;
}
//當(dāng)已授權(quán)號碼撥打追蹤器上的號碼時,追蹤器會自動掛斷并同時發(fā)送一條實時位置信息:
TPA[0]=SCA[0]; //與短消息中心號碼前兩位"86" 一致。
TPA[1]=SCA[1];
gsm_task++;
break;
case 6:
#if 0
//2.設(shè)置短消息格式: AT+CMGF=0<CR>
sprintf(cmd, "AT+CMGF=1\r\n"); // 生成命令 (0==PDU mode)
ATSend(cmd); // 先輸出命令串
sprintf(cmd, "AT+CMGF?\r\n"); // 生成命令 (0==PDU mode)
ATSend(cmd); // 先輸出命令串
ReadSerail(ptr, 128, &n,5);
if((ptr=strstr(ptr,"+CMGF: ")) == NULL) break;
ptr +=7;
sscanf(ptr, "%d", &n);
if(n != 1)break;
putstring1("Mode:\r\n");
putstring1("TEXT mode");
putstring1("\r\n");
#endif
gsm_task++;
break;
case 7:
gsm_task++;
break;
case 8:
gsm_task++;
break;
case 9: //wait longitude & lantitude
ReadGPS();
if(GPSReady==TRUE )
{
if(GPSav ==0)
{
strncpy(ans,TP_UD,strlen(TP_UD));
sprintf(TP_UD,"WeakSignal,LastLocated:\r\n");
strcat(TP_UD, ans);
}
putstring1("TP_UD=:\r\n");
putstring1(TP_UD);
putstring1("\r\n");
//gpsWait=0;
GPSReady=FALSE;
gsm_task++;
}
#if 0
else
{
if(gpsWait++>250)
{
strncpy(ans,TP_UD,strlen(TP_UD));
sprintf(TP_UD,"Weak Signal,last located:\r\n");
strcat(TP_UD, ans);
gpsWait=0;
gsm_task=0;
}
}
#endif
break;
case 10:
if(gsmSendMessage())
{
gsm_task=0;
break;
}
break;
//aLength = gsmEncodePdu(pdu); // 根據(jù)PDU參數(shù),編碼PDU串
strcat(pdu, "\x01a"); // 以Ctrl-Z結(jié)束
gsm_task++;
break;
case 11:
gsmString2Bytes(pdu, &nSmscLength, 2); // 取PDU串中的SMSC信息長度
nSmscLength++; // 加上長度字節(jié)本身
//命令中的長度,不包括SMSC信息長度,以數(shù)據(jù)字節(jié)計
//sprintf(cmd, "AT+CMGS=%d\r", aLength/2-nSmscLength); // 生成命令
ATSend(cmd);
ReadSerail(ans, 128, &n,5);
if((ptr=strstr(ans,"\r\n> ")) != NULL)
gsm_task++;
else
{
putbyte('\r');
delay_ms(200);
}
break;
case 12: //send pdu;
ATSend(pdu); // 得到肯定回答,繼續(xù)輸出PDU串
ReadSerail(ans, 128, &n,5);
if((strstr(ans, "+CMGS: ")) == NULL)
{
putbyte('\r');
delay_ms(20);
gsm_task=0;
break;
}
else
{
putstring1("SMSC ANSWER:Err\r\n");
putbyte('\r');
delay_ms(200);
gsm_task=11;
}
break;
case 13: //recieve SMS
ATSend("AT+CPMS=\"SM\"\r");
ReadSerail(ans, 128, &n,5);
#if 0
putstring1("AT+CPMS:\r\n");
putstring1(ans);
putstring1("\r\n");
#endif
if((ptr=strstr(ans,"+CPMS:")) == NULL)
{
putbyte('\r');
delay_ms(20);
break;
}
gsm_task++;
break;
case 14:
//設(shè)置短消息到達(dá)通知: AT+CNMI=1,1,0,0,1<CR> (此命令可以使GSM模塊在短消息到達(dá)后向MCU發(fā)送指令:AT+CMTI:"SM",INDEX<CR>)
ATSend("AT+CNMI=1,1,0,0,1\r"); //1=SM卡
ReadSerail(ans, 128, &n,5);
if(strstr(ans,"\r\nOK")==NULL)
{
putbyte('\r');
break;
}
#if 0
putstring1("AT+CNMI:\r\n");
putstring1(ans);
putstring1("\r\n");
#endif
ATSend("AT+CNMI?\r");
ReadSerail(ans, 128, &n,5);
#if 0
putstring1("AT+CNMI?\r\n");
putstring1(ans);
putstring1("\r\n");
#endif
if((ptr=strstr(ans,"+CNMI:")) == NULL)
{
putbyte('\r');
break;
}
gsm_task++;
break;
case 15:
ReadSerail(ans, 128, &n,5);
if((ptr=strstr(ans,"+CMTI:"))== NULL)
{
if((ptr=strstr(ans,"RING"))== NULL){
#if 1
if(AlarmFlag==1)
{
AlarmFlag=0;
gsm_task = 30;
}
#endif
break;
}
else
{
putstring1("You have call!\r\n");
gsm_task=4; //get call number.
break;
}
}
putstring1("You have message!\r\n");
//+CMTI: "SM",17
ptr +=12;
sscanf(ptr, "%d", &index);
putstring1("SMS Number:\r\n");
sprintf(cmd,"%d",index);
putstring1(cmd);
putstring1("\r\n");
gsm_task++;
break;
case 16:
//index=17;
sprintf(cmd, "AT+CMGR=%d\r", index); // 生成命令
ATSend(cmd);
ReadSerail(ans, 256, &n,5);
if((ptr=strstr(ans,"+CMGR: "))== NULL){
if((ptr=strstr(ans,"ERROR")) != NULL)
{
putbyte('\r');
SysTimer=20;
while(SysTimer);
}
break;
}
putstring1("\r\n");
putstring1(ptr);
putstring1("\r\n");
ptr +=6;
if((ptr=strstr(ptr,"\r\n"))== NULL)
{
putbyte('\r');
break;
}
ptr +=2; //skip \r\n
gsmDecodePdu(ptr);
gsmDeleteSms(index);
if(gsmDoUserTask(TP_UD)==2)
{
gsm_task=0;
break;
}
gsm_task++;
putbyte('\r');
break;
case 17:
TPA[0]=SCA[0];
TPA[1]=SCA[1];
gsm_task = 10; //send message
break;
case 25:
if(gsmSearchPhone("MASTER")==TRUE)
{
gsm_task++;
}
//else
//ATSend("ATD13554997942;\r\n");
gsm_task++;
break;
case 30:
//緊急報警:追蹤器前面的紅色按鈕為一個緊急按鈕,當(dāng)它為按下,追蹤器會發(fā)送"Help me!"和地理位置信息到所有已授權(quán)號碼。
ReadGPS();
#if 0
putstring1("JWD?\r\n");
putstring1(TP_UD);
putstring1("\r\n");
#endif
strncpy(ans,TP_UD,strlen(TP_UD));
sprintf(TP_UD,"Help me!\r\n");
strcat(TP_UD, ans);
if(gsmGetRightNumber("M"))
{
gsmSendMessage();
}
if(gsmGetRightNumber("A"))
{
gsmSendMessage();
}
if(gsmGetRightNumber("B"))
{
gsmSendMessage();
}
if(gsmGetRightNumber("C"))
{
gsmSendMessage();
}
if(gsmGetRightNumber("D"))
{
gsmSendMessage();
}
gsm_task=0;
break;
case 40:
//追蹤器每隔30 S回復(fù)一條地理位置信息
ReadGPS();
#if 0
putstring1("JWD?\r\n");
putstring1(TP_UD);
putstring1("\r\n");
putstring1("TPA=:\r\n");
putstring1(TPA);
putstring1("\r\n");
#endif
if(gsmSendMessage())
{
if(GPSTimerReq==TRUE)
{
GPSTimer30=_30_SEC;
}
gsm_task=0;
}
break;
default:
break;
}
return 7;
}
//AT+CLCC:列出當(dāng)前呼叫
//AT+CLIP?
/*
在使用AT命令設(shè)置顯示呼入號碼時,應(yīng)注意AT+CLIP、AT+CLCC及AT^SCNI三者的區(qū)別:雖然三者都在有語音呼入時顯示對方號碼,
但AT+CLCC與AT^SCNI,只對當(dāng)前呼叫的當(dāng)前振鈴有效;而AT+CLIP 有效期從開機(jī)設(shè)置至關(guān)機(jī),對所有呼叫的所有振鈴均有效。
*/
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -