📄 gprs003.c
字号:
Rx1_Time_Counter=0;
Rx1_TimeOut_Flag=1;//超时标志置位
}
}
if(Rx0_Start_Flag==1)//串口0接收计时。
{
Rx0_Time_Counter++;
if(Rx0_Time_Counter>=4)
{
Rx0_Time_Counter=0;
Rx0_TimeOut_Flag=1;//超时标志置位
}
}
}
//================================
//函数:TimerA_Int()
//功能:定时器A比较1中断
//输入参数:
//输出参数:
//================================
#pragma vector=TIMERA1_VECTOR
__interrupt void TimerA1_Int(void)
{
if(TAIV==2)
{
Wait_Result_Time--;
if(Wait_Result_Time==0)
{
Wait_Result_Time=100;//
Wait_Result_TimeOut=1;
}
if(Ring_Start_Flag==1)
{
if(Ring_Time++>=6000)//60s for ring bell
{
Ring_Time=0;
Ring_Start_Flag=0;
Tel_Ring_Counter=0;
}
}
if((Second==2900)||(Second==5900))//to test
{
P2OUT|=0X02;//接收心跳时:灯亮。
Heart_Flag=1;
}
/*if((Signalmscnt++)>=500)
// if((Minute%1)==0)//to test
{
Signalmscnt=0;
Inqury_Signal_Flag=1;
}
*/
if(Second++>=6000)//60s
{
Second=0;
Minute++;
if((Minute%1)==0)//to test
{
Inqury_Signal_Flag=1;
}
if(Minute>=Heart_Beat_Time)//心跳周期。
{
nMinute_Beat_Flag=1;
Minute=0;
}
if(Minute>=254)
Minute=0;
}
Heart_Beat_Interval--; //自动连接间隔时间
if(Heart_Beat_Interval==0) //自动连接时间到。
{
Heart_Beat_Flag=1;
Heart_Beat_Interval=6000;
}
if((Read_SMS_Time--)==0)
{
Read_SMS_Time=60000;//每5分钟读取SIM中短信1次。
Read_SMS_Flag=1;
}
if((Minute2_Interval--)==0)
{
Minute2_Interval=12000;
Minute2_Interval_Flag=1;
}
if(Beat_Test_Start==1)
{
if((Beat_Test_Interval--)==0)//心跳测试间隔为30秒。
{
Beat_Test_Start=0;
Beat_Test_Fail=1;
}
}
}
}
//===============================
//函数 :UART0_RX()中断矢量
//功能: 串口0接收中断服务
//输入参数:
//输出参数:
//================================
#pragma vector=UART0RX_VECTOR
__interrupt void UART0Rx_Int(void)
{
UTCTL0&=~URXSE;
Rx0_Time_Counter=0;//每次接收到数据,则接收间隔清零。
if(Rx0_Start_Flag==0)
{
Rx0_Start_Flag=1;//串口0开始接收到数据
Rx0_Pointer=0;
}
Rx0_Data_Buffer[Rx0_Pointer++]=RXBUF0;
//if(DSR==0)
// TXBUF1=RXBUF0;
}
//===============================
//函数: UART0_TX()
//功能: 串口0发送中断服务
//输入参数:
//输出参数:
//================================
#pragma vector=UART0TX_VECTOR
__interrupt void UART0Tx_Int(void)
{
if(Tx0_Snd_Lenth!=0)
{
TXBUF0=*(Pointer0+Tx0_Pointer);
Tx0_Snd_Lenth--;
Tx0_Pointer++;
}
else
for(ii=Tx0_Pointer;ii<=250;ii++)
{
Rx0_Data_Buffer[ii]=0;
}
}
//===============================
//函数: UART1_TX()
//功能: 串口0发送中断服务
//输入参数:
//输出参数:
//================================
#pragma vector=UART1TX_VECTOR
__interrupt void UART1Tx_Int(void)
{
if(Tx1_Snd_Lenth!=0)
{
TXBUF1=*(Pointer1+Tx1_Pointer);
Tx1_Snd_Lenth--;
Tx1_Pointer++;
P5OUT&=0XBF;
Tx1_Led^=0x40;//发送指示灯闪烁
P5OUT|=Tx1_Led;
}
else
{
P5OUT|=0X40;//发送指示灯关闭
for(ii=Tx1_Pointer;ii<=250;ii++)
{
Rx1_Data_Buffer[ii]=0;
}
}
}
//===============================
//函数: UART1_RX()
//功能: 串口1接收中断服务
//输入参数:
//输出参数:
//================================
#pragma vector=UART1RX_VECTOR
__interrupt void UART1Rx_Int(void)
{
UTCTL1&=~URXSE;
Rx1_Time_Counter=0;//每接收一个字节,则接收计时器清零一次。
if(Rx1_Start_Flag==0)
{
Rx1_Start_Flag=1;//串口开始接收到数据
Rx1_Pointer=0;
}
Rx1_Data_Buffer[Rx1_Pointer]=RXBUF1;
Rx1_Pointer++;
//if(DSR==0)
// TXBUF0=RXBUF1;
P5OUT&=0X7F;
Tx1_Led^=0x80;//接收指示灯闪烁
P5OUT|=Rx1_Led;
}
//===============================
//函数: PORT2_Int()
//功能: RING中断服务
//输入参数:
//输出参数:
//================================
#pragma vector=PORT2_VECTOR
__interrupt void PORT2_Int(void)
{
P2IFG=0;
if(Ring_Time>=1000)
Tel_Ring_Counter=0;
Ring_Time=0;
Tel_Ring_Counter++;
if(Tel_Ring_Counter>10)
Tel_Ring_Counter=3;
Ring_Time=1;
if(Ring_Start_Flag==0)//振岭开始标志
{
Ring_Start_Flag=1;
Heart_Beat_Flag=1;
Heart_Beat_Interval=6000;
}
}
//====================================
//函数:Cal_Crc()
//功能:计算CRC校验值
//输入参数:要计算CRC值的数组
//输出参数:CRC值
//==========================================
void Cal_Crc(char *Pointer,Uint L)
{
char k;
Uint CRC_Table[16]={0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,
0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef};//CRC表
CRC=0;
WDTCTL=WDTPW+WDTCNTCL;
while(L--!=0)
{
k=((char)(CRC/256))/16;//暂存CRC的高4位
CRC<<=4;//CRC右移4位,相当于CRC的低12位。
CRC^=CRC_Table[k^(*Pointer/16)];//CRC的高4位和本字节的前半字节相加后查表计算CRC,然后加上上一次CRC的余数。
k=((char)(CRC/256))/16;//暂存CRC的高4位
CRC<<=4;//CRC右移4位,相当于去CRC的低12位。
CRC^=CRC_Table[k^(*Pointer&0x0F)];
Pointer++;
}
}
//=================================
//函数:Feed_WatchDog()
//功能:清看门狗
//输入参数:
//输出参数:
//=================================
void Feed_WatchDog(void)
{
WDTCTL=WDTPW+WDTCNTCL;//看门狗计数器清零。
}
//==================================
//函数:Read_Delete_SMS()
//功能:读取、删除短信息
//输入参数:无
//输出参数:无
//===================================
void Read_Delete_SMS(void)
{
char i,j,k=0;
char *AT_CPMS="AT+CPMS?\r";//查询短信息数量。
char AT_CMGR[11]={'A','T','+','C','M','G','R','=',0X00,0X00,0X0D}; //读短信息。
char AT_CMGD[11]={'A','T','+','C','M','G','D','=',0X00,0X00,0X0D}; //删除短信息。
char Try_Counter1=0;
char Try_Counter2=0;
char Clenth;
SMS_Index=0;
Try88:
WDTCTL=WDTPW+WDTCNTCL;
for(j=0;j<10;j++){Rx1_Data_Buffer[j]=0;}
Rx1_Pointer=0;
Tx_Head=AT_CPMS[0];
Data_Cmnd_Snd(8,&AT_CPMS[1],1,1);//检测SIM中是否有短信存在。
Waiting_Result(30);
Rx1_Time_Interval=4;
if((Rx1_Pointer<15)&&(Try_Counter1<3))//若读SIM卡不成功,则重读,直至3次。
{
Try_Counter1++;
goto Try88;
}
if(Rx1_Pointer>=15)
Judge_SMS_Counter(); //判断短信数量。
if(SMS_Index==0)
return;
i=0;
while(SMS_Index!=0)
{
WDTCTL=WDTPW+WDTCNTCL;
Try_Counter2=0;
i++;
if(i<=9)
{
AT_CMGR[8]=i+0x30;
AT_CMGR[9]=0X0D;
AT_CMGD[8]=i+0x30;
AT_CMGD[9]=0X0D;
Clenth=9;
}
if(i>=10)
{
k=i/10;
AT_CMGR[8]=k+0x30;
AT_CMGD[8]=k+0x30;
k=i%10;
AT_CMGR[9]=k+0X30;
AT_CMGD[9]=k+0X30;
AT_CMGR[10]=0X0D;
AT_CMGD[10]=0X0D;
Clenth=10;
}
if(i>30)//超出存贮量,跳出循环体
break;
Read_Sms_Again0:
WDTCTL=WDTPW+WDTCNTCL;
for(j=0;j<10;j++){Rx1_Data_Buffer[j]=0;}
Rx1_Pointer=0;
Tx_Head=AT_CMGR[0];
Data_Cmnd_Snd(Clenth,&AT_CMGR[1],1,5);//读取SIM中的短信
Waiting_Result(40);
Rx1_Time_Interval=4;
if((Rx1_Pointer<=25)&&(Try_Counter2<3))//若读SIM卡不成功,则重读,直至3次。
{
Try_Counter2++;
goto Read_Sms_Again0;//若未读到短信,则重读。
}
if(Rx1_Pointer>25)//
{
SMS_Index--;
Gprs_Mode_SMS(Rx1_Pointer);//GPRS模式短信处理。
for(j=0;j<10;j++){Rx1_Data_Buffer[j]=0;}
Tx_Head=AT_CMGD[0];//
Data_Cmnd_Snd(Clenth,&AT_CMGD[1],1,5);//读取SIM中的短信
Waiting_Result(40);//
Rx1_Time_Interval=4;//
_NOP();
}
}
}
//===================================
//函数:Gprs_Mode_SMS()
//功能:GPRS模式下的SM处理
//输入参数:Rx1_Data_Buffer[]
//返回参数:
//===================================
void Gprs_Mode_SMS(Uint Lenth2)
{
Uint i,j;
for(i=0;i<Lenth2;i++)
{
WDTCTL=WDTPW+WDTCNTCL;
if((Rx1_Data_Buffer[i]=='C')&&(Rx1_Data_Buffer[i+1]=='M')&&(Rx1_Data_Buffer[i+2]=='G')&&(Rx1_Data_Buffer[i+3]=='R')&&(Rx1_Data_Buffer[i+4]==':')&&(Rx1_Data_Buffer[i+6]=='1'))
{
//已读短信
_NOP();
return;
}
if((Rx1_Data_Buffer[i]=='0')&&(Rx1_Data_Buffer[i+1]=='8')&&(Rx1_Data_Buffer[i+2]=='9')&&(Rx1_Data_Buffer[i+3]=='1')&&(Rx1_Data_Buffer[i+4]=='6')&&(Rx1_Data_Buffer[i+5]=='8'))
{
for(j=0;j<=11;j++)
{
Center_SIM[j]=Rx1_Data_Buffer[26+i+j];//将发送手机号码的提取。
}
for(j=20;j<=Lenth2;j++)
{ //'#'结束符
if((Rx1_Data_Buffer[j]=='2')&&(Rx1_Data_Buffer[j+1]=='3')&&(Rx1_Data_Buffer[j+2]==0X0D)&&(Rx1_Data_Buffer[j+3]==0X0A))//&&(Rx1_Data_Buffer[i+4]=='6')&&(Rx1_Data_Buffer[i+5]=='8'))
{
Asci_To_Hex(&Rx1_Data_Buffer[i],j-i+4);//将收到的短信ASCII转化成16进制数。
break;
}
}
if(Temp_cArray[20]==0X00)//短信是7bit编码
{ //通过手机设置的命令处理。
SMS_Mode=0;
WDTCTL=WDTPW+WDTCNTCL;
Decode8Bit(Temp_cArray[28]);//数据解码后,放到User_Data[]中
_NOP();
goto Cotinue001;
}
if(Temp_cArray[20]==0X04)//短信是8BIT编码
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -