⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gprs003.c

📁 MSP430与GPRS短消息收发例程
💻 C
📖 第 1 页 / 共 5 页
字号:
      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 + -