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

📄 gprs.c

📁 单片机数据通讯典型应用(光盘内容)
💻 C
📖 第 1 页 / 共 3 页
字号:
        delay(4000);
        conn_module();                      //模拟开关连接到模块
       }
       if(inbuf[12]=='2')   //表示数据已经接收完毕
        {
         inbuf[2]=0;
         conn_485();                      //模拟开关连接到485总线
         send_str("All data have been written!\r\n\0");
         delay(4000);
         conn_module();                      //模拟开关连接到模块
        }
     }
     
        
    break;
    
    default:     //数据流
         if((SISW[1]=='1')&&(int1_RI==1))
          {
           int1_RI=0;
           WDT_CONTR=0x3e;                    //喂狗    
           send_SISW();
           conn_485();                      //模拟开关连接到485总线
           send_str("Data have been sent!\r\n\0");
           delay(4000);
           conn_module();                      //模拟开关连接到模块
          } 
          
    break;     
     }   //switch语句结束
     
   }     //while函数结束

}       //主函数结束

/*******************************************************************************/
/*****************************函数定义******************************************/
/*******************************************************************************/


/******************************************************************************/
/*                            延时t毫秒                                       */
/******************************************************************************/

void delay(uint time)
{
  uint t;
  for(t=0;t<time;t++)
  {;}
}

/******************************************************************************/
/*                        串行口和定时器0初始化                               */
/******************************************************************************/
void serl_init(void)
  {
  /***********************************************************************
  波特率    晶振/MHZ    SMOD    定时器1模式     定时器初值
  57600     11.0592      1          2             FFH
  19200     11.0592      1          2             FDH
  9600      11.0592      0          2             FDH
  4800      11.0592      0          2             FAH
  2400      11.0592      0          2             F4H
  1200      11.0592      0          2             E8H 
  ************************************************************************/
     TMOD=0x21;             //定时器1八位自动重装,定时器0十六位
     TL1=0xFD;              
     TH1=0xFD;
     SCON=0x50;             //串口工作于方式1,10位异步,定时器控制
     //PCON=0x80;             //外晶振11.0592MHz,19200波特

     TR1=1;                 //开定时器1
     ES=1;                 // 使能串行中断
     ET0=1;                // 使能定时器0中断   
     EX1=1;                 //使能外部中断1
     ET2=1;                 // 使能定时器2中断
     EA=1;                  // 使能总中断
     WDT_CONTR=0x3e;           //启动看门狗,溢出时间为4.55s。
                              //喂狗,不要用WDT_CONTR=WDT_CONTR|0x10
                              //溢出时间=(时钟模式*预分频值*32768)/晶振频率
/**************************************************************************
 寄存器        7	6		5		 4		  3		  2	   1    0    复位值
WDT_CONTR      -	-    EN_WDT  CLR_WDT  IDLE_WDT  PS2  PS1  PS0  xx000000
看门狗定时器              使能狗   清空狗  空闲计数    预分频器
**************************************************************************/
   }

/******************************************************************************/
/*                              启动模块                                      */
/******************************************************************************/
void IGT_target(void)
{
   
    P1_4=0;                        //使IGT信号为高电平
    delay(60000);                  //延时---time=10000时,大约延时60ms
    P1_4=1;                        //P1.4为高电平,IGT为低电平,启动模块
    delay(60000);                  //IGT拉低>100ms
    P1_4=0;                        //IGT高阻
    
}

/******************************************************************************/
/*                             连接到模块                                     */
/******************************************************************************/
void conn_module(void)
{
  P1_0=0;
  P1_1=1;
  EX1=1; 
}
/******************************************************************************/
/*                            连接到485总线                                   */
/******************************************************************************/
void conn_485(void)
{
  P1_0=1;
  P1_1=0;
  EX1=0; 
}
/******************************************************************************/
/*                              模块初始化                                    */
/******************************************************************************/
void module_init(void)
{
    send_str("ATE0\r\0");                 //设置是否回显AT指令
    Wait_clear_inbuf();                       //等待接收完一帧数据并清空接收缓冲区
    send_str("AT+IPR=9600\r\0");          //设置固定波特率
    Wait_clear_inbuf();                      //等待接收完一帧数据并清空接收缓冲区
    send_str("AT+CMEE=2\r\0");            //显示错误返回码为文本信息
    Wait_clear_inbuf();                       //等待接收完一帧数据并清空接收缓冲区
    send_str("AT^SSYNC=1\r\0");            // 把SYNC同步信号设置为LED指示模式
    Wait_clear_inbuf();                       //等待接收完一帧数据并清空接收缓冲区
}
/******************************************************************************/
/*                          GPRS通信链路初始化函数                            */
/******************************************************************************/
void TCP_set()
  {
  do{
      WDT_CONTR=0x3e;                //喂狗
      delay(60000);
    send_str("AT^SISC=0\r\0");       //关闭所有服务层
    Wait_clear_inbuf();
     send_str("AT^SISC=1\r\0");
    Wait_clear_inbuf();
     send_str("AT^SISC=2\r\0");
    Wait_clear_inbuf();
     send_str("AT^SISC=3\r\0");
    Wait_clear_inbuf();
     send_str("AT^SISC=4\r\0");
    Wait_clear_inbuf();
     send_str("AT^SISC=5\r\0");
    Wait_clear_inbuf();
     send_str("AT^SISS=0,\"srvType\",\"none\"\r\0");   //清空所有服务层
     Wait_clear_inbuf();
     send_str("AT^SISS=1,\"srvType\",\"none\"\r\0");
     Wait_clear_inbuf();
     send_str("AT^SISS=2,\"srvType\",\"none\"\r\0");
     Wait_clear_inbuf();
     send_str("AT^SISS=3,\"srvType\",\"none\"\r\0");
     Wait_clear_inbuf();
     send_str("AT^SISS=4,\"srvType\",\"none\"\r\0");
     Wait_clear_inbuf();
     send_str("AT^SISS=5,\"srvType\",\"none\"\r\0");
     Wait_clear_inbuf();
     
//*AT^SICS用于创建和编辑一个网络连接层,一个连接层可以分配一个或更多的服务层
	send_str("AT^SICS=0,\"conType\",\"GPRS0\"\r\0");    //set GPRS mode
        Wait_clear_inbuf();
	send_str("AT^SICS=0,\"user\",\"\"\r\0");            //user name
        Wait_clear_inbuf();
	send_str("AT^SICS=0,\"passwd\",\"\"\r\0");          //password
        Wait_clear_inbuf();
	send_str("AT^SICS=0,\"apn\",\"cmnet\"\r\0");        //network operater
        Wait_clear_inbuf();
    //AT^SISS用于创建一个服务层(服务器侦听模式)     

	send_str("AT^SISS=0,\"srvType\",\"socket\"\r\0");   //service type
        Wait_clear_inbuf();
	send_str("AT^SISS=0,\"conId\",\"0\"\r\0");          //I.D.
        Wait_clear_inbuf();
	send_str("AT^SISS=0,\"address\",\"socktcp://listener:20000\"\r\0");
        Wait_clear_inbuf();                             //socket, TCP mode, port 20000
  //  delay(60000);
  //  WDT_CONTR=0x3e;                    //喂狗
    clear_inbuf();                                            
                                   //若返回数据不是OK,则一直重发此指令
	send_str("AT^SISO=0\r\0");         //open the port, start service
	clear_inbuf(); 
    delay(60000);
    WDT_CONTR=0x3e;                    //喂狗
    
    delay(60000);
    WDT_CONTR=0x3e;

        while(!Wait_RI)        //等待接收数据
        {
         WDT_CONTR=0x3e;
        } 
        Wait_RI=0;
          do{
             WDT_CONTR=0x3e;
             if(inbufsign)
	          {
	           i=getbyte();
	          }
             else
               break;
             }while(i!='K');
     }while(inbufsign==0);


 /*****************获取Ip地址**********************************/
          WDT_CONTR=0x3e;                    //喂狗
          delay(60000);
          delay(60000);
          WDT_CONTR=0x3e;                    //喂狗

          EA=0;
          TI=1;
          printf("AT^SISO?\r");       //不用中断
          TI=0;

  do{
      do
	  {
	    while(!RI);        //等待接收数据
	    j=SBUF;
	    RI=0;
	  }while(j!='0');      //服务层0后面应该是一个逗号
	  
        while(!RI);        //等待接收数据 
        j=SBUF;
        RI=0;
 }while(j!=',');
for(n=0;n<11;n++)       //第11个"后是IP地址和端口号
{
    do
	{
	  while(!RI);        //等待接收数据 
	  j=SBUF;
	  RI=0;
	}while(j!='\"');
}
     i=1;
     do
	{
	  while(!RI);        //等待接收数据 
	  j=SBUF;
	  IP_self_buf[i++]=j;
	  RI=0;
	}while(j!='\"');      //"为IP地址终止位

	i=i-1;
    IP_self_buf[i++]='!';      //IP以!结尾
	IP_self_buf[i++]='\x1a';
    IP_self_buf[i++]='\r';
	IP_self_buf[i]='\0';
    IP_self_buf[0]='%';       //IP以%开头
	IP_self=IP_self_buf;         //IP_self指针指向自己的ip地址

    EA=1;
}



/******************************************************************************/
/*                           短消息参数初始化                                 */
/******************************************************************************/

void SMS_set()
  {
send_str("AT+CMGF=1\r\0");    //设置短消息格式为text格式
Wait_clear_inbuf();
send_str("AT^SSDA=1\r\0");   //允许显示短消息
Wait_clear_inbuf();
send_str("AT+CSMS=1\r\0");   // 设为Phase2+版本
Wait_clear_inbuf();
send_str("AT^SSMSS=0\r\0");    //MT的存储顺序为先ME后SM
Wait_clear_inbuf();
send_str("AT^SM20=1,0\r\0");   //设置发送短消息模式,如果未发送成功,返回ERROR。
Wait_clear_inbuf();
send_str("AT^SMGO=1\r\0");    //使能查询短信存储区是否已满
Wait_clear_inbuf();
//若SIM未初始化完毕,以下指令显示 ERROR: SIM busy!

    do{
       delay(60000);
       send_str("AT+CPMS=\"MT\",\"MT\",\"MT\"\r\0");    //首选短消息存储区
       delay(60000);
       while(!Wait_RI)        //等待接收数据
        {
         WDT_CONTR=0x3e;
        } 
        Wait_RI=0;
          do{
             if(inbufsign)
	           i=getbyte();
             else
               break;
             }while(i!='K');
          if(i=='K')
             inbufsign=1;
          else
             { inbufsign=0;
               WDT_CONTR=0x3e;
               delay(60000);
               WDT_CONTR=0x3e;
               delay(60000);
               WDT_CONTR=0x3e;
               delay(60000);
               WDT_CONTR=0x3e;
             }
     }while(inbufsign==0);
WDT_CONTR=0x3e;
delay(60000);

send_str("AT+CNMI=2,2,0,0,1\r\0");
Wait_clear_inbuf();

//AT+CNMI  设置接收短消息模式
//AT+CNMI=[<mode>[,<mt>[,<bm>[,<ds>[,<bfr>]]]]]

//mode - 通知方式:
//"  0 - 不通知TE。
//"  1 - 只在数据线空闲的情况下,通知TE;否则不通知TE。
//"  2 - 通知TE。在数据线被占用的情况下,先缓冲起来,待数据线空闲,再行通知。
//"  3 - 通知TE。在数据线被占用的情况下,通知混合在数据中一起传输。

//mt - 消息储存或直接转发到TE:
//"  0 - 储存到默认的内存位置(包括class 3)
//"  1 - 储存到默认的内存位置,并且向TE发出通知(包括class 3)
//"  2 - 对于class 2,储存到SIM卡,并且向TE发出通知;对于其它class,直接将消息转发到TE
//"  3 - 对于class 3,直接将消息转发到 TE;对于其它class,同mt=1

//bm - 短消息广播        0 不发给TE;1 发给TE

//ds - 状态报告          0 不发给TE;1 发给TE

//bfr - 在<mode>=1,2,3时URC的TA缓冲区被清除.一般设置为1.

//短消息类(class)的概念:根据指定储存的位置,短消息分为class 0 - 3四个类。
//也可以不指定类(no class),由ME按默认设置进行处理,存储到内存或者SIM卡中。
//在TPDU的TP-DCS字节中,当bit7-bit4为00x1, 01x1, 1111时,bit1-bit0指出消息所属类:
//"  00 - class 0:只显示,不储存
//"  01 - class 1:储存在ME内存中
//"  02 - class 2:储存在SIM卡中
//"  03 - class 3:直接传输到TE

//send_str("AT&W\r");   //保存设置

⌨️ 快捷键说明

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