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

📄 cgtm900.cpp

📁 华为GPRSGTM900的类
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	   if(!b_ackOK)  check_OK();
       if(b_ackOK) 	break;
	//clr_at_rxbuf(); //清除接收at信息
     }
    }
//if(!b_ackOK) goto reStart;??????????????
///////////////////////////////////
 
	for(i=0;i<3;i++)
   {
    write_at_cgd();
    write_at_etcp();//初始化ETCP,正常返回OK, 防止网络意外关闭,所以多加了一次初始化
    //SaveLocal_IP();
    clr_at_rxbuf();
    connect_IP();//连接服务器
  //clr_at_rxbuf(); //清除接收at信息
   for(j=0;j<60;j++)
  {
   if(rec_count>6) break;
   wait_for_ack(25); //等待回复帧20-30秒可以返回
   }
	if(rec_count)
     {
	  check_connect();
     if(b_ackOK)
     { 
       GOnNetFg=TRUE;
       GOnHomeFg=FALSE;
      break;
     
     }
							//clr_at_rxbuf(); //清除接收at信息
     }
  }
 }
 ack_msgOE();
 SaveSemIP();
  if(b_ackOK)
     { 
       i=0;
       do//
       {
        write_at_iomode();//设置用户数据接口,正常返回OK
        if(rec_count==0)
          return FALSE;
         if(!b_ackOK)	{i++;}
       }//
      while((!b_ackOK)&&i<5);//
    }     
 return 0;
 }*/
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// 函数名称: power_on(void)	//开机
// 功能描述: 开机 
// 输  入:  
//          
// 输  出: 
//            
// 全局变量: 无
// 调用模块: 
//   调用类:
//注意事项:开机后延时时间要考虑一下,延时20秒
//创 建  人: 杨虎岳
//日     期: 2006年6月7日
//-------------------------------------------------------------------------------------------------------
// 修改人:
// 日 期:
// 内 容:
//------------------------------------------------------------------------------------------------------
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
void  CGtm900::power_on(void)	//开机
{    INT8U i;
//	do
//	{
//		op_time=0x0;//清重复操作次数
        //INT8U const at_cmd_mso[]={"AT%MSO"};	//关机,无返回
        //INT8U *const tab_sp;
        CGPIOOUT PWON(GPRS_GPON );
		//tab_sp=at_cmd_mso;
		//write_at_cmd(); //发送AT
		//write_at_crlf(); //发送<CR><LF>
		//wait_for_ack(25);
		PWON.clr();
		//GTime=0;
        //while(GTime<100);
        OSTimeDly(OS_TICKS_PER_SEC/4);
        //WatchDog_Task();
         OSTimeDly(OS_TICKS_PER_SEC/4);
		PWON.set();
		for(i=0;i<120;i++)
		//wait_for_ack(5);
		//{
		 // WatchDog_Task();
		 OSTimeDly(OS_TICKS_PER_SEC*30);
		//}
	    
}

 void  CGtm900::power_off(void)
 {    INT8U i;
 
      CGPIOOUT PWON(GPRS_GPON );
		//tab_sp=at_cmd_mso;
		//write_at_cmd(); //发送AT
		//write_at_crlf(); //发送<CR><LF>
		//wait_for_ack(25);
		PWON.clr();
		//GTime=0;
       
		//for(i=0;i<12;i++)
		//wait_for_ack(5);
		//{
		  //WatchDog_Task();
		 OSTimeDly(OS_TICKS_PER_SEC*3);
		//}
		PWON.set();
       OSTimeDly(OS_TICKS_PER_SEC/4);
 }
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// 函数名称: INT8U QueSmCnt(void)
// 功能描述: 显示短信载体设置,查询有多少条短信没有读 
// 输  入:  
//          
// 输  出: 
//            
// 全局变量: 无
// 调用模块: 
//   调用类:
//创 建  人: 杨虎岳
//日     期: 2006年6月7日
//-------------------------------------------------------------------------------------------------------
// 修改人:
// 日 期:
// 内 容:
//------------------------------------------------------------------------------------------------------
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
INT8U  CGtm900::QueSmCnt(void)
{
	    INT8U i=0;
	    while(!GNoteOkFalg&&i<3)
         { 
             GNoteOkFalg=InitNote();
             i++;
         }
         
		clr_at_rxbuf(); //清除接收at信息
		tab_sp=at_cmd_cpms;
		write_at_cmd(); //发送CNMI,新短信提示
		write_at_crlf(); //发送<CR><LF>
		for(i=0;i<5;i++)
		{
		  if(rec_count>0) break;
		  wait_for_ack(10); //等待回复帧
		 }
		i=0;
	   if(rec_count)
		i=check_cpms();
		return i;
}
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// 函数名称: INT8U check_csq()
// 功能描述: 信号强度
// 输  入:  
//          
// 输  出: 信号强度
//            
// 全局变量: 无
// 调用模块: 
//   调用类:
//创 建  人: 杨虎岳
//日     期: 2006年6月7日
//-------------------------------------------------------------------------------------------------------
// 修改人:
// 日 期:
// 内 容:
//------------------------------------------------------------------------------------------------------
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

INT8U  CGtm900::check_csq()
{
	INT8U i;
	INT8U temp=0,temp1=0;
	b_ackOK=0;
	get_fse(0x0a,1,0x0a,2);//从第1个换行符,到第2个换行符
	i=0;	//判断CTMI头
	do
	{
		if(rs232_data[char_sta+i]!=at_ack_csq[i])
		b_ackOK=1;
		i+=1;
	}while (at_ack_csq[i]!=0);

	//while((rs232_data[char_sta+i]==at_ack_csq[i])&&at_ack_csq[i]!=0) i++;
	if(!b_ackOK)
	  {
	   //b_ackOK=1;
	   temp=rs232_data[char_sta+i]-'0';
	   temp1=rs232_data[char_sta+i+1]-'0';
	   temp*=10;
	   temp+=temp1;
	   if(temp>31) temp=99;
	   return temp;	  
	  }
	  return 99;
	
}
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// 函数名称: INT8U check_csq()
// 功能描述: 检查是否连接成功
// 输  入:  
//          
// 输  出: 信号强度
//            
// 全局变量: 无
// 调用模块: 
//   调用类:
//说   明:加了3个容错, 1:如果连接成功,其后紧跟的是关闭连接,则认为没有连接成功
//                        2:提示错误,但后面紧跟连接成功,则为连接成功
//                        3:重复打开连接,也认为成功。注意EROOR2和21的区别,华为模块真的不好
//创 建  人: 杨虎岳
//日     期: 2006年6月7日
//-------------------------------------------------------------------------------------------------------
// 修改人:
// 日 期:
// 内 容:
//------------------------------------------------------------------------------------------------------
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
void  CGtm900::check_connect()
{
	INT8U i,j;
	j=0;
	//b_ackOK=1;
	//b_conOK=0;
	b_ackOK=0;
	if(rec_count)
	{
	b_ackOK=1;
	get_fse(0x0a,1,0x0a,2);//从第1个换行符,到第2个换行符
	i=0;	//
	do
	{
		if(rs232_data[char_sta+i]!=at_ack_connect[i])
		{
			b_ackOK=0;
			//b_conOK=0;	
			break;
		}
		i+=1;
	}while (at_ack_connect[i]!=0);
	if(!b_ackOK)//用于检测EORRN:21和2的区别
	{
		b_ackOK=1;
		i=0;	//
		do
		{
			if(rs232_data[char_sta+i]!=at_ack_conerrn[i])
			 {b_ackOK=0;break;}
			i+=1;
		}while (at_ack_conerrn[i]!=0);
		if((char_sta+i)!=char_end) b_ackOK=0;
	}
	
	//if(rec_count>
	get_fse(0x0a,2,0x0a,3);//用于模块的非正常返回
	if(char_end>char_sta)
	{
	
        if(!b_ackOK)
        {
		b_ackOK=1;
		i=0;	//
		 do
		  {
			if(rs232_data[char_sta+i]!=at_ack_connect[i])
			 {b_ackOK=0;break;}
			i+=1;
		  }while (at_ack_connect[i]!=0);
	     }
	     else
	    //b_ackOK=1;
		{
		 i=0;	//
		 do
		 {
			if(rs232_data[char_sta+i]!=at_ack_ipclose[i])
			 break;
			 j++;
			i+=1;
		 }while (at_ack_ipclose[i]!=0);
		 if(j>7) b_ackOK=0x00;
		}
	}
	
    }
 }
 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// 函数名称: INT8U check_cmgr()
// 功能描述: 检测短信内容
// 输  入:  
//          
// 输  出: 如果是IP地址,输出为FALSE。如果是命令,输出为命令长度
//            
// 全局变量: 无
// 调用模块: 
//   调用类:DealMsg();
//说   明:加了1个容错, 1:提示错误,但后面紧跟是短信内容。
//                        2:华为模块经常有这样的事发生。
//                        
//创 建  人: 杨虎岳
//日     期: 2006年6月7日
//-------------------------------------------------------------------------------------------------------
// 修改人:
// 日 期:
// 内 容:
//------------------------------------------------------------------------------------------------------
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@	
//--------------------------------------
//返回是否是
//+CMGR: "REC UNREAD","8613510054427",,"05/07/26,09:29:26+00",145,4,0,0,"8613800755500",145,28
//IP:"218.17.105.150",6000
//--------------------------------------
/*INT8U  CGtm900::check_cmgr()//在read_msg()中调用。返回是否是+CMGR: "REC UNREAD","8613049341259",,"05/07/22,10:55:38+00",145,4,0,0,"8613800755500",145,11
{
	INT16U i;
	INT8U data_len;
	INT8U tempfg;
	check_error();
	tempfg=b_ackOK;
	//INT8U tmeplen;
	if(tempfg)
	  get_fse(0x0a,2,' ',1);//从第1个换行符,到第1个空格符
	else 
	  get_fse(0x0a,1,' ',1);//从第1个换行符,到第1个空格符
	//b_ackCMGR=1;
	i=0;	//判断CMGR头
	do
	{
		if(rs232_data[char_sta+i]!=at_ack_cmgr[i])
		//b_ackCMGR=0;
		return FALSE;
		i+=1;
	}while (at_ack_cmgr[i]!=0);
	///////////////////////////////////////////////////
	//if(b_ackCMGR) //是+CMGR
	//{
	  
	      get_fse('"',3,'"',4);//从第3个"符,到第4个"符
		for(i=0;i<13;i++) //保存回复地址
		{
			ack_addr[i]=rs232_data[char_sta+i] ;
		}
		///////////////////////////////////////////////
		//保存短信内容
		 if(tempfg)
	      get_fse(0x0a,3,0x0a,4);
	     else 
		  get_fse(0x0a,2,0x0a,3);//从第2个换行符,到第3个换行符
		///////////////////////////////////////////////
		//信息保存在rs232_data[char_sta]-rs232_data[char_end-1]
		//IP:"218.17.105.150",6000
		//68999999999999680e019c1116
		///////////////////////////////////////////////
		if((rs232_data[char_sta]=='I')||rs232_data[char_sta]=='i')	//IP:"218.17.105.150",6000
		{
			//b_msgIP=1;//短信内容是IP地址
			ip_addr_count=0;//保存IP地址的字节数
			for(i=char_sta+3;i<char_end;i++)
			{
				ip_addr[ip_addr_count]=rs232_data[i];
				ip_addr_count+=1;
			}
			
			DealMsg();
			return 0x00;
		}
		
		else 
		{
			//b_msgIP=0x02;//短信内容非IP地址
			while(rs232_data[char_sta]!='6'&&char_sta<char_end)	char_sta++; //68999999999999680e019c1116
			i=char_end-char_sta;
			data_len=ascii_2_hex(&rs232_data[char_sta],&rs232_data[0], i);
			return data_len;
		}
		return FALSE;
	//}
}*/

INT8U  CGtm900::check_cmgr_pdu()//在read_msg()中调用。返回是否是+CMGR: "REC UNREAD","8613049341259",,"05/07/22,10:55:38+00",145,4,0,0,"8613800755500",145,11
{
	INT16U i;
	INT8U data_len;
	INT8U tempfg;
	//INT8U temp;
	check_error();
	tempfg=b_ackOK;
	//INT8U tmeplen;
	if(tempfg)
	  get_fse(0x0a,2,' ',1);//从第1个换行符,到第1个空格符
	else 
	  get_fse(0x0a,1,' ',1);//从第1个换行符,到第1个空格符
	//b_ackCMGR=1;
	i=0;	//判断CMGR头
	do
	{
		if(rs232_data[char_sta+i]!=at_ack_cmgr[i])
		//b_ackCMGR=0;
		return FALSE;
		i+=1;
	}while (at_ack_cmgr[i]!=0);
	//return TRUE;
	///////////////////////////////////////////////////
	 get_fse(0x0a,2,0x0a,3);
	 if(char_end>char_sta)
	   i=char_end-char_sta;
	 else
	   i=0;
	data_len=ascii_2_hex(&rs232_data[char_sta],rs232_data, i);
	i=decode_pdu_frame(rs232_data,data_len,rs232_data);
	//SendSmsNBytePdu(rs232_data,i,rs232_data);
	return i;
	//i=0;
	//temp=rs232_data[0];
	//if(temp>data_len)
	//   return FALSE;
	//i+=temp+1;//跳过短信中心地址
	//i++;//基本参数(TP-MTI/MMS/RP)
	//return data_len;
	//if(b_ackCMGR) //是+CMGR
	//{
	  
	  //    get_fse('"',3,'"',4);//从第3个"符,到第4个"符
	//      data_len=ascii_2_hex(&rs232_data[char_sta],&rs232_data[0], i);
		/*for(i=0;i<13;i++) //保存回复地址
		{
			ack_addr[i]=rs232_data[char_sta+i] ;
		}
		///////////////////////////////////////////////
		//保存短信内容
		 if(tempfg)
	      get_fse(0x0a,3,0x0a,4);
	     else 
		  get_fse(0x0a,2,0x0a,3);//从第2个换行符,到第3个换行符
		///////////////////////////////////////////////
		//信息保存在rs232_data[char_sta]-rs232_data[char_end-1]
		//IP:"218.17.105.150",6000
		//68999999999999680e019c1116
		///////////////////////////////////////////////
		if((rs232_data[char_sta]=='I')||rs232_data[char_sta]=='i')	//IP:"218.17.105.150",6000
		{
			//b_msgIP=1;//短信内容是IP地址
			ip_addr_count=0;//保存IP地址的字节数
			for(i=char_sta+3;i<char_end;i++)
			{
				ip_addr[ip_addr_count]=rs232_data[i];
				ip_addr_count+=1;
			}
			
			DealMsg();
			return 0x00;
		}
		
		else 
		{
			//b_msgIP=0x02;//短信内容非IP地址
			while(rs232_data[char_sta]!='6'&&char_sta<char_end)	char_sta++; //68999999999999680e019c1116
			i=char_end-char_sta;
			data_len=ascii_2_hex(&rs232_data[char_sta],&rs232_data[0], i);
			return data_len;
		}
		return FALSE;
	//}*/
}
 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// 函数名称: INT8U read_msg(INT8U i)
// 功能描述: 读i条短信内容
// 输  入:  
//          
// 输  出: 如果是IP地址,输出为FALSE。如果是命令,输出为命令长度
//            
// 全局变量: 无
// 调用模块: check_cmgr()
//   调用类:
//说   明:
//                        
//创 建  人: 杨虎岳
//日     期: 2006年6月7日
//-------------------------------------------------------------------------------------------------------
// 修改人:
// 日 期:
// 内 容:
//------------------------------------------------------------------------------------------------------
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@	
INT8U  CGtm900::read_msg(INT8U i)	//读取短信内容
{   
    //CUART0 uart0;
	// //清除接收at信息
	INT8U len;
	INT8U j;
	INT8U read_numh=0;
	INT8U read_numl=0;
	 j=i-1;
	while(j>=10)//j/10为什么有错误呢????
	 {
	  j-=10;
	  read_numh++;
	  }
	read_numh+='0';
	read_numl=j%10;

⌨️ 快捷键说明

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