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

📄 cgtm900.cpp

📁 华为GPRSGTM900的类
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	read_numl+='0';
	clr_at_rxbuf();
    tab_sp=at_cmd_cmgr;
	write_at_cmd(); //发送CMGR,读短信
	
	if((read_numh!='0')&&(read_numh!='1')) read_numh='0';
	//if((read_numl<'1')||(read_numl>'9')) read_numl='1';
	
	if(read_numh>'0')
	{
		uart.SendByte(read_numh);	//numh
		
	}
	
	uart.SendByte(read_numl);
	
	write_at_crlf();//
	
	for(j=0;j<20;j++)
		{
		  wait_for_ack(25); //等待回复帧
		  if(rec_count>0) break;
		  
		 }
	//len=check_cmgr();
	len=check_cmgr_pdu();
	return len;

}
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// 函数名称: SaveSemIP(void)
// 功能描述: 保存短信发过来的IP地址,要进行ASICC到HEX的转换 
// 输  入: //"218.017.105.150",6000转化成6个数据,符合协议 
//          
// 输  出:
//            
// 全局变量: 无
// 调用模块: 
//   调用类:
//创 建  人: 杨虎岳
//日     期: 2006年6月7日
//-------------------------------------------------------------------------------------------------------
// 修改人:
// 日 期:
// 内 容:
//------------------------------------------------------------------------------------------------------
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
/*void  CGtm900::SaveSemIP(void)
{
  //"218.017.105.150",6000

  INT8U i=1,j=0,l=0,k=0,m=0;
  INT8U ipport[6];
  INT8U temp;
  INT16U temp16;
  CParameterTianJin ip;
  //前三个IP地址
  for(m=0;m<3;m++)
  {
   //j=i; 
   k=0;
   temp=0;

   while((ip_addr[i++]!='.')&&(i<ip_addr_count)) k++;
   j=i-2;
    temp+=ip_addr[j-(--k)]-'0';
   while(k>0)
   {
    temp*=10;
    temp+=ip_addr[j-(--k)]-'0';
   }
    ipport[l++]=temp;   
  }
  
  //第四个IP地址
   k=0; 
   temp=0;
   while((ip_addr[i]!='"')&&(i<ip_addr_count))
   { 
     k++;
     i++;
   }
   j=i-2;  
   temp+=ip_addr[j-(--k)]-'0';
   while(k>0)
   {
    temp*=10;
    temp+=ip_addr[j-(--k)]-'0';
   }
   ipport[l++]=temp;
   //端口号   
   i+=1;
   k=ip_addr_count-i;
    j=ip_addr_count-1; 
   temp16=0;
   temp16+=ip_addr[j-(--k)]-'0';
   while(k>0)
   {
    temp16*=10;
    temp16+=ip_addr[j-(--k)]-'0';
   }  
   ipport[l++]=temp16;
   ipport[l++]=temp16>>8;
   ip. Write(PAP0F3ADD,ipport,6);
}*/
//---------------------------------
//关闭回显:连续5次不正常,提示
//---------------------------------
INT8U  CGtm900:: write_at_ate0()//发送ATE0,关闭回显
{
    INT8U i;
	clr_at_rxbuf(); //清除接收at信息
	tab_sp=at_cmd_ate0;
	write_at_cmd(); //发送ATE0,关闭回显
	write_at_crlf(); //发送<CR><LF>
	for(i=0;i<40;i++)
    {
     wait_for_ack(5); //等待回复帧
     if(rec_count>0) break;
    }
	check_OK();	//是否是OK,产生b_ackOK
	if(!b_ackOK)
	 {
	    get_fse(0x0a,2,0x0a,3);//从第1个换行符,到第2个换行符
	    if(char_end>char_sta)
		{if((rs232_data[char_sta]=='O')&&(rs232_data[char_sta+1]=='K'))
		 b_ackOK=1;
		}
	 }
	
   return b_ackOK;
}
//---------------------------------
//信号强度:连续5次不正常,提示
//---------------------------------
INT8U  CGtm900:: write_at_csq()//信号强度
{
    INT8U signsen=0;
    INT8U i;
	clr_at_rxbuf(); //清除接收at信息
	tab_sp=at_cmd_csq;
	write_at_cmd(); //发送ATE0,关闭回显
	write_at_crlf(); //发送<CR><LF>
	for(i=0;i<50;i++)
		{
		  wait_for_ack(25); //等待回复帧
		  if(rec_count>0x10) break;
		 }
	//if(rec_count<15)
    // 	wait_for_ack(200);	
    if(rec_count>0)
	signsen=check_csq();//是否返回+CSQ:99,99
	return signsen;
}

//---------------------------------
//设置短信模式:连续5次不正常,提示
//---------------------------------
void CGtm900:: write_at_cmgf()//设置短信模式
{   
    INT8U i;
	clr_at_rxbuf(); //清除接收at信息
	tab_sp=at_cmd_cmgf;
	write_at_cmd(); //发送CMGF,txt模式
	write_at_crlf(); //发送<CR><LF>
	for(i=0;i<10;i++)
		{
		  if(rec_count>0) break;
		  wait_for_ack(25); //等待回复帧
		 }
	//if(rec_count<14)	wait_for_ack(200); //等待回复帧
	
	check_OK();	//是否是OK,产生b_ackOK
}
//---------------------------------
//设置新短信提示:连续5次不正常,提示
//---------------------------------
void  CGtm900::write_at_cnmi()//设置新短信提示
{   INT8U i;
	clr_at_rxbuf(); //清除接收at信息
	tab_sp=at_cmd_cnmi;
	write_at_cmd(); //发送CNMI,新短信提示
	write_at_crlf(); //发送<CR><LF>
	
	for(i=0;i<10;i++)
		{
		  if(rec_count>0) break;
		  wait_for_ack(25); //等待回复帧
		 }
	//if(rec_count<14)	wait_for_ack(200); //等待回复帧
	check_OK();	//是否是OK,产生b_ackOK
}

//---------------------------------
//初始化PDP,击活参数,正常返回OK
//---------------------------------
void CGtm900:: write_at_cgd()//初始化PDP,配置APN,击活参数,正常返回OK
{   
    INT8U i;
    INT8U apnbuf[20];
    //INT8U useapnbuf[20];
    //const cmnetsm[5]={67,77,78,69,84}
   // const tjout[3]={46,84,74}
   // const cmnetbg[5]={99,109,110,101,116};
    ip.Read(PAP0F3ADD+24,16, apnbuf);
     i=0;
     while(apnbuf[i]!=0x00&&i<16)
     i++;
    
   /* if(endfg==FALSE)
    {  while(i<16) 
	 {
	   
	   if(apnbuf[i]==cmnetsm[0]) break;
	   i++;
	 }
	 j=0;	//
	 while (j<5&&i<16)
	  {
		if(apnbuf[i]!=cmnetsm[j])
		{   
			break;
		}
		i++;
		j++;
	  }
	  if(j>4)  endfg=TRUE;
   }
	 if(endfg==FALSE)
    {  while(i<16) 
	 {
	   
	   if(apnbuf[i]==cmnetbg[0]) break;
	   i++;
	 }
	 j=0;	//
	 while (j<5&&i<16)
	  {
		if(apnbuf[i]!=cmnetbg[j])
		{   
			break;
		}
		i++;
		j++;
	  }
	  if(j>4)  endfg=TRUE;
   }
   
    if(endfg==FALSE)
    {  while(i<16) 
	 {
	   
	   if(apnbuf[i]==tjout[0]) break;
	   i++;
	 }
	 j=0;	//
	 while (j<5&&i<16)
	  {
		if(apnbuf[i]!=tjout[j])
		{   
			break;
		}
		i++;
		j++;
	  }
	  if(j>1)  endfg=TRUE;
   }
   */
	clr_at_rxbuf(); //清除接收at信息
	tab_sp=at_cmd_cgd;
	write_at_cmd(); //at+cgdcont=1,"ip","cmnet"
	uart.SendByte('"');
	uart.SendNByte(apnbuf,i);
	uart.SendByte('"');
	//'"','C','M','N','E','T','"'
	write_at_crlf(); //发送<CR><LF>
	for(i=0;i<60;i++)
		{
		  wait_for_ack(25); //等待回复帧
		  if(rec_count>5) break;
		 } //等待回复帧
	check_OK();	//是否是OK,产生b_ackOK
}
//选择HEX字符节
void CGtm900::write_at_cscs(void)
{
     clr_at_rxbuf(); //清除接收at信息
	tab_sp=at_cmd_cscs;
	write_at_cmd(); //at+cgdcont=1,"ip","cmnet"
	write_at_crlf(); //发送<CR><LF>
	wait_for_ack(50); //等待回复帧
	check_OK();	//是否是OK,产生b_ackOK


}
//---------------------------------
//初始化TCPIP,正常返回OK
//---------------------------------
void  CGtm900::write_at_etcp()//初始化TCPIP,正常返回OK
{   
    INT8U i;
	clr_at_rxbuf(); //清除接收at信息
	tab_sp=at_cmd_etcp;
	write_at_cmd(); //at%etcpip
	write_at_crlf(); //发送<CR><LF>
	for(i=0;i<100;i++)//要等5秒钟才行。
	  { 
	    wait_for_ack(25); //等待回复帧3-60秒不等
	    if(rec_count>5)
	    {
	     check_OK();
	     break;
	     
	     }
	  }
		//是否是OK,产生b_ackOK
}
//---------------------------------
//设置用户数据接口,正常返回OK
//---------------------------------
void  CGtm900::write_at_iomode()//设置用户数据接口,正常返回OK
{   INT8U i;
	clr_at_rxbuf(); //清除接收at信息
	tab_sp=at_cmd_iomode;
	write_at_cmd(); //at%iomode=0
	write_at_crlf(); //发送<CR><LF>
	for(i=0;i<5;i++)
	{
	 wait_for_ack(25); //等待回复帧
	 if(rec_count>5)
	  { check_OK();	//是否是OK,产生b_ackOK
	    break;
	  }
	
	 }
}

//----------------------------------------------
//写at命令子程序
//----------------------------------------------
void CGtm900:: write_at_cmd()
{
	//C4851 uart1;
	do
	{
		uart.SendByte(*tab_sp);
		//uart1.SendByte485(*tab_sp);//555555555555
		
		tab_sp++;	//sp指向tab下一个值
	}
	while(*tab_sp!=0x0);
}
//--------------------------------------
void  CGtm900::write_at_crlf() //写回车换行符
{   
 
	 uart.SendByte(0x0d);	//<cr>
	 uart.SendByte(0x0a);	//<lf>

}

void  CGtm900::clr_at_rxbuf(void)
{
  uart.ClrRcvBuf();
  rec_count=0;
 
 }
//--------------------------------------
//等待回复帧
//--------------------------------------
void CGtm900::wait_for_ack(INT8U t)//10MS
{
	INT8U temp;
	INT8U i;
	//C4851 m485;
	//WatchDog_Task();
	for(i=0;i<t;i++)
	 {
	 //WatchDog_Task();
	 OSTimeDly(OS_TICKS_PER_SEC/100);//指延时多长时间开始接收数据。是帖间的延时
	 }
 // while(!rec_count)
	//{
	while(uart.ReadBuf(2,&temp)&&rec_count<Uart0BufRcvMaxData)
	{
	  MokRcvfg.clr();
	  rs232_data[rec_count++]=temp;
	  GRestGprsFg=0x00;
	  GMoudleRstcnt=0x00;
	 if(rec_count>=MaxTempBufLen) break;
	 
	}
	MokRcvfg.set();
	//}
	if(rec_count==0x00) GRestGprsFg++;
	//m485.SendNByte485(rs232_data,rec_count);

}
//--------------------------------------
//处理帧数据(获得需处理字符起始位,结束及有效位位数)
//输入:起始字符,起始字符位置,结束字符,结束字符位置
//取出需要信息的起始/结束/个数
void CGtm900:: get_fse(INT8U c_sta,INT8U s_num,INT8U c_end,INT8U e_num)
{
	INT16U i,cs_num,ce_num;//变量长度前后一定要一致
	char_sta=0;//起始位清零
	char_end=0;//起始位清零
	cs_num=0x0;//记录第几个起始符
	ce_num=0x0;//记录第几个结束符
	char_count=0;//有效位计数器清零
	for(i=0;i<rec_count;i++)
	{
		if(char_sta!=0x0)
		{
			char_count+=1;//开始计数
		}
		/////////////////////////////////////
		if(rs232_data[i]==c_sta) //是起始字符
		{
			cs_num+=1;
			if(cs_num==s_num)
			{
				char_sta=i+1;//记录起始位置
			}
		}
		/////////////////////////////////////
		if(rs232_data[i]==c_end) //是结束字符
		{
			ce_num+=1;
			if(ce_num==e_num)
			{
				char_end=i-1;//记录结束位置
			}
		}
	}
}
//返回是否是OK
void  CGtm900::check_OK()
{
	b_ackOK=0;
	if(rec_count)
	{
		get_fse(0x0a,1,0x0a,2);//从第1个换行符,到第2个换行符
		if((rs232_data[char_sta]=='O')&&(rs232_data[char_sta+1]=='K'))
		b_ackOK=1;	
	}
}

void  CGtm900::check_error()//返回是否是ERROR:
{
	INT8U i;
	b_ackOK=0;
	if(rec_count)
	{
	get_fse(0x0a,1,0x0a,2);//从第1个换行符,到第2个换行符
	b_ackOK=1;
	i=0;	//
	do
	{
		if(rs232_data[char_sta+i]!=at_ack_errn[i])
		b_ackOK=0;
		i+=1;
	}while (at_ack_errn[i]!=0);
	}
}
//是否是准备就绪
void  CGtm900::check_cpas()	//			
{
	INT8U i;
	b_ackOK=0;
	if(rec_count)
	{
	get_fse(0x0a,1,0x0a,2);//从第1个换行符,到第2个换行符
	b_ackOK=1;
	i=0;	//
	do
	{
		if(rs232_data[char_sta+i]!=at_ack_cpas[i])
		b_ackOK=0;
		i+=1;
	}while (at_ack_cpas[i]!=0);
	}
}
//是否是有短消息,返回短信条数
INT8U  CGtm900::check_cpms()	//			
{
	INT8U i;
	
	if(rec_count)
	{
	get_fse(0x0a,1,0x0a,2);//从第1个换行符,到第2个换行符
	
	i=0;	//
	do
	{
		if(rs232_data[char_sta+i]!=at_ack_cpms[i])
		{
		  GNoteOkFalg=0;
		  return FALSE;
		 
		}
		i+=1;
	}while (at_ack_cpms[i]!=0);
	
	    i=0;
		get_fse(',',0x01,',',0x02);
		
		if(char_sta==char_end) 
		{

⌨️ 快捷键说明

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