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

📄 gprs.c

📁 单片机数据通讯典型应用(光盘内容)
💻 C
📖 第 1 页 / 共 3 页
字号:
}
 
/******************************************************************************/
/*                            删除全部短消息                                  */
/******************************************************************************/ 
  
void delete_all_sms(void)     //删除全部短消息
{
  uchar index1,index2;
  for(index1=0x31;index1<=0x39;index1++)
     {
     WDT_CONTR=0x3e;                    //喂狗
      ES=0;
      TI=1;
  	  printf("AT+CMGD=%c\r",index1);
  	  TI=0;
  	  ES=1;
  	  Wait_clear_inbuf();
     }
   for(index2=0x31;index2<0x35;index2++)
     {
       for(index1=0x30;index1<=0x39;index1++)
         {
         WDT_CONTR=0x3e;                    //喂狗
          ES=0;
     	  TI=1;
  	      printf("AT+CMGD=%c%c\r",index2,index1);
  	  	  TI=0;
  	  	  ES=1;
  	  	  Wait_clear_inbuf();
         }
     }
}
  

/**********************************************************************/
/*             创建一个服务层(客户端模式)                             */
/**********************************************************************/
void  build_srvprofile(unsigned char srvprofileID,unsigned char *IP_remove)
 { 
   do{
     EA=0;
     TI=1;
     printf("AT^SISC=%c\r",srvprofileID);          //先关闭此服务层,防止产生错误
     delay(50000);
     WDT_CONTR=0x3e;                    //喂狗
     printf("AT^SISS=%c,\"srvType\",\"none\"\r",srvprofileID);    //清空此服务层
     delay(50000);
     WDT_CONTR=0x3e;                    //喂狗
     printf("AT^SISS=%c,\"srvType\",\"socket\"\r",srvprofileID);   //service type
     delay(50000);
     WDT_CONTR=0x3e;                    //喂狗
     printf("AT^SISS=%c,\"conId\",\"0\"\r",srvprofileID);          //I.D.
     delay(50000);
     WDT_CONTR=0x3e;                    //喂狗
     printf("AT^SISS=%c,\"address\",\"socktcp://%s\"\r",srvprofileID,IP_remove); //远端IP及port
     delay(50000);
     WDT_CONTR=0x3e;                    //喂狗
     printf("AT^SISO=%c\r",srvprofileID);                          //open port to work
     TI=0;
     EA=1;  
          
     while(!Wait_RI)        //等待接收完一帧数据
     {
      WDT_CONTR=0x3e;
     } 
     Wait_RI=0;
     do{
        if(inbufsign)
	     i=getbyte();
        else
         break;       //如果没有OK,跳出循环
       }while(i!='K'); 
    }while(i!='K');
    clear_inbuf();           
  }    
 

/******************************************************************/
/*                 发送短信,告知自己的ip                         */
/******************************************************************/

void send_SMS(uchar *phone)
{    
    delay(60000); //发送短信前需等待一段时间,否则短消息发送不成功,具体原因未明。
    WDT_CONTR=0x3e;                    //喂狗
    EA=0;
    TI=1;
	printf("AT+CMGS=%s\r",phone);  //发送短信,告知自己的IP地址

	do
	{               
	  while(!RI);        //等待接受手机模块返回'>'
	  j=SBUF;
	  RI=0;
	}while(j!='>');
    WDT_CONTR=0x3e;                    //喂狗
	printf("%s",IP_self);
    TI=0;
    EA=1;
    
    Wait_clear_inbuf();


}
/******************************************************************************/
/*                     发送AT^SISW=Srvprofile,length                          */
/******************************************************************************/
  void send_SISW(void)
        {
          uchar one,ten,hun,thou;
          uint  length;
           EA=0;
           TI=1;  
           length=inlast-inbuf;
           *inlast='\0'; 
           if(length>=1000)
             {
              one=length%10+0x30;
              ten=(length/10)%10+0x30;
              hun=(length/100)%10+0x30;
              thou=length/1000+0x30;
              printf("AT^SISW=%c,%c%c%c%c\r",SISW[0],thou,hun,ten,one);
             }
             else if(length>=100)
               {
                 one=length%10+0x30;
                 ten=(length/10)%10+0x30;
                 hun=length/100+0x30;
                 printf("AT^SISW=%c,%c%c%c\r",SISW[0],hun,ten,one);
               }
                  else if(length>=10)
                   {
                    one=length%10+0x30;
                    ten=length/10+0x30;
                    printf("AT^SISW=%c,%c%c\r",SISW[0],ten,one);
                   }
                       else
                       {
                        one=length+0x30;
                        printf("AT^SISW=%c,%c\r",SISW[0],one);
                       }

	      delay(60000);     
	      WDT_CONTR=0x3e;                    //喂狗                
          printf("%S",inbuf);      
           TI=0;
           EA=1;
           
         clear_inbuf(); 
         delay(60000); 
         delay(60000);
         WDT_CONTR=0x3e;                    //喂狗
         
         while(!Wait_RI)        //等待接收完一帧数据
         {
          WDT_CONTR=0x3e;
         } 
         Wait_RI=0;
          do{
             if(inbufsign)
	           i=getbyte();
             else
                break;       //如果没有^,表示OK和^SISW不是一帧数据,跳出在大循环等待^SISW
           }while(i!='W');   
          
          if(i=='W')         //如果OK和^SISW是一帧数据,将服务层和原因信息装入数组
          {
           SISW[0]=*(getlast+2);
           SISW[1]=*(getlast+5);
          } 
        
        }
        
/*******************************************************************************/
//                                关闭上次连接 
/*******************************************************************************/
void close_conn(void)                          
{
 WDT_CONTR=0x3e;                    //喂狗
 ES=0;
 TI=1;
 printf("AT^SISC=%c\r",SISW[0]);  //关闭服务层
   			
 delay(60000);
 delay(60000);
 printf("AT^SISS=%c,\"srvType\",\"none\"\r",SISW[0]); 
   	                                           //清空此服务层,以便以后重新分配
 TI=0; 
 ES=1;
 delay(60000); 
 delay(60000); 	        
 while(!Wait_RI)        //等待接收数据
 {
   WDT_CONTR=0x3e;
 } 
 Wait_RI=0;
}






/*******************************************************************************/
//                            放入一个字节到发送缓冲区
/*******************************************************************************/
void putbyte(uchar c)
{
    ES=0;            /*暂停串行中断,以免数据比较时出错?     */
    while ( (((outlast-putlast)==2) && (outlast > putlast )) || ((outlast < putlast) && (OLEN-(putlast-outlast)==2)))
	{ ES=1;
        c++;
        c--;
        ES=0;
	}
    WDT_CONTR=0x3e;                    //喂狗
    *putlast=c;            //放字节进入缓冲区
    putlast++;          //发送缓冲区指针加一
    if (putlast==outbuf+OLEN)
    putlast=outbuf;  //指针到了顶部换到底部
    outbufsign=1;
    if (!outbufsign0)
     {
      outbufsign0=1;
      TI=1;  
     }   //缓冲区开始为空置为有,启动发送
    ES=1;
}

/**********************************************************************************/
//                       发送一个定义在程序存储区的字符串到串口
/**********************************************************************************/
void send_str(uchar  *puts)
{
  for (;*puts!='\0';puts++)   //遇到停止符\0结束
    putbyte(*puts);
}

/**********************************************************************************/
//  从接收缓冲区取一个byte,如不想等待则在调用前检测inbufsign是否为1。
//   ->inbufsign 接收缓冲区非空标志  有=1
/**********************************************************************************/
uchar getbyte (void)
{ 
  uchar idata c ;
  while(!inbufsign)         //缓冲区空等待
  {
   WDT_CONTR=0x3e;
  } 
  ES=0;
  c= *getlast;            //取数据
  getlast++;              //最后取走的数据位置加一
  inbufful=0;            //输入缓冲区的满标志清零
  	if (getlast==inbuf+ILEN)
  	  getlast=inbuf;     //地址到顶部回到底部
  	if (getlast==inlast)
  	  inbufsign=0;       //地址相等置接收缓冲区空标志,再取数前要检该标志
  ES=1;
  return (c);        //取回数据
}
/******************************************************************************/
//                  等待接收完一帧数据并清空接收缓冲区
/******************************************************************************/
void Wait_clear_inbuf(void)
   {
    while(!Wait_RI)         //缓冲区空等待
    {
     WDT_CONTR=0x3e;
    }
 
    Wait_RI=0;
    inlast=inbuf;
    getlast=inbuf;
    inbufsign=0;
    inbufful=0;
    delay(30000);
    Wait_RI=0;
    }

/*****************************************************************************/
//                            只清空接收缓冲区
/*****************************************************************************/
void clear_inbuf(void)
   {   
    inlast=inbuf;
    getlast=inbuf;
    inbufsign=0;
    inbufful=0;
    Wait_RI=0;  
    WDT_CONTR=0x3e;                    //喂狗
    }

/*****************************************************************************/
//                              串口中断处理
/*****************************************************************************/
void serial (void) interrupt 4  using 2
{
 if (TI)
    { 	TI = 0;
    	if (outbufsign)                         
    	{
    	 SBUF=*outlast;                  //未发送完继续发送
    	 outlast++;                      //最后传出去的字节位置加1
    	 if(outlast==outbuf+OLEN)    
            outlast=outbuf;      //若发送完整个缓冲区,地址到顶部回到底部
    	 if (putlast==outlast)                        
            outbufsign=0;         //若发送完毕,数据发送完置发送缓冲区空标志
     	}
   	    else 
   	      outbufsign0=0;
    }
    if (RI)
    {  RI = 0;
    	if(!inbufful)
    	{               
    	*inlast= SBUF;               //放入数据到inbuf中
    	inlast++;                    //最后放入的位置加1
        inbufsign=1;                
    	if (inlast==inbuf+ILEN)       //接收缓冲区满
            inlast=inbuf;             //地址到顶部回到底部
    	if (inlast==getlast)          
            inbufful=1;               //接收缓冲区满置满标志
        TH0=0xf5;         // 启用帧接收完成检测功能,大于延时两个字节传输时间
        TL0=0x33;         //9600bps时,两个字节传输时间大约是2ms。
                          //de18--9.4ms;f533--3ms; f199--4ms.
                          //57600bps时,两个字节的传输时间大约是0.36ms。初值为FEB4.
                          //0.5ms--fe33;0.72ms--fd68
        TR0=1;            //启动定时器0
    	}
    }
}
/******************************************************************************/
/*                Time0:  定时器0的定时时间到 ,一帧接收结束                   */
/******************************************************************************/
timer0() interrupt 1 using 0 
 {
    Wait_RI=1;              //延时时间到
 }

/******************************************************************************/
/*                               外部中断1                                    */
/******************************************************************************/
int1() interrupt 2 using 1  
 {
  conn_485();                  //模拟开关连接到485总线 PC
  int1_RI=1;
  ES=1;
 }

⌨️ 快捷键说明

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