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

📄 gprs003.c

📁 MSP430与GPRS短消息收发例程
💻 C
📖 第 1 页 / 共 5 页
字号:
       CheckSum+=Temp_cArray[i];
      } 
      Temp_cArray[14]=CheckSum;
      Delay(100);
      Tx_Head=Temp_cArray[0];
      Data_Cmnd_Snd(15,&Temp_cArray[1],1,5);
      /*Delay(200);
      Tx_Head=Temp_cArray[0];
      Data_Cmnd_Snd(15,&Temp_cArray[1],1,5);*/
      Beat_Test_Start=1;
      Beat_Test_Interval=12000;//20秒钟自动检测心跳
      Beat_Test_Fail=0;
      Beat_Rcved_Flag=0;
      _NOP();
 }
}
//==============================================
//函数:Inqury_Signal()
//功能:查询当前GSM信号强度
//输入:
//输出:
//==============================================
void  Inqury_Signal(void)
{
  char  *AT_CSQ="AT+CSQ\r";//检测信号强度。
  char  i,CheckSum=0;
  char  Inqury_Counter=3;
  char  Temp; 
Inqury_Again:;
  Temp=Signal_Val;
  Inqury_Signal_Flag=0;
  AT_Set_Ok=0;
  Rx1_Pointer=0;
  Rx1_TimeOut_Flag=0;
  Tx_Head=AT_CSQ[0];
  Data_Cmnd_Snd(6,&AT_CSQ[1],1,40);  //查寻信号强弱命令
  Delay(200); 
 for(i=0;i<Rx1_Pointer;i++)//检测信号强弱等级。
 {
  if((Rx1_Data_Buffer[i]=='+')&&(Rx1_Data_Buffer[i+1]=='C')&&(Rx1_Data_Buffer[i+2]=='S')&&(Rx1_Data_Buffer[i+3]=='Q')) 
    {
        if((Rx1_Data_Buffer[i+4]==':')&&(Rx1_Data_Buffer[i+5]==32))  //冒号 空格
          {
             
          if(Rx1_Data_Buffer[i+7]!=',')//信号强度无
            {
            if(((Rx1_Data_Buffer[i+6]-48)==9)&&((Rx1_Data_Buffer[i+7]-48)==9))//没有检测到信号。
                {
                  AT_Set_Ok=1;
                  P1OUT|=0X90;//LED4、LED5、LED6全黑(=99)
                  P2OUT|=0X01;
                  Signal_Val=0;//信号强度为0。
                 goto Signal000;
                }
          
            if(((Rx1_Data_Buffer[i+6]-48)>=2)&&((Rx1_Data_Buffer[i+7]-48)<=9))//信号强度大于20
               {
                 AT_Set_Ok=1;
                 P1OUT&=0X7F;//LED4亮、强。(>20)
                 P2OUT|=0X01;
                 P1OUT|=0X10;
                 Signal_Val=Rx1_Data_Buffer[i+6]-48;//十位BCD码
                 Signal_Val=Signal_Val<<4;//左移8位。
                 Signal_Val+=Rx1_Data_Buffer[i+7]-48;//个位BCD码
                 if(Signal_Val>0x31)
                   Signal_Val=0x31;
                goto Signal000;
               }
            if(((Rx1_Data_Buffer[i+6]-48)==1)&&((Rx1_Data_Buffer[i+7]-48)<=9))//信号强度
              {
                AT_Set_Ok=1;
                P2OUT&=0XFE;//LED5亮、中。(>10<20)
                P1OUT|=0X90;
                Signal_Val=Rx1_Data_Buffer[i+6]-48;//十位BCD码
                Signal_Val=Signal_Val<<4;//左移8位。
                Signal_Val+=Rx1_Data_Buffer[i+7]-48;//个位BCD码
                 if(Signal_Val>0x19)
                   Signal_Val=0x19;
               goto Signal000;
              }
           }
       if(Rx1_Data_Buffer[i+7]==',')//信号强度小于10 
            {
             AT_Set_Ok=1;
             P1OUT&=0XEF;//LED6亮、低。(<10)
             P2OUT|=0X01;
             P1OUT|=0X80;   
             Signal_Val=Rx1_Data_Buffer[i+6]-48;//BCD码
             if(Signal_Val>9)
              Signal_Val=0x09;
             goto Signal000;
            }
          }
        }
 
} 
Signal000:
 if(AT_Set_Ok==0)
  Signal_Val=0x00;
 AT_Set_Ok=0;
 if(Signal_Val==0x00)
  {
   if((Inqury_Counter--)!=0)
     {
      for(i=0;i<20;i++)
      {
       Rx1_Data_Buffer[i]=0;
      }
      goto Inqury_Again;
     } 
  }
if(Signal_Val==0x00)
{
  if(Temp%2==0)
    Temp+=1;
  else
    Temp-=1;  
 Signal_Val=Temp;
}
/*
 User_Data[0]=User_Data[3]=0x68;//数据头
 User_Data[1]=User_Data[2]=11;//数据长度
 User_Data[4]=0x5A;  //控制字
 User_Data[5]=0x99;  //获取终端地址低位
 User_Data[6]=0x99;  //获取终端地址高位
 User_Data[7]=0x06;  //类型
 User_Data[8]=0x82;  //可变结构限定词
 User_Data[9]=0x05;  //传送原因
 User_Data[10]=0x55; //数据单元标识L
 User_Data[11]=0x30; //数据单元标识H
 User_Data[12]=0x00; //记录地址
 User_Data[13]=(Signal_Val&0X0F)+0X30;   //信号强度
 User_Data[14]=((Signal_Val>>4)&0X0F)+0X30; 
 for(i=0;i<=10;i++)//计算102规约校验和
 {
  CheckSum+=User_Data[4+i];
 }
 User_Data[15]=CheckSum;
 User_Data[16]=0x16;
 */
 User_Data[0] = 0x68;
 User_Data[1] = 0x99;
 User_Data[2] = 0x99;
 User_Data[3] = 0x99;
 User_Data[4] = 0x99;
 User_Data[5] = 0x5E;
 User_Data[6] = 0x00;
 User_Data[7] = 0x68;
 User_Data[8] = 0x0F;
 User_Data[9] = 0x09;		// 自定义数据帧数据区长度
 User_Data[10]= 0x00;
 User_Data[11] = 0x1A;
 User_Data[12] = 0x82;
 User_Data[13] = 0x20;
 User_Data[14] = 0x99;
 User_Data[15] = 0x12;
 User_Data[16] = 0x34;
 User_Data[17] = 0x56;
 User_Data[18] = 0x78;
  User_Data[19]=(Signal_Val&0X0F)+0X30;   //信号强度
 User_Data[20]=((Signal_Val>>4)&0X0F)+0X30; 
 for(i=0;i<=20;i++)//计算校验和
 {
  CheckSum+=User_Data[i];
 }
 User_Data[21]=CheckSum;
 User_Data[22]=0x16;
 Data_Cmnd_Snd(22,User_Data,0,5);//向串口0发送信号强度数据,发送长度22
 P5OUT|=0x80;//接收指示灯灭。
 Rx1_TimeOut_Flag=0;
 
}
//==============================================
//函数:Rd_Parameter_Initial()
//功能:从EEPROM中读取工作参数、IP地址、端口、SMS号码等
//      初始化波特率、定时器等
//输入参数:
//输出参数:
//==============================================
char Read_Parameters_Initial(char Address)
{
  char  i,j;
  Uint   Temp2;
  char  *Cgdcont="AT+CGDCONT=1,"; //设置PDP通道
   WDTCTL=WDTPW+WDTCNTCL;
 Rd_Data(Address,91,Temp_iArray);//读取0x06通讯口配置参数。

 if(Temp_iArray[0]==0x2f)//寻找数据头
   {
     if((Temp_iArray[2]==90)&&(Temp_iArray[5]==0xfd))//判断数据长度、功能码是否为设置命令。
     {
        for(i=0;i<=90;i++)
         {
          Temp_cArray[i]=Temp_iArray[i];
         }
       Cal_Crc(&Temp_cArray[1],88);//计算CRC
       Temp2=Temp_cArray[89];//比较CRC
       Temp2=Temp2<<8;
       Temp2=Temp2+Temp_cArray[90]; 
       if(CRC==Temp2)//若CRC相等,则读出的数据正确。
        {
          Read_Flag=1;             //从EEPROM中读取的数据正确。
          Work_Mode=Temp_cArray[6];//工作模式 
          
        for(i=0;i<=12;i++)//读取APN名称.
            {
              AT_CGDCONT[i]=*(Cgdcont+i);//="AT+CGDCONT=1,
            }
          AT_CGDCONT[13]=AT_CGDCONT[16]=0X22;
          AT_CGDCONT[14]='I';
          AT_CGDCONT[15]='P';
          AT_CGDCONT[17]=',';
          AT_CGDCONT[18]=0X22;
          for(i=0;i<=19;i++)//读取APN名称.
           { 
            if(Temp_cArray[7+i]!=0xFF)
             AT_CGDCONT[i+19]=Temp_cArray[7+i];
            else
             break; 
          }
          AT_CGDCONT[i+19]=0x22;
          AT_CGDCONT[i+20]=0x0d;
         for(j=i+21;j<=39;j++)//后面填零,以便计算长度.
            {
              AT_CGDCONT[j]=0;
            } 
             WDTCTL=WDTPW+WDTCNTCL;    
//============以下装入IP地址================      
         for(i=0;i<=10;i++)//IP地址的AT命令。
            {
             AT_OpenIp0[i]=OpenIp[i];//
            }
           AT_OpenIp0[11]='"';
           AT_OpenIp0[27]='"';
           AT_OpenIp0[15]='.';
           AT_OpenIp0[19]='.';
           AT_OpenIp0[23]='.';
           AT_OpenIp0[28]=',';
           AT_OpenIp0[34]=0x0d;
         for(i=0;i<=2;i++)//***.***.***.***IP地址格式。
             {
              AT_OpenIp0[12+i]=Temp_cArray[27+i];
             }
           
         for(i=0;i<=2;i++)//***.***.***.***IP地址格式。
             {
              AT_OpenIp0[16+i]=Temp_cArray[30+i];
             }
           
         for(i=0;i<=2;i++)//***.***.***.***IP地址格式。
            {
              AT_OpenIp0[20+i]=Temp_cArray[33+i];
             }
           
          for(i=0;i<=2;i++)//***.***.***.***IP地址格式。
             {
              AT_OpenIp0[24+i]=Temp_cArray[36+i];
              }
           
          for(i=0;i<=4;i++)//数据服务中心通信端口号。
             {
               AT_OpenIp0[29+i]=Temp_cArray[39+i];
              }   
    //====IP地址处理结束======。    
       TCP_UDP=Temp_cArray[44];//网络数据传输协议。
       Heart_Beat_Time=Temp_cArray[56];//心跳周期
       for(i=0;i<=5;i++)
       {
         PassWord[i]=Temp_cArray[57+i];//模块设置密码
       }
       for(i=0;i<=5;i++)
         {
           Terminal_SIM[i*2+1]=Temp_cArray[45+i*2];//数据终端手机号码,位置交换。
           Terminal_SIM[i*2]=Temp_cArray[45+i*2+1];
           Center_SIM[i*2+1]=Temp_cArray[74+i*2];  //短信通信手机号码。位置交换。
           Center_SIM[i*2]=Temp_cArray[74+i*2+1]; 
           Data_Center_Sim[i*2+1]=Temp_cArray[74+i*2];//报警数据中心手机号码。位置交换。
           Data_Center_Sim[i*2]=Temp_cArray[74+i*2+1]; 
           }
        Terminal_SIM[10]='F';
        Center_SIM[10]='F';
        Data_Center_Sim[10]='F';
      WDTCTL=WDTPW+WDTCNTCL;
       
       for(i=0;i<=3;i++)//短信服务中心号码的区号
         {
           SCA_SIM[i]=Temp_cArray[63+4+i];
         }
        _NOP();
         }  
     }
   }  
 if(Read_Flag==0)//若未进行初始化过或读取参数不对,则工作于GSM+SMS模式、9600波特率。
 {
   Work_Mode=0x02;
  }
  WDTCTL=WDTPW+WDTCNTCL;
 _3NOP();
 Timer_Initial(); //初始化TIMERA。  
 _3NOP();
 USART0_Initial();
 _3NOP();
 USART1_Initial();//串行口1初始化:无校验,9600、8位数据位、1位停止位。   
 _3NOP();
 _EINT();           //开放全局中断 
 _3NOP();
 WorkMode_Initial_Log();//初始化GPRS工作方式、登陆CMNET、连接中心IP等。 
 return Read_Flag;
}
//=============================================
//函数:WorkMode_Initial_Log()
//功能:GPRS工作模式初始化、连接(若工作于GPRS模式)
//输入参数:
//输出参数:
//==============================================
void   WorkMode_Initial_Log(void)
{
 char  i; 
 char  *AT_CNMI="AT+CNMI=3,2,0,1\r";//SMS串口接收
 
 char  AT_CNMI01[16]={'A','T','+','C','N','M','I','=','3',',','1',',','0',',','0',0x0D};//GPRS+SMS模式
 char  AT_CBST[15]={'A','T','+','C','B','S','T','=','7',',','0',',','1',',',0X0D};//数据拨号类型。
 char  AT_CPMS01[23]={'A','T','+','C','P','M','S','=',
                      '"','S','M','"',',','"','S','M','"',',','"','S','M','"',0X0D};
  
 char  *AT_CRC="AT+CRC=1\r";//区分是语音来电、还是数据来电。
 char  *AT_S00="ATS0=0\r";
 char  *AT_S02="ATS0=2\r";
 char  *AT_IpParameters="AT*E2IPS=2,10,1,512\r";//等待2秒,重试10次,100毫秒,缓冲区512字节
 char  AT_SCA[25]={'A','T','+','C','S','C','A','=',
              '"','+','8','6','1','3','8','0','0','5','7','1','5','0','0','"',0x0d};
 char  *AT_Ring="AT*E2SMSRI=500\r";
 //char  *AT_PRn="AT*EPNR=2,1,8\r";
  WDTCTL=WDTPW+WDTCNTCL;
 SMS_Mode=0xFF;
 //SMS_Index=0;
 Command_Data_Status=0;//在命令行状态。
 AT_Test_Flag=0;
 First_Connect_Flag=1;
 Read_SMS_Time=60000;//10;
 P1OUT|=0X40;
 P2OUT|=0X02;
 for(i=0;i<=3;i++)
 {
  AT_SCA[16+i]=SCA_SIM[i];
 }
  
for(i=0;i<=3;i++)
 {
 Gprs_At_Command(sizeof(AT)+1,AT,30);//AT命令,测试GPRS.
 if(AT_Test_Flag==0)//若AT测试命令没有返回并且GPRS电源打开。
    {
     P4OUT|=0X02; //回到命令状态。
     Delay(200);
     TXBUF1=0X1B;
     Delay(10);
     Gprs_At_Command(sizeof(AT_3Plus)+1,AT_3Plus,30);
    }
 else 
   break; 
 } 
  Gprs_At_Command(12,AT_Echo,30);//命令不返回,结果码格式为字符、DTR控制、DCD指示。
 
  Inqury_Signal();
  Gprs_At_Command(10,AT_CMGF,30); //设置短信息的格式为:PDU模式
  Gprs_At_Command(15,AT_Ring,30); //短信振铃指示。
  Gprs_At_Command(25,AT_SCA,30);//设置短信服务中心号码
    WDTCTL=WDTPW+WDTCNTCL;  
  if(Work_Mode==0)//若是GSM工作模式。
      { 
        P2IE=0X00;//禁止P2.2中断
        Gprs_At_Command(9,AT_CloseIp,50); //关闭IP连接
        Gprs_At_Command(16,AT_CNMI,30);   //设置GSM短信息接收方式:串口直接接收。
        Gprs_At_Command(15,AT_CBST,30);  //数据拨号类型。
        Gprs_At_Command(9,AT_CRC,30);    //区分是语音来电、还是数据来电。
        Gprs_At_Command(7,AT_S02,30);   //设置摘机响铃次数:2次。
        Gprs_At_Command(5,AT_W,30);    //保存设置 
       }
  if(Work_Mode==1)//若是GPRS工作模式。 
      {   
         P2IFG=0;
         P2IE=0X04;//开放P2.2中断
         P2IES=0X00;//上升沿触发
         Gprs_At_Command(9,AT_CloseIp,50);  //关闭IP连接
         Gprs_At_Command(7,AT_S00,30);//设置摘机响铃次数:不摘机。
         Gprs_At_Command(16,AT_CNMI01,30);//设置GPRS短信息接收方式:存放于SIM中。
         Delay(20);
         Gprs_At_Command(23,AT_CPMS01,30);//短信保存位置  
         Delay(20);
         Gprs_At_Command(20,AT_IpParameters,30);//设置IP参数:等待时间、重发次数等
         Gprs_At_Command(5,AT_W,30);    //保存设置  
         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];

⌨️ 快捷键说明

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