?? gprs003.c
字號(hào):
Rx1_Time_Counter=0;
Rx1_TimeOut_Flag=1;//超時(shí)標(biāo)志置位
}
}
if(Rx0_Start_Flag==1)//串口0接收計(jì)時(shí)。
{
Rx0_Time_Counter++;
if(Rx0_Time_Counter>=4)
{
Rx0_Time_Counter=0;
Rx0_TimeOut_Flag=1;//超時(shí)標(biāo)志置位
}
}
}
//================================
//函數(shù):TimerA_Int()
//功能:定時(shí)器A比較1中斷
//輸入?yún)?shù):
//輸出參數(shù):
//================================
#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;//接收心跳時(shí):燈亮。
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--; //自動(dòng)連接間隔時(shí)間
if(Heart_Beat_Interval==0) //自動(dòng)連接時(shí)間到。
{
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)//心跳測(cè)試間隔為30秒。
{
Beat_Test_Start=0;
Beat_Test_Fail=1;
}
}
}
}
//===============================
//函數(shù) :UART0_RX()中斷矢量
//功能: 串口0接收中斷服務(wù)
//輸入?yún)?shù):
//輸出參數(shù):
//================================
#pragma vector=UART0RX_VECTOR
__interrupt void UART0Rx_Int(void)
{
UTCTL0&=~URXSE;
Rx0_Time_Counter=0;//每次接收到數(shù)據(jù),則接收間隔清零。
if(Rx0_Start_Flag==0)
{
Rx0_Start_Flag=1;//串口0開始接收到數(shù)據(jù)
Rx0_Pointer=0;
}
Rx0_Data_Buffer[Rx0_Pointer++]=RXBUF0;
//if(DSR==0)
// TXBUF1=RXBUF0;
}
//===============================
//函數(shù): UART0_TX()
//功能: 串口0發(fā)送中斷服務(wù)
//輸入?yún)?shù):
//輸出參數(shù):
//================================
#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;
}
}
//===============================
//函數(shù): UART1_TX()
//功能: 串口0發(fā)送中斷服務(wù)
//輸入?yún)?shù):
//輸出參數(shù):
//================================
#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;//發(fā)送指示燈閃爍
P5OUT|=Tx1_Led;
}
else
{
P5OUT|=0X40;//發(fā)送指示燈關(guān)閉
for(ii=Tx1_Pointer;ii<=250;ii++)
{
Rx1_Data_Buffer[ii]=0;
}
}
}
//===============================
//函數(shù): UART1_RX()
//功能: 串口1接收中斷服務(wù)
//輸入?yún)?shù):
//輸出參數(shù):
//================================
#pragma vector=UART1RX_VECTOR
__interrupt void UART1Rx_Int(void)
{
UTCTL1&=~URXSE;
Rx1_Time_Counter=0;//每接收一個(gè)字節(jié),則接收計(jì)時(shí)器清零一次。
if(Rx1_Start_Flag==0)
{
Rx1_Start_Flag=1;//串口開始接收到數(shù)據(jù)
Rx1_Pointer=0;
}
Rx1_Data_Buffer[Rx1_Pointer]=RXBUF1;
Rx1_Pointer++;
//if(DSR==0)
// TXBUF0=RXBUF1;
P5OUT&=0X7F;
Tx1_Led^=0x80;//接收指示燈閃爍
P5OUT|=Rx1_Led;
}
//===============================
//函數(shù): PORT2_Int()
//功能: RING中斷服務(wù)
//輸入?yún)?shù):
//輸出參數(shù):
//================================
#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)//振嶺開始標(biāo)志
{
Ring_Start_Flag=1;
Heart_Beat_Flag=1;
Heart_Beat_Interval=6000;
}
}
//====================================
//函數(shù):Cal_Crc()
//功能:計(jì)算CRC校驗(yàn)值
//輸入?yún)?shù):要計(jì)算CRC值的數(shù)組
//輸出參數(shù):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位,相當(dāng)于CRC的低12位。
CRC^=CRC_Table[k^(*Pointer/16)];//CRC的高4位和本字節(jié)的前半字節(jié)相加后查表計(jì)算CRC,然后加上上一次CRC的余數(shù)。
k=((char)(CRC/256))/16;//暫存CRC的高4位
CRC<<=4;//CRC右移4位,相當(dāng)于去CRC的低12位。
CRC^=CRC_Table[k^(*Pointer&0x0F)];
Pointer++;
}
}
//=================================
//函數(shù):Feed_WatchDog()
//功能:清看門狗
//輸入?yún)?shù):
//輸出參數(shù):
//=================================
void Feed_WatchDog(void)
{
WDTCTL=WDTPW+WDTCNTCL;//看門狗計(jì)數(shù)器清零。
}
//==================================
//函數(shù):Read_Delete_SMS()
//功能:讀取、刪除短信息
//輸入?yún)?shù):無
//輸出參數(shù):無
//===================================
void Read_Delete_SMS(void)
{
char i,j,k=0;
char *AT_CPMS="AT+CPMS?\r";//查詢短信息數(shù)量。
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);//檢測(cè)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(); //判斷短信數(shù)量。
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)//超出存貯量,跳出循環(huán)體
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();
}
}
}
//===================================
//函數(shù):Gprs_Mode_SMS()
//功能:GPRS模式下的SM處理
//輸入?yún)?shù):Rx1_Data_Buffer[]
//返回參數(shù):
//===================================
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];//將發(fā)送手機(jī)號(hào)碼的提取。
}
for(j=20;j<=Lenth2;j++)
{ //'#'結(jié)束符
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轉(zhuǎn)化成16進(jìn)制數(shù)。
break;
}
}
if(Temp_cArray[20]==0X00)//短信是7bit編碼
{ //通過手機(jī)設(shè)置的命令處理。
SMS_Mode=0;
WDTCTL=WDTPW+WDTCNTCL;
Decode8Bit(Temp_cArray[28]);//數(shù)據(jù)解碼后,放到User_Data[]中
_NOP();
goto Cotinue001;
}
if(Temp_cArray[20]==0X04)//短信是8BIT編碼
{
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -