#include<p30f6014.h>
#include<string.h>
#include <ctype.h>
#include "ceshi.h"
_FOSC(0x0ffe5); //XT振荡,4倍频晶振.
_FWDT(WDT_OFF); //关闭看门狗定时器
_FBORPOR(PBOR_OFF & MCLR_EN); //掉电复位禁止,MCLR复位使能。
_FGS(CODE_PROT_OFF); //代码保护禁止
#define uchar unsigned char
#define uint unsigned int
#define MAX_TM 100
#define MAX_T 35
uchar uart_buff[MAX_TM];
uchar receive_count;
uchar para_temp[MAX_TM];
uchar read_tmp;
uchar sms_num_tmp;
uchar sms_tmp;
uchar TEL_temp[15];
//---定时用-------------
uint timercount;
uchar timer_1S_cnt;
uchar timer_10S_cnt;
uchar timer_S_cnt;
//----------------
//----延时函数----------
void dmsec(unsigned int count)
{
while(count)
{
unsigned int i=100;
while(i>0)i--;
count--;
}
}
//--定时器中断服务程序-----------------
void __attribute__((__interrupt__)) _T1Interrupt(void)
{
IFS0bits.T1IF=0;
timer_1S_cnt++;
timercount++;
if(timer_1S_cnt==50) //20×50=1000MS =1S
{
timer_10S_cnt++; timer_1S_cnt=0;
timer_S_cnt++;
} //1秒=1000毫秒
if(timer_10S_cnt==60) //60S
{
timer_10S_cnt=0;
}
}
//--串口中断服务程序------------------
void __attribute__((__interrupt__)) _U1RXInterrupt(void)
{
//U1STAbits.UTXEN =0; //允许发送
receive_count=0;
if(IFS0bits.U1RXIF)
{
IFS0bits.U1RXIF=0;
while(!U1STAbits.URXDA);
{
uart_buff[receive_count]=U1RXREG;
U2TXREG=uart_buff[receive_count];
}
}
else
{
return;
}
//U1STAbits.UTXEN =1; //允许发送
}
//---------字符串查找------------------------
uchar strsearch(uchar *ptr2,uchar *ptr1_at)
{
uchar i,j,k;
uchar flag;
if(ptr2[0]==0)
{
return(0);
}
flag=0;
for(i=0,j=0;i<MAX_TM-2;i++)
{
if(ptr1_at[i]==ptr2[j])
{//第一个字符相同
k=i;
//for(k=i;k<MAX_TM-2;k++,j++)
do {
if(ptr2[j]==0)//比较正确
return(i+1); //返回值是整数,不含0
if(ptr1_at[k]!=ptr2[j]) break;
k++;j++ ;
} while(k<MAX_TM-2) ;
j=0;
}
}
return(0);
}
uchar strsearch1(uchar i,uchar *ptr2,uchar *ptr1)
{ uchar j=0,k;
k=i;
do{
if(ptr1[k]==ptr2[j])
{j++;k++;}
else return(0);
if(ptr2[j]==0) return(k);
}while(j<=60);
return(0xff);
}
//-----删除短信----------------------
void CMGD_GSM(char* ptr1_at,uchar id)
{
uchar ptr1[3] ;
ptr1[0]=(id/10)+0x30;
ptr1[1]=(id%10)+0x30;
ptr1[2]=0;
Send_AT_Command(SMS_CMGD,ptr1_at,ptr1); //删除其它没有用的短信
Send_AT_Command(SMS_CMGD,ptr1_at,ptr1);
}
//---读短信报文---------------
/*
*********************************************************************************************************
** 函数名称 CPMS_SM()
** 函数功能 功能 读短信报文 ,有短信就读短信 ,把有短信的ID找到,并读出内容
** 全局变量或数组: receive_count 接收指针 uart_buff sms_num_tmp
** 入口参数 : AT指令 字符串
*str_at=要复制的内容/转AT指令
sms_num_tmp 短信ID 供删除短信时用
** 出口参数 : 1-成功 0-失败
*********************************************************************************************************
*/
uchar CPMS_SM(char* ptr1_at )
//----------------------
{
uchar i,j,r,num_tmp1;
Send_AT_Command(AT_INIT,ptr1_at,0);
dmsec(1000);dmsec(1000);dmsec(1000);
Send_AT_Command(AT_E,ptr1_at,0);
dmsec(1000);dmsec(1000);dmsec(1000);
Send_AT_Command(AT_CPMS,ptr1_at,0);
dmsec(1000);dmsec(1000);dmsec(1000);
if(i=strsearch("+CPMS:",ptr1_at)) //"SM" +CPMS: 0,20,0,45,0,45
{
i=i+5;
//+CPMS: 0,20,0,45,0,45
if(strsearch1(i,"\x20\x30,",ptr1_at)) //没有短信
{
return(0);
}
else if((ptr1_at[i]==' ')&&((ptr1_at[i+1]>'1') //9以下短信处理
&&(ptr1_at[i+1]<='9'))&&(ptr1_at[i+2]==','))
{ //+CPMS: 1,20,1,20,1,20
i=i+1;
r=ptr1_at[i]-0x30; //有几个短个
i++;//,
i++; //20
j=0;
j=ptr1_at[i]-0x30;
j=j*10; //高位
i++;
j=j+(ptr1_at[i]-0x30); //低位
i++;
if(ptr1_at[i]!=','&&ptr1_at[i+1]==',') //可以存100以上的
{ j=j*10;i++;
j=j+(ptr1_at[i]-0x30);
}
//返回是可以存多少短信
//r=j+10;
}
else if((ptr1_at[i]==' ')&&((ptr1_at[i+1]>'0') //10条短信以上处理
&&(ptr1_at[i+2]>='0'))&&(ptr1_at[i+3]==','))
{
i=i+1;
r=ptr1_at[i++]-0x30;
r=r*10; //移到十位
r=r+ptr1_at[i++]-0x30;
i++; //20
j=0;
j=ptr1_at[i]-0x30;
j=j*10; //高位
i++;
j=j+(ptr1_at[i]-0x30); //低位
i++;
if(ptr1_at[i]!=','&&ptr1_at[i+1]==',') //可以存100以上的
{ j=j*10;i++;
j=j+(ptr1_at[i]-0x30);
}
//返回是可以存多少短信
//r=j+10;
}
}
else //出错处理
{ if(ptr1_at[1]==0x0d&&ptr1_at[0]==0x34)
{
return(0);
}
}
r=j;
//---------下面有短信时,进行短信查找 从1-100------------------------------------
num_tmp1=1;
do{
if(r>=100) //短信存储号不能超过100个
{
r=1; //
}
if(r==1) //如果是一条发AT+CMGL=ALL或AT+CMGL=4
{
Send_AT_Command(SMS_CMGL,ptr1_at,0);
dmsec(1000);
dmsec(1000);
if(i=strsearch("+CMGL:\x20",ptr1_at)) //查短信代码回复是否对
{ i=i+6;
if(ptr1_at[i+1]==',')
{
num_tmp1=ptr1_at[i]-0x30; //当前短信存储号 10以内
}
else //当前短信存储号 10以上
{
num_tmp1=ptr1_at[i++]-0x30;
num_tmp1=num_tmp1*10;
num_tmp1=num_tmp1+ptr1_at[i++]-0x30;
}
sms_num_tmp=num_tmp1;
return(1);
}
}
else
{
i= READ_TEL(ptr1_at,num_tmp1) ;
if(i) //有短信跳出
{
i=i+7;
sms_num_tmp=num_tmp1;
return(1);
}
}
r--;
num_tmp1++; //
}while(r!=0);
//---------------------------------------------
return(0);
}
//----读sim卡的电话本----------------------
uchar read_sms(char* ptr1_at,char* ptr1_code,char* ptr_tel)
{
uint i;
uchar j, PDU_TEXT,y;
if(!CPMS_SM(ptr1_at))
{
return(0);
}
if((i=strsearch("08916831",ptr1_at)))//短信中心号码字头 //如果不是,说明没有短信
{ i=i+17; j=0;
//带+86的中国移动与联通手机
if((ptr1_at[i]>='0')&&(ptr1_at[i+1]>='0'))
{ i=i+2; //当前指针移动两位
//_______取出对方号码长度______________
j=ptr1_at[i++]-0x30; //取高位
j=j*16; //称入高位
if(ptr1_at[i]>=0x41) //大于9的低位处理
{
j=j+(ptr1_at[i++]-0x37);
}
else //9及以下处理
j=j+(ptr1_at[i++]-0x30);
//___________________________
//-接入码-- 9186 与A1 接入码字头
if(ptr1_at[i]=='9') //
{
i=i+4; //指针移动4位,去掉 9186
}
else
i=i+2; // 指针移动2位,去掉 A1
//j=j-1;
//------------对方号码查找---------------
//--电话号码存入 TEL_temp数组
y=0;
do {
j--;j--;
ptr_tel[y++]=ptr1_at[i+1];
if(ptr1_at[i]=='F') //有补码
{ ptr_tel[y]=0;
i++; i++;
break;
}
ptr_tel[y++]=ptr1_at[i];
i=i+2;
if(y>15) break; //长度不能超过20
}while(j!=0);
ptr_tel[y]=0;
//---------------------------------
//i=i+1;
//是否是中文模式 0008 2100
if((ptr1_at[i]>='0')&&(ptr1_at[i+1]>='0')&&(ptr1_at[i+2]>='0')
&&(ptr1_at[i+3]=='8'))
{
i=i+4; //移动4位,去掉本0008
i=i+14; //移动14位,去掉本日期及时间
i=i+2;
//----------内容复制-将内容放到para_temp里------
for(j=0;j<=MAX_T-3;j++) //不能超过最大值
{
ptr1_code[j]=ptr1_at[i++];
if(ptr1_at[i]==0x0d)
{ ptr1_code[++j]=0; break;
}
PDU_TEXT=0; //PDU
if(i>=MAX_TM) break;
}
//---------------------
}
// 英文模式
//+CMGR: "REC READ","8613818120592",,"09/06/25,14:16:33+32",145,4,0,0,"8613800210500",
//145,3
//END 0
// 2B 43 4D 47 52 3A 20 22 52 45 43 20 52 45 41 44 22 2C 22 38 36 31 33 38 31 38 31 32 30 35 39 32 22
//2C 2C 22 30 39 2F 30 36 2F 32 35 2C 31 34 3A 31 36 3A 33 33 2B 33 32 22 2C 31 34 35 2C 34 2C 30 2C 30
// 2C 22 38 36 31 33 38 30 30 32 31 30 35 30 30 22 2C
//31 34 35 2C 33 0D 0A 45 4E 44 0D 0A 30 0D
else
{ PDU_TEXT=1;//文本
goto err_dll;
}
//i++;
} //固定代码对不对
else goto err_dll;
} //08916831
else
goto err_dll;
if(PDU_TEXT==0) //中文内容分析
{ i=0;
//5438 5408 吸合
if(strsearch1(i,"54385408",ptr1_code))
{
LATD=0x00FF;
strcpy(ptr1_code,"SET OK\x1a");
return(1);
}
// 断开 65AD 5F00 PUD码
else if(strsearch1(i,"65AD5F0",ptr1_code))
{
LATD=0x0000;
return(2);
}
else goto err_dll;
}
//------------------------------------------------------------
else if(PDU_TEXT==1)//英文
{
goto err_dll;
}
//-------------------------------------------------------------------
else {
err_dll: //短信号码删除 AT+CMGD=01
CMGD_GSM(ptr1_at, sms_num_tmp );
for(i=1;i<=MAX_TM-3;i++)
{ ptr1_at[i]=0; }
Send_AT_Command(AT_CMGF0,ptr1_at,0); //中文方式
dmsec(1000);dmsec(1000);dmsec(1000);
Send_AT_Command(AT_CNMI,ptr1_at,0);//AT+CNMI=2,1
dmsec(1000);dmsec(1000);dmsec(1000);
// return;
}
return(0);
}
//---------1-20条短信号码读取--------------
uchar READ_TEL(char* ptr1_at,uchar id) //读短信号码1-20个
{
uchar ptr1[5],t;
t=0;
ptr1[t++]=(id/10)+0x30;
ptr1[t++]=(id%10)+0x30;
ptr1[t++]=0;ptr1[t++]=0x00;
Send_AT_Command(SMS_CMGR,ptr1_at,ptr1);
dmsec(1000);dmsec(1000);dmsec(1000);
timercount=0; while(timercount<20) ;
// if(t=strsearch("+CMGR: 0,,0",ptr1_at))
if(receive_count<10)
{
return(0);
}
return(1);
}
//----模块初始化----------------------------------
void Initialize_Model(char* ptr1_at,char* ptr1_code) //初始化 PIN检测
{
uchar i,j;
//BELL=0; for(i=0;i<=100;i++) dmsec(1); BELL=1;
// GPS_READ(ptr1_at,ptr1_code);
ptr1_code[0]=0;
for(i=0;i<15;i++)
{ //进行初始化,并显示 ATE0V0 = ATE0 ATV0 AT_E
Send_AT_Command(AT_E,ptr1_at,0);
Send_AT_Command(AT_INIT,ptr1_at,0);
dmsec(1000);dmsec(1000);dmsec(1000);dmsec(1000);
if(ptr1_at[1]==0x0d&&ptr1_at[0]==0x30)
{ break;}
else if(ptr1_at[receive_count-1]==0x0d&&ptr1_at[receive_count-2]=='0')
{ break;}
if(i==1)
{ // IO_IGT=0; for(i=0;i<=200;i++) dmsec(30);IO_IGT=1;
timercount=0; while(timercount<60);
}
timercount=0; while(timercount<60);
}
for(i=0;i<12;i++)
{ //读卡 AT+CPIN?
Send_AT_Command(AT_E,ptr1_at,0);
Send_AT_Command(AT_INIT,ptr1_at,0);
Send_AT_Command(AT_CPIN,ptr1_at,0) ;
dmsec(1000);
dmsec(1000);
//如有收到回应进行分析收到的信息,
timercount=0; while(timercount<2);
if(j=strsearch("READY",ptr1_at))
break;
timercount=0; while(timercount<60);
}
Send_AT_Command(AT_IPR,ptr1_at,0);//波特率 AT+IPR=9600
dmsec(1000);dmsec(1000);dmsec(1000);
Send_AT_Command(AT_CGMM,ptr1_at,0); //模块型号 AT+CGMM
dmsec(1000);dmsec(1000);dmsec(1000);
timer_S_cnt=0; while(timer_S_cnt<10) ;
//BELL=0; for(i=0;i<=100;i++) dmsec(1); BELL=1;
Send_AT_Command(AT_CNMI,ptr1_at,0);
dmsec(1000);dmsec(1000);dmsec(1000);
Send_AT_Command(AT_CMGF0,ptr1_at,0);//AT+CMGF=0
dmsec(1000);dmsec(1000);dmsec(1000);
}
//--------单片机初始化----------------------------
void sys_init(void)
{
IEC0bits.T1IE=1;
LATD=0x0000;
TRISD=0xFF00;
T1CON=0; //T1做定时器。分频比1:1
TMR1=0;
PR1=0x4E20; //20ms定时
T1CON=0x8000;
TRISFbits.TRISF2 =1; //RC脚输入
TRISFbits.TRISF3 =0; //TX脚输出
IPC2bits.U1RXIP=7; //中断优先级别
IEC0bits.U1TXIE=0; //禁止发送中断
IEC0bits.U1RXIE=1; //使能接收中断
U1BRG =64; //波特率设置为9600,外部10M
U1MODE =0x8020; //使能UART功能无奇偶校验
U1STA=0X0000;
U1STAbits.UTXEN =1; //允许发送
#if 1
TRISFbits.TRISF4 =1; //RC脚输入
TRISFbits.TRISF5 =0; //TX脚输出
IPC6bits.U2RXIP=7; //中断优先级别
IEC1bits.U2TXIE=0; //禁止发送中断
IEC1bits.U2RXIE=0; //使能接收中断
U2BRG =64; //波特率设置为9600,外部10M
U2MODE =0x8020; //使能UART功能
U2STA=0X0000;
U2STAbits.UTXEN =1; //允许发送
#endif
timer_1S_cnt=0;receive_count=0;
}
//------发送AT指令----------------------------
uchar Send_AT_Command( uchar type,uchar *str_at ,uchar *str_code) //发送AT指令
//拨号时号码放在phone.number
//其他用para_temp
{
uint i;
switch(type)
{
case AT_CPIN: //检查当前是否要输入PIN码
strcpy(str_at,"AT+CPIN?");
break;
// AT_E
case AT_E: //ATE0 功能关回显 ATE1 开回显
strcpy(str_at,"ATE0");
break;
case AT_INIT: //ATV0 回复方式 30 0D ATV1 回复方式 OK
strcpy(str_at,"ATV0");
break;
//0D 0A 54 43 33 35 0D 0A
case AT_CGMM: //模块版型号
strcpy(str_at,"AT+CGMM");
break;
case AT_CMGF0: //PDU方式
strcpy(str_at,"AT+CMGF=0");
break;
// AT_CNMI
case AT_CNMI: // AT+CNMI=2,1
strcpy(str_at,"AT+CNMI=2,1");
break;
case AT_IPR: // 波特率 9600
strcpy(str_at,"AT+IPR=9600"); break;
case SMS_CMGL: //删除一个短信
// strcpy(uart_buff,"AT+CMGL=\"ALL\"");
strcpy(str_at,"AT+CMGL=4");
// strcat(uart_buff,ptr);
break;
case SMS_CMGR: //读一个短信
strcpy(str_at,"AT+CMGR=");
strcat(str_at,str_code);
break;
case SMS_CMGD: //删除一个短信
strcpy(str_at,"AT+CMGD=");
strcat(str_at,str_code);
break;
case AT_CPMS: //读短信报文
strcpy(str_at,"AT+CPMS=\x22SM\x22");
break; //AT_CPMS
//----------------------------------------------------
//----------------------------------------------------------
//-----------------------------------------------
case AT_COMMAND:
break;
default:
receive_count=0;
return(1);
}
U1STAbits.UTXEN =1;
strcat(str_at,"\x0d\x00");//在命令后加入CR
IFS0bits.U1RXIF=0; //清除接收标志
IFS0bits.U1TXIF=0;
//------------------------------
for(i=0;i<MAX_TM;i++)
{ if(str_at[i]==0) break;
U1TXREG=str_at[i];
U1STAbits.UTXEN =1;
while(!IFS0bits.U1TXIF);
IFS0bits.U1TXIF=0;
}
dmsec(1000);dmsec(1000);dmsec(1000);
//---------------------
receive_count=0;
str_at[0]=0; str_at[1]=0;str_at[2]=0;
i=0; timer_1S_cnt=0;
do{
dmsec(3);
if(receive_count>1)
{ // dmsec(50);
timercount=0; while(timercount<30);
break;
}
}while(timer_1S_cnt<3);
return(1);
}
void main(void)
{
uchar i;
sys_init();
Initialize_Model(uart_buff,para_temp);//进行初始化
receive_count=0;
sms_tmp=0;
while(1)
{
//-----------查询1到20条中的短信,只要有短信就处理------------------------------------------
i=read_sms(uart_buff,para_temp,TEL_temp); //timer_S_cnt=0;
if(i==0)
{
receive_count=0;
timer_S_cnt=0; while(timer_S_cnt<60)
{
if(strsearch( "+CMTI:",uart_buff))
{
break;
}
if(receive_count>=7)
{break; }
}
}
else
{
//加入回复短信程序
CMGD_GSM(uart_buff,sms_num_tmp );
}
}
} |