📄 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)
{
//如果没有设置任何授权号码,追踪器则会回复位置信息。
gsm_task++;
break;
}
if(gsmCheckRightNumber("M",0)==NULL && gsmCheckRightNumber("A",0)==NULL \
&& gsmCheckRightNumber("B",0)==NULL && gsmCheckRightNumber("C",0)==NULL \
&& gsmCheckRightNumber("D",0)==NULL)
{
//如果拨打的号码不是已授权号码,追踪器不会回应
gsm_task=0;
}
//当已授权号码拨打追踪器上的号码时,追踪器会自动挂断并同时发送一条实时位置信息:
TPA[0]=SCA[0]; //与短消息中心号码前两位"86" 一致。
TPA[1]=SCA[1];
gsm_task++;
break;
case 6:
#if 0
//2.设置短消息格式: 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); // 根据PDU参数,编码PDU串
strcat(pdu, "\x01a"); // 以Ctrl-Z结束
gsm_task++;
break;
case 11:
gsmString2Bytes(pdu, &nSmscLength, 2); // 取PDU串中的SMSC信息长度
nSmscLength++; // 加上长度字节本身
//命令中的长度,不包括SMSC信息长度,以数据字节计
//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); // 得到肯定回答,继续输出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:
//设置短消息到达通知: AT+CNMI=1,1,0,0,1<CR> (此命令可以使GSM模块在短消息到达后向MCU发送指令: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:
//紧急报警:追踪器前面的红色按钮为一个紧急按钮,当它为按下,追踪器会发送"Help me!"和地理位置信息到所有已授权号码。
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回复一条地理位置信息
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:列出当前呼叫
//AT+CLIP?
/*
在使用AT命令设置显示呼入号码时,应注意AT+CLIP、AT+CLCC及AT^SCNI三者的区别:虽然三者都在有语音呼入时显示对方号码,
但AT+CLCC与AT^SCNI,只对当前呼叫的当前振铃有效;而AT+CLIP 有效期从开机设置至关机,对所有呼叫的所有振铃均有效。
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -