📄 gsm.txt
字号:
GSM MODEM的收发程序奉献出来
将外置GSM MODEM的收发程序奉献出来.
这个是经过测试的.很好用.稍微慢了点.
//GSM MODEM通信任务
void ModemInitTask(void * argv)
{
argv=argv;
UART_Init(COMPORT);
for(;;)
{
UART_open(COMPORT,9600,8,'n',1,0);
OSTimeDly(OS_TICKS_PER_SEC);
if (ModemInit(COMPORT)==true)
{
char * s;
s="\r\nAT+CMGL=ALL\r\0";
OSTimeDlyHMSM(0,0,1,0);//延时1s读一次MODEM,时间自定
if(true==UART_write(COMPORT,s,strlen(s),200)) //向MODEM发AT命令
{
INT16U i=0, len;
char databuff[1024];;
OSTimeDly(OS_TICKS_PER_SEC);
i=0;while(i<1024) databuff[i++]=0;
len=UART_read(COMPORT,databuff,sizeof(databuff),OS_TICKS_PER_SEC);//读AT命令的返回信息 览???? ??? ??
if (len>27)
{
char * p[20],* buff;
char strtel[20];
char num[4];
INT16U ii=0;
buff=databuff;
i=0;
while((p[i]=strtok(buff,"\n"))!=NULL) //分割字符串
{
buff=NULL;
if (i==0) {i++; continue;}
if(i%2!=0)
{
char * temp;
if((temp=strstr(p[i],"+86"))!=NULL)//14手机号码
{
ii=0;while(ii<14) strtel[ii++]=0;
ii=0;while(ii<14) strtel[ii++]=*temp++;
strcat(strtel,"\r\n\0");
}
if((temp=strstr(p[i],"+CMGL:"))!=NULL)//取短消息序号
{
char strnum[4];
INT16U j=0;
char * p=temp+6;//+6去掉"+CMGL:"
ii=0;while(ii<4)
{
num[ii]=0;
strnum[ii]=0;
strnum[ii]=*p++;
ii++;
}
ii=0;while(ii<4)
{
if (strnum[ii]>=0x30 && strnum[ii]<=0x39)
num[j++]=strnum[ii];
ii++;
}
}
}
else /////if(i%2==0)
{
char strbuff[SMSLEN];
char CMGD[20];
char temp[40];
char *pCMGS;
char *pCMGD;
/////CMGD删除短消息AT命令
ii=0;while(ii<20) CMGD[ii++]=0;
s=NULL;
s="\r\nAT+CMGD=";
strcat(CMGD,s);
strcat(CMGD,num);
ii=0;while(ii<4) num[ii++]=0;//清除序号
strcat(CMGD,"\r\n\0");
///////////////////////
if(*p[i]!='!')
{
//删除非法短信
pCMGD=CMGD;
if (TRUE==UART_write(COMPORT,pCMGD,sizeof(pCMGD),OS_TICKS_PER_SEC))
{
pCMGD=NULL;
DelayNS(2000);
OSTimeDly(OS_TICKS_PER_SEC);
//ii=0;while(ii<20) CMGD[ii++]=0;
}
i++;continue;
}
if(strlen(p[i])<40)
{
//删除非法短信
pCMGD=CMGD;
if (TRUE==UART_write(COMPORT,pCMGD,sizeof(pCMGD),OS_TICKS_PER_SEC))
{
pCMGD=NULL;
DelayNS(2000);
OSTimeDly(OS_TICKS_PER_SEC);
//ii=0;while(ii<20) CMGD[ii++]=0;
}
i++;continue;
}
//////////////////////
///////////////////////发送电话号码AT命令
ii=0; while(ii<(40)) temp[ii++]=0;
strcat(temp,"\r\nAT+CMGS=");
strcat(temp,strtel);
ii=0; while(ii<20) strtel[ii++]=0;//清除TEL
///////////////////////监控协议解析
ii=0; while(ii<SMSLEN) strbuff[ii++]=0;
ii=0; while(*p[i]!='\0') strbuff[ii++]=*p[i]++;
if (TRUE==ParseCode(strbuff))
{
OSTimeDly(OS_TICKS_PER_SEC);
//发送电话号码AT命令
pCMGS=temp;
if (TRUE==UART_write(COMPORT,pCMGS,strlen(pCMGS),OS_TICKS_PER_SEC))
{
char tempbuff[20];
char * pBUFF;
char * str;
char context[SMSLEN+4];
pCMGS=NULL;
ii=0; while(ii<(SMSLEN+4)) context[ii++]=0;
strcat(context,strbuff);
strcat(context,"\x01a");
DelayNS(5);
ii=0; while(ii<20) tempbuff[ii++]=0;
len=UART_read(COMPORT,tempbuff,sizeof(tempbuff),OS_TICKS_PER_SEC); //读AT命令的返回信息
str=tempbuff;
if(NULL!=strstr(str,"\r\n>"))
{
str=NULL;
//发送回应
pBUFF=context;
if (TRUE==UART_write(COMPORT,pBUFF,strlen(pBUFF),OS_TICKS_PER_SEC))
{
pBUFF=NULL;
DelayNS(2000);
ii=0; while(ii<20) tempbuff[ii++]=0;
len=UART_read(COMPORT,tempbuff,sizeof(tempbuff),OS_TICKS_PER_SEC); //读AT命令的返回信息
str=tempbuff;
if(NULL!=strstr(str,"\r\nOK\r\n"))
{
str=NULL;
//发送回应成功后,删除此短信
pCMGD=CMGD;
if (TRUE==UART_write(COMPORT,pCMGD,strlen(pCMGD),OS_TICKS_PER_SEC))
{
pCMGD=NULL;
DelayNS(2000);
ii=0;while(ii<20) tempbuff[ii++]=0;
len=UART_read(COMPORT,tempbuff,sizeof(tempbuff),OS_TICKS_PER_SEC); //读AT命令的返回信息
str=tempbuff;
if(NULL!=strstr(str,"\r\nOK\r\n"))
str=NULL;
}
}
}
}
}
}
else
{
//解析不成功,删除不合格短信
pCMGD=CMGD;
if (TRUE==UART_write(COMPORT,CMGD,sizeof(CMGD),OS_TICKS_PER_SEC))
{
pCMGD=NULL;
DelayNS(2000);
OSTimeDly(OS_TICKS_PER_SEC);
ii=0;while(ii<20) CMGD[ii++]=0;
}
}
}
i++;
}
i=0;while(i<SMSLEN) databuff[i++]=0;
}
}
}
UART_close(COMPORT);
OSTimeDly(OS_TICKS_PER_SEC);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -