📄 bak-m32.c
字号:
1.设置短消息中心号码: AT+CSCA="+8613800755500" <CR>. (地区不同,设置不同)
2.设置短消息格式: AT+CMGF=0<CR> (0==PDU mode)
3.设置短消息存放的位置: AT+CPMS="SM"<CR> (SM表示将短消息存放在SIM卡中)
4.设置短消息到达通知: AT+CNMI=1,1,0,0,1<CR> (此命令可以使GSM模块在短消息到达后向MCU发送指令:AT+CMTI:"SM",INDEX<CR>)
*****************************************************************************************************************/
void gsmModule_init(void)
{
int xdata i,nNumRead;
char xdata* ptr;
GSM_PWON=HIGH;
delay_ms(5);
GSM_PWON=LOW;
delay_ms(200); //Over 120 ms,M32 power on.
GSM_PWON=HIGH;
delay_ms(200);
gsm_task = 0;
sprintf(cmd, "AT\r\n"); // 生成命令
putstring(cmd); // 先输出命令串
delay_ms(200);
sprintf(cmd, "AT\r\n"); // 生成命令
putstring(cmd); // 先输出命令串
SysTimer=20;
while(SysTimer);
}
void HangUpCall(void)
{
//sprintf(cmd, "AT+CHUP\r\n"); // 生成命令
sprintf(cmd, "ATH\r\n"); // 生成命令
putstring(cmd); // 先输出命令串
}
void RecieveCall(void) //接电话,回应呼叫
{
sprintf(cmd, "ATA\r\n"); // 生成命令
putstring(cmd); // 先输出命令串
}
void Recall(void)
{
sprintf(cmd, "ATDL\r\n"); // 生成命令
putstring(cmd); // 先输出命令串
}
//AT+CPAS :查询模块当前活动状态
uchar gsmStatus(void)
{
int xdata i,n;
uchar xdata* ptr;
uchar xdata* psr;
ptr=ans;
switch(gsm_task)
{
case 0:
gsm_task++;
break;
case 1: //check GSM status:
sprintf(cmd, "AT+CPAS\r\n"); // 生成命令
putstring(cmd); // 先输出命令串
ReadSerail(ptr, 128, &n,5);
if((ptr=strstr(ptr,"+CPAS:")) != NULL)
{
ptr +=6;
sscanf(ptr, "%d", &n);
if(n==0) //0-- ready
{
//putstring("ATD13554997942;\r\n"); // 先输出命令串
}
else
if(n==3) //3--ring
{
gsm_task=2; //check "RING" ?
}
else
if(n==5) //5-- asleep
{
}
}
break;
case 2: //check ring ?
ReadSerail(ptr, 128, &n,5);
if((ptr=strstr(ptr,"RING")) != NULL)
{
delay_ms(200);
SysTimer=15;
gsm_task++;
}
else
if((ptr=strstr(ptr,"NO CA")) != NULL)
{
//putstring("ATD13554997942;\r\n"); // 先输出命令串
}
break;
case 3://get call number:
sprintf(cmd, "AT+CLCC\r\n"); // 生成命令
putstring(cmd); // 先输出命令串
ReadSerail(ptr, 128, &n,5);
if((ptr=strstr(ptr,"+CLCC: ")) != NULL)
{
HangUpCall();
SysTimer=50;
while(SysTimer);
#if 1
//目标号码或回复号码(TP-DA或TP-RA)
if((psr=strstr(ptr,",\"")) != NULL)
{ gsm_task=11;
return 0;
psr +=1; //skip ','
if(strncpy(TPA,psr,16) != NULL) //TPA[]="+8613800755500"
{
for(i=0;i<16;i++)
{
if((i>2)&&(TPA[i]=='\"'))
{
TPA[i+1]=0; //第二个"后面清0;
break;
}
}
if(strncpy(ptr,TPA,strlen(TPA)) != NULL)
{
ptr[strlen(TPA)+1]=0;
ptr +=1;
#if 0 //DEBUG return call.
sprintf(pdu, "ATD"); // 生成命令
strcat(pdu, ptr);
strcat(pdu, ";\r\n");
putstring(pdu); // 先输出命令串
gsm_task=0;
#else
gsm_task=4; //start recieve GPS & send massage
return 0;
#endif
}
}
}
#else
//目标号码或回复号码(TP-DA或TP-RA)
if((ptr=strstr(ptr,",\"")) != NULL)
{
ptr +=2;
for(i=0;i<128;i++)
{
if ((ptr[i]=='\"') && (ptr[i+1]=','))
{
ptr[i]=0;
//TPA[16]; // 目标号码或回复号码(TP-DA或TP-RA)
#if 0 //DEBUG return call.
sprintf(pdu, "ATD"); // 生成命令
strcat(pdu, ptr);
strcat(pdu, ";\r\n");
putstring(pdu); // 先输出命令串
gsm_task=0;
#else
gsm_task=4; //start recieve GPS & send massage
return 0;
#endif
}
}
}
#endif
}
break;
case 4://start recieve GPS:
//0。读短消息中心号码:
sprintf(cmd, "AT+CSCA?\r\n"); // 生成命令
putstring(cmd); // 先输出命令串
ReadSerail(ptr, 128, &n,5);
if((ptr=strstr(ptr, "+CSCA: ")) != NULL)
{
#if 1
if((psr=strstr(ptr, "\"+")) != NULL)
{
if(strncpy(SCA,psr,16) != NULL) //SCA[]="+8613800755500"
{
for(i=0;i<16;i++)
{
if((i>2)&&(SCA[i]=='\"'))
{
SCA[i+1]=0; //第二个"后面清0;
psr +=16;
strncpy(cmd,psr,6);
cmd[6]=0;
SysTimer=50;
while(SysTimer);
gsm_task=5;
break;
}
}
}
}
#else
if((psr=strstr(ptr, "\"+")) != NULL)
{
if(strncpy(SCA,psr,16) != NULL) //SCA[]="+8613800755500"
{
SCA[16]=0; //get SCA address Ok.
psr +=16;
strncpy(cmd,psr,6);
cmd[6]=0;
SysTimer=50;
while(SysTimer);
gsm_task=5;
}
}
#endif
}
break;
case 5:
//1.设置短消息中心号码: AT+CSCA="+8613800755500" <CR>. (地区不同,设置不同)
sprintf(ptr, "AT+CSCA="); // 生成命令
//strncat(ptr, SCA,16);
strncat(ptr, SCA,strlen(SCA));
ptr[8]='\"';
//ptr[23]='\"';
ptr[strlen(SCA)+7]='\"';
strcat(ptr, cmd);
putstring(ptr); // 先输出命令串
gsm_task++;
break;
case 6:
//2.设置短消息格式: AT+CMGF=0<CR>
sprintf(cmd, "AT+CMGF=1\r\n"); // 生成命令 (0==PDU mode)
putstring(cmd); // 先输出命令串
sprintf(cmd, "AT+CMGF?\r\n"); // 生成命令 (0==PDU mode)
putstring(cmd); // 先输出命令串
ReadSerail(ptr, 128, &n,5);
if((ptr=strstr(ptr,"+CMGF: ")) != NULL)
{
gsm_task=11;
break;
}
break;
case 7:
//查询: AT+CMGF? (answer: +CMGF=0/1 OK)
break;
case 8:
//3.设置短消息存放的位置: AT+CPMS="SM"<CR> (SM表示将短消息存放在SIM卡中)
sprintf(cmd, "AT+CPMS=\"SM\"\r\n"); // 生成命令
putstring(cmd); // 先输出命令串
ReadSerail(ptr, 128, &n,5);
if((ptr=strstr(ptr,"+CPMS:")) != NULL) gsm_task=9;
break;
case 9:
//4.设置短消息到达通知: AT+CNMI=1,1,0,0,1<CR> (此命令可以使GSM模块在短消息到达后向MCU发送指令:AT+CMTI:"SM",INDEX<CR>)
sprintf(cmd, "AT+CNMI=1,1,0,0,1\r\n"); // 生成命令
putstring(cmd); // 先输出命令串
delay_ms(200);
sprintf(cmd, "AT+CNMI?\r\n"); // 生成命令
putstring(cmd); // 先输出命令串
ReadSerail(ptr, 128, &n,5);
if((ptr=strstr(ptr,"+CNMI:")) != NULL) gsm_task=10;
break;
case 10:
//SCA[16]; // 短消息服务中心号码(SMSC地址)
// TPA[16]; // 目标号码或回复号码(TP-DA或TP-RA)
TP_PID=0; // 用户信息协议标识(TP-PID)
TP_DCS=GSM_8BIT; // 用户信息编码方式(TP-DCS)
//TP_SCTS[16]; // 服务时间戳字符串(TP_SCTS), 接收时用到
//TP_UD[161]; // 原始用户信息(编码前或解码后的TP-UD)
//strncmp(TP_UD,m_Buffer,10);
sprintf(TP_UD, "TEST GWM!");
index=0; // 短消息序号,在读取时用到
gsm_task++;
//gsmSendMessage();
break;
case 11:
SysTimer=50;
while(SysTimer);
putstring("ATD13554997942;\r\n");
gsm_task=0;
break;
#if 0
SysTimer=50;
while(SysTimer);
putstring("ATD13554997942;\r\n");
gsm_task++;
#endif
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 + -