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

📄 gprs003.c

📁 MSP430与GPRS短消息收发例程
💻 C
📖 第 1 页 / 共 5 页
字号:
         Data_Cmnd_Snd(34,&AT_OpenIp0[1],1,5);//连接中心IP
       }
   if(Work_Mode==2)//若是SMS工作模式。    
        { 
          P2IE=0X00;//禁止P2.2中断
          Gprs_At_Command(9,AT_CloseIp,50);  //关闭IP连接
          Gprs_At_Command(7,AT_S00,30);//设置摘机响铃次数:不摘机。
          Gprs_At_Command(16,AT_CNMI,30);//设置短信息接收方式:串口直接接收。
          Gprs_At_Command(5,AT_W,30);    //保存设置  
         }
         
      _5NOP();
      Delay(10);   
      P4OUT&=~0X02;
}
//================================
//函数:Connect_Master_Station()
//功能:连接主站
//输入:
//输出:
//================================
void  Connect_Master_Station(void)
{
    AT_Test_Flag=0;
  if(Tel_Ring_Counter==1)
     Delay(200);
  Gprs_At_Command(3,AT,30);//测试是否有AT应答。
   if(AT_Test_Flag==0)
    {
        P4OUT|=0X02;  //回到命令状态。
        Delay(250);
        TXBUF1=0X1B;
        TXBUF1=0X0d;
        Delay(10);
        Gprs_At_Command(6,AT_3Plus,30); 
        Delay(10);
     }
   Gprs_At_Command(9,AT_CloseIp,50);  //关闭IP连接
    Delay(100);
  if(Tel_Ring_Counter>=1)
    {
     Delay(1000);  
      Read_Delete_SMS();//检测短信息
    }   
   if(Work_Mode!=0x01)//已被重新初始化
     return;
    Inqury_Signal();
    Gprs_At_Command(strlen(AT_CGDCONT),AT_CGDCONT,100);//设置PDP联系通道:APN默认为CMNET。
    Gprs_At_Command(13,AT_ActivateIp,100);//激活IP地址。
    Tx_Head=AT_OpenIp0[0];
    Data_Cmnd_Snd(34,&AT_OpenIp0[1],1,10);//连接中心IP
    Delay(10);
   P4OUT&=~0X02;  //DTR拉低:TE 进入READY状态。
}
//================================
//函数:Heart_Beat()
//功能:心跳
//输入参数
//输出参数
//===============================
void  Heart_Beat(void)
{
 char  i; 
 char  Heart_Beat_Head[]={0x2f,0x00,0x13,0xFF,0xFF,0xFA};//心跳信号头6字节。
 char  Zj_Heart_Beat[13]={0x68,0x91,0x01,0x07,0x1A,0x00,0x00,0x68,
                          0xA4,0x00,0x00,0xff,0x16};
 char  CheckSum=0;
 Tx1_Pointer=0;
 P2OUT|=0X02;//发送心跳时:暗。
 if(Zj_Protocol_Flag==0)//华立规约的心跳
   {
    for(i=0;i<=5;i++)
      {
        Temp_cArray[i]=Heart_Beat_Head[i];
      }
      Temp_cArray[3]=Heart_Beat_Time;
    for(i=0;i<=5;i++)
      {
        Temp_cArray[6+i*2]=Terminal_SIM[i*2+1];
        Temp_cArray[6+i*2+1]=Terminal_SIM[i*2];
      }
     Temp_cArray[16]=Terminal_SIM[11];
     Temp_cArray[17]=Signal_Val;
     WDTCTL=WDTPW+WDTCNTCL;
     Cal_Crc(&Temp_cArray[1],17);//计算CRC
     Temp_cArray[18]=CRC>>8;
     Temp_cArray[19]=CRC;
     Tx_Head=Temp_cArray[0];
     Data_Cmnd_Snd(19,&Temp_cArray[1],1,5);//心跳信号发送 。
     return;
   }
   
 if((Zj_Protocol_Flag==1)&&(Load_Master_Flag==1))  //浙江规约心跳
 {
  for(i=0;i<=12;i++)
   {
    Temp_cArray[i]=Zj_Heart_Beat[i];
   }
 
 /*
   for(i=0;i<=3;i++)//终端识别号
      {
       Temp_cArray[i+1]=((Terminal_SIM[i*2+1]-0x30)<<4)+(Terminal_SIM[i*2]-0x30);
      }
      */          // hunter term address
   Temp_cArray[5]=0x1E;
   Temp_cArray[6]=0x00;   
   for(i=0;i<=10;i++)//校验和
    {
     CheckSum+=Temp_cArray[i];
    } 
   Temp_cArray[11]=CheckSum;
   while(Tx1_Snd_Lenth);
   Tx_Head=Temp_cArray[0];
   Data_Cmnd_Snd(12,&Temp_cArray[1],1,5);
   _NOP();
 }
}
//--------------------------------
//函数 Data_Cmnd_Snd(char,char)
//功能:发送AT命令或数据
//输入参数:命令长度、发送地址、串口号
//返回参数:
//=================================
void  Data_Cmnd_Snd(Uint L,char *Temp_Pointer,char Sport,Uint Waiting_Time)
 {
 Wait_Result_Time=Waiting_Time;
 if(Sport==1)
  {
    Tx1_Pointer=0;
    Rx1_Time_Counter=0;
    Rx1_TimeOut_Flag=0;
    Tx1_Snd_Lenth=L;
    Pointer1=Temp_Pointer;
    TXBUF1=Tx_Head;
  }
 if(Sport==0)
  {
    Tx0_Pointer=0;
    Rx0_Time_Counter=0;
    Rx0_TimeOut_Flag=0;
    Tx0_Snd_Lenth=L;
    Pointer0=Temp_Pointer;
    TXBUF0=0XFE;
  } 
}
//================================
//函数:Rx1Data_Judge_Trasmit();
//功能:判断串口1接收到的数据转发给串口0。
//输入参数:发送长度、发送缓冲区。
//输出参数:
//=================================
void  Rx1Data_Judge_Trasmit(void)
{
  Uint i,j;
  Uint  Temp2;
  Uint  Rx1_Lenth;
  char  Temp_Sim[12];
  Rx1_Lenth=Rx1_Pointer;
  Rx1_TimeOut_Flag=0;
  Rx1_Start_Flag=0;
  Rx1_Time_Counter=0;
  P5OUT|=0x80;//接收指示灯灭。
  DSR=P3IN&0X08; //P3.3:显示系统命令状态/数据状态。
for(i=0;i<Rx1_Pointer;i++)
 {  
    Feed_WatchDog();
  if((Rx1_Data_Buffer[i]==0x0D)&&(Rx1_Data_Buffer[i+1]==0x0A))  //***判断是否为结果码返回****
  {
      if((Rx1_Data_Buffer[i+4]==0x0D)&&(Rx1_Data_Buffer[i+5]==0x0A))
         {
           if((Rx1_Data_Buffer[i+2]=='O')&&(Rx1_Data_Buffer[i+3]=='K'))//返回OK
             {
               AT_Set_Ok=1;
                if(AT_Test_Flag==0)
                 AT_Test_Flag=1;//第一次AT命令有返回。
             }
          }
   //检测是否在线
         if((Rx1_Data_Buffer[i+2]==42)&&(Rx1_Data_Buffer[i+5]==73)&&(Rx1_Data_Buffer[i+6]==80)&&(Rx1_Data_Buffer[i+7]==79)) 
            {
             if((Rx1_Data_Buffer[i+8]==58)&&(Rx1_Data_Buffer[i+9]==32))
              {
                if(Rx1_Data_Buffer[i+10]==48)
                  IpConnect_Flag=0;//未连接上
                else
                 {
                   IpConnect_Flag=1;//已连接上  
                   AT_Set_Ok=1;
                   return;
                 } 
             }
            }       
        if((Rx1_Data_Buffer[i+2]==0x3e)&&(Rx1_Data_Buffer[i+3]==0x20))//返回">和空格”
            {
              AT_Set_Ok=1;
              Msg_Snd_Flag=1;//可以发送短信标志置位。
              return;
            }
      
       if((Rx1_Data_Buffer[i+2]=='+')&&(Rx1_Data_Buffer[i+3]=='C')&&(Rx1_Data_Buffer[i+4]=='M')&&(Rx1_Data_Buffer[i+5]=='G')&&(Rx1_Data_Buffer[i+6]=='R'))  //+CMGR
          {//+CMGR读取短信
            // AT_Set_Ok=1;
            if(Rx1_Data_Buffer[i+9]-0x30!=0)
            _NOP();
              //Received_Read_Msg_Flag=1;//表示该信息不是未读数据。
          }   
       if((Rx1_Data_Buffer[i+2]=='+')&&(Rx1_Data_Buffer[i+3]=='C')&&(Rx1_Data_Buffer[i+4]=='P')&&(Rx1_Data_Buffer[i+5]=='M')&&(Rx1_Data_Buffer[i+6]=='S'))  //+CMGR
           {//+CPMS查询SIM中短信息数量。
             AT_Set_Ok=1;
              if(Rx1_Data_Buffer[i+13]==',')
               SMS_Index=Rx1_Data_Buffer[i+14]-0x30;//SIM中的短信数目:<10。
                if((Rx1_Data_Buffer[i+15]!=',')&&(Rx1_Data_Buffer[i+16]==','))
              {
               SMS_Index=10*(Rx1_Data_Buffer[i+14]-0x30)+(Rx1_Data_Buffer[i+15]-0x30);//>10
              } 
             return; 
           } 
       if((Rx1_Data_Buffer[i+2]=='+')&&(Rx1_Data_Buffer[i+3]=='C')&&(Rx1_Data_Buffer[i+4]=='M')&&(Rx1_Data_Buffer[i+5]=='S')&&(Rx1_Data_Buffer[i+6]==' '))  
           {//指示返回错误代码
              AT_Set_Ok=1;//是SIM卡中有未读取读取的短信。
           }               
  } 
  
  if((Rx1_Data_Buffer[i]=='R')&&(Rx1_Data_Buffer[i+1]=='I')&&(Rx1_Data_Buffer[i+2]=='N')&&(Rx1_Data_Buffer[i+3]=='G')) 
    {
       Ring_Counter++;
      if(Ring_Counter>=3)
      {
        Heart_Beat_Flag=1;
        Heart_Beat_Interval=6000;
        //Heart_Beat_Interval=Heart_Beat_Time*100;//自动检测一次GPRS连接
      }
      _NOP();
    }
 
        
 //检测CONNECT返回码,判断是否连接上。
     if((Rx1_Data_Buffer[i]=='C')&&(Rx1_Data_Buffer[i+1]=='O')&&(Rx1_Data_Buffer[i+2]=='N')&&(Rx1_Data_Buffer[i+3]=='N'))  //返回CONNECT
          {
           if((Rx1_Data_Buffer[i+4]=='E')&&(Rx1_Data_Buffer[i+5]=='C')&&(Rx1_Data_Buffer[i+6]=='T'))
              {
                AT_Set_Ok=1;
                Command_Data_Status=1;//进入数据模式状态。
                P1OUT&=0XBF;//显示已连接
                Beat_Rcv_Fail=0;
                Heart_Beat_Interval=600;//自动检测一次GPRS连接
                Heart_Beat_Flag=0;
                return;
              }
            }
 //检测是否有短信接收到
     if((Rx1_Data_Buffer[i]=='+')&&(Rx1_Data_Buffer[i+1]=='C')&&(Rx1_Data_Buffer[i+2]=='M')&&(Rx1_Data_Buffer[i+3]=='T')&&(Rx1_Data_Buffer[i+4]=='I'))  //+CMTI:指示SIM中接收到短信息。
           {//+CMTI:指示收到新的短信。
             AT_Set_Ok=1;
           //SIM_SMS_Flag=1;//是SIM卡中有未读取的短信。
           } 
 //检测是否
     if((Rx1_Data_Buffer[i]=='N')&&(Rx1_Data_Buffer[i+3]=='C')&&(Rx1_Data_Buffer[i+4]=='A')&&(Rx1_Data_Buffer[i+5]=='R')&&(Rx1_Data_Buffer[i+7]=='I'))  //+CMTI:指示SIM中接收到短信息。
           {//接收到NO CARRIER
             AT_Set_Ok=1;
             if(Work_Mode==1)
             {
               No_Carrier_Flag=1;//是SIM卡中有未读取的短信。
               Heart_Beat_Flag=1;
             }
           }          
           
           
//***判断返回结果码结束**** 
   
//***********心跳信号*************
  if((Rx1_Data_Buffer[i]==0x2f)&&(Rx1_Data_Buffer[i+2]==0x07)&&(Rx1_Data_Buffer[i+5]==0xfa))
     {
        //判断功能码
         Cal_Crc(&Rx1_Data_Buffer[i+1],5);//计算CRC
         Temp2=Rx1_Data_Buffer[i+6];
         Temp2=(Temp2<<8)+Rx1_Data_Buffer[i+7];  
            if(CRC==Temp2)//若CRC相等,则为心跳信号。
             {
               P2OUT&=~0X02;//接收心跳时:灯亮。
               Beat_Rcv_Fail=0;//心跳接收失败次数
               Heart_Beat_Interval=600;
               Beat_Rcved_Flag=1;
               Beat_Test_Start=0; 
               Minute2_Interval=12000;//2分钟通信间隔检测。
               Minute2_Interval_Flag=0;
               Second=0;
               Minute=0;
           if(Rx1_Data_Buffer[i+3]!=Heart_Beat_Time)
             {
                  if(Rx1_Data_Buffer[i+3]==255)
                     return;
                   Heart_Beat_Time=Rx1_Data_Buffer[i+3];
                   Temp_iArray[0]=Heart_Beat_Time;
                   Wr_Data(Beat_Addr,1,Temp_iArray);//保存数据为16进制
                   Feed_WatchDog();   
                   Wr_Data(Beat_Addr+100,1,Temp_iArray);
                   Rd_Data(0,91,Temp_iArray);//读取数据,重新计算CRC,然后保存。
               for(j=0;j<=90;j++)
                {
                 Temp_cArray[j]=Temp_iArray[j];
                }
               Feed_WatchDog();
               Cal_Crc(&Temp_cArray[1],88);
               Temp_iArray[1]=CRC&0x00FF;  //CRC低位
               Temp_iArray[0]=(CRC>>8)&0x00FF;  //CRC高位
               Wr_Data(89,2,Temp_iArray); //读取数据,重新计算CRC,然后保存。
               Feed_WatchDog();   
               Wr_Data(189,2,Temp_iArray);             
             }
               return;
           }
     }
      //检测浙江GPRS心跳信号
  if((Rx1_Data_Buffer[i]==0x68)&&(Rx1_Data_Buffer[i+7]==0x68)&&(Rx1_Data_Buffer[i+8]==0x24)&&(Rx1_Data_Buffer[i+12]==0x16))
       {
         P2OUT&=~0X02;//接收心跳时:灯亮。
         Beat_Rcv_Fail=0;//心跳接收失败次数
         Heart_Beat_Interval=600;
         Beat_Rcved_Flag=1;
         Beat_Test_Start=0; 
         Minute2_Interval=12000;//2分钟通信间隔检测。
         Minute2_Interval_Flag=0;
         Second=0;
         Minute=0;
         Heart_Flag=0;
      }
  //检测浙江正常登陆
  if((Rx1_Data_Buffer[i]==0x68)&&(Rx1_Data_Buffer[i+7]==0x68)&&(Rx1_Data_Buffer[i+8]==0x21)&&(Rx1_Data_Buffer[i+12]==0x16))
    {
        P2OUT&=~0X02;//接收心跳时:灯亮。
        Beat_Rcv_Fail=0;//心跳接收失败次数
        Heart_Beat_Interval=600;
        Beat_Rcved_Flag=1;
        Beat_Test_Start=0; 
        Minute2_Interval=12000;//2分钟通信间隔检测。
        Minute2_Interval_Flag=0;
        Second=0;
        Minute=0;
        Load_Master_Flag=1;//登陆主站成功
     } 
  //******以下为短信设置处理程序******。
   
  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'))//接收到短信内容:089168的数据头
   {    
       Feed_WatchDog();  
     for(j=0;j<=11;j++)
       {
        // Center_SIM[j]=Rx1_Data_Buffer[26+i+j];//将发送手机号码的提取。
         Temp_Sim[j]=Rx1_Data_Buffer[26+i+j];
       }
       Asci_To_Hex(&Rx1_Data_Buffer[i],Rx1_Pointer-i+1);//CHANGED 11.5 +1将收到的短信ASCII转化成16进制数。
       _NOP();
         
      if((Temp_cArray[29]==0x2F)&&(Temp_cArray[31]==90)&&(Temp_cArray[34]==0xFD))//判断数据头、长度、功能码
         {  //通过主站设置的命令处理
              Cal_Crc(&Temp_cArray[1],88);//计算CRC
              Temp2=Temp_cArray[89];//比较CRC
              Temp2=Temp2<<8;
              Temp2=Temp2+Temp_cArray[90]; 
             if(CRC==Temp2)//若CRC相等,则为设置命令
              {            //检验密码
                 if((Temp_cArray[57]==PassWord[0])&&(Temp_cArray[58]==PassWord[1])&&(Temp_cArray[59]==PassWord[2])&&(Temp_cArray[60]==PassWord[3])&&(Temp_cArray[61]==PassWord[4])&&(Temp_cArray[62]==PassWord[5]))
                   goto Pass0; 
                 if((Temp_cArray[57]=='H')&&(Temp_cArray[58]=='O')&&(Temp_cArray[59]=='L')&&(Temp_cArray[60]=='L')&&(Temp_cArray[61]=='E')&&(Temp_cArray[62]=='Y'))
                   {//超级密码
                   Pass0:; 
                      for(i=0;i<=90;i++)
                        {
                         Temp_iArray[i]=Temp_cArray[i+29];
                        }
                        
                      Wr_Data(Estart_Addr,91,&Temp_iArray[29]);//将设置数据写到EEPROM中:0~90
                      _NOP();
                      Wr_Data(Estart2_Addr,91,&Temp_iArray[29]);//将数据备份。100~190
                      SMS_Mode=1;
                      Echo_SMS_Master(7);//返回短信正确设置命令。
                      SMS_Mode=0xff;  
                  }
                 return;
            }
        }
    if(Temp_cArray[20]==0X00)//短信是7bit编码 
        { //通过手机设置的命令处理。
         SMS_Mode=0;
         Decode8Bit(Temp_cArray[28]);//数据解码后,放到User_Data[]中
         _NOP();
         goto Cotinue0;
        }
    if(Temp_cArray[20]==0X04)//短信是8BIT编码
        {  
           SMS_Mode=1;
          for(j=0;j<Temp_cArray[28];j++)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -