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

📄 pdu手机采老威胜电量成功 main.c

📁 PIC18F6520+SIM300做的透明传输的DTU
💻 C
📖 第 1 页 / 共 5 页
字号:
	LoadCMD_CSCS();
  	TempFlag.Bit.f1 = 0;
  	while(TempFlag.Bit.f1 == 0)
  	{
  		SendToModule (AT_CSCS_SIZE);
		delay200ms ();

  		if(FrameFlag.Bit.EchoModule == 1)
  		{
			cRet = strncmppgm2ram(RecvFromMS,OK,L_OK);
  	  		if(cRet == 0)
  	  		{
	    		FrameFlag.Bit.EchoModule = 0;
	    		Flags.Bit.RecvEcho = 0;
  				TempFlag.Bit.f1 = 1;
  	  		}//END if(cRet == 0)
	   		else
  			{
  				for(count = 40;count>0;count--) 	//延时2秒
  				{
	  				delay50ms ();
  				}
  			}
  		}//END if(FrameFlag.Bit.EchoModule == 1)
  		Nop();
	}
  		
/*at+cgatt?: 检查DTU有没有登陆(附着attach)GPRS网络
如返回的是1则表示进入GPRS 网络,如返回的是0 则表示还未登入GPRS 网络。
*/
  	LoadCMD_CGATT();
  	TempFlag.Bit.f1 = 0;
// 	while(TempFlag.Bit.f1 == 0)
// 	{
  		ByteRecvUART2 = 0;
  		SendToModule (CGATT_SIZE);
		delay200ms ();
/*
 		if(FrameFlag.Bit.EchoModule == 1)
 		{
  	  		cRet = strncmppgm2ram(RecvFromMS,PLUSCGATT,L_PLUSCGATT);
  	  		if(cRet == 0)
 	  		{
	    		FrameFlag.Bit.EchoModule = 0;
	    		Flags.Bit.RecvEcho = 0;
  	    		break ;
  	  		}//END if(FrameFlag.Bit.EchoModule == 1)
  			ONOFF = 0 ;			//power down
  			for(count = 20;count>0;count--) 	//延时1秒
  			{
	  			delay50ms ();
  			}
  			ONOFF = 1 ;			//power on
  			for(count = 200;count>0;count--) 	//延时10秒
  			{
	  			delay50ms ();
  			}
 		}
*/
//  }//END while(1)
  		
  LoadCMD_CIPSPRT();	//设at+cipsprt=0 之后,发完cipsend后,不需大于号和空格
  while(1)
  {
  	SendToModule (CIPSPRT_SIZE);
	delay50ms ();				//如果只延时20ms,就只能收到回送15个字节
  	if(FrameFlag.Bit.EchoModule == 1)
  	{
  	  if(RecvFromMS[2]==_O && RecvFromMS[3]==_K)
  	  {
	    	FrameFlag.Bit.EchoModule = 0;
	    	Flags.Bit.RecvEcho = 0;
  	    	break ;
  	  }//END if(FrameFlag.Bit.EchoModule == 1)
  	}
  }//END while(1)

  LoadCMD_CIPHEAD();	//设at+ciphead=1,远端发来的数据自动加上报头 +IPDn
  while(1)
  {
 	ByteRecvUART2 = 0;
  	SendToModule (CIPHEAD_SIZE);
	delay50ms ();				//如果只延时20ms,就只能收到回送15个字节
  	if(FrameFlag.Bit.EchoModule == 1)
  	{
  	  if(RecvFromMS[2]==_O && RecvFromMS[3]==_K)
  	  {
	    	ClearCommREG();
  	    break ;
  	  }//END if(FrameFlag.Bit.EchoModule == 1)
  	}
  }//END while(1)

//亮正确的灯。。。

//如果IP 地址已置,则直接建立TCP链接
///////////////////////////////////////////////////////////
//  Nop();
//  if(IPAddressSeted == 0x33CC)
//  	ReLink();

///////////////////////////////////////////////////////////
}//END Module_Init()

void ClearCommREG(void)
{
  ByteReceived = 0;
  ByteRecvUART2 = 0;
  FrameFlag.FrameBYTE = 0;
  WaitReturn = 0;
  ReceivedReturn = 0;
  IPDHead = 0;
  Length = 0;
  Flags.fCOMM = 0;

  RCSTA2bits.FERR = 0;
  RCSTA2bits.OERR = 0;
}

void SendCMDtoMeter(unsigned char num)
{
	EN485 = EnTransport;
	delay20ms();
	PIE1bits.TMR1IE = 0;			//关闭定时中断
	TXSTA1bits.TXEN = 1;			//*发送允许
	RCSTA1bits.CREN = 0;			//禁止接收
	PIR1bits.TX1IF = 0;
	
   	for(k = 0;k < num;k++)
   	{	
		GenParity(BUF_METER[k]);
		if(parity == 1)
	  	  TXSTA1bits.TX9D = 1;
		else
	  	  TXSTA1bits.TX9D = 0;

		TXREG1 = BUF_METER[k];	
   		while(1)
   		{
		  if(PIR1bits.TX1IF == 1) break;
		}
		delay10ms();//字节间延时至少10ms!!!
	}	
	while(1)
	{
		if(TXSTA1bits.TRMT == 1) break;	//最后一个字节也发完
	}
//	delay10ms();	//江苏表回送很快,不能加延时
//	delay4ms();

	EN485 = EnReceive;
	TXSTA1bits.TXEN = 0;				//发送禁止
	RCSTA1bits.CREN = 1;				//接收数据允许
	RCSTA1bits.FERR = 0;
	PIE1bits.TMR1IE = 1;				//打开定时中断
}

void GenParity(unsigned char DataWillSend)
{
  unsigned char gp,tt;
  	gp = DataWillSend;
	parity = 0;

	tt = gp & 0x01;
	if(tt != 0)
	  parity ^=0x01;
	tt = gp & 0x02;
	if(tt != 0)
	  parity ^=0x01;
	tt = gp & 0x04;
	if(tt != 0)
	  parity ^=0x01;
	tt = gp & 0x08;
	if(tt != 0)
	  parity ^=0x01;
	tt = gp & 0x10;
	if(tt != 0)
	  parity ^=0x01;
	tt = gp & 0x20;
	if(tt != 0)
	  parity ^=0x01;
	tt = gp & 0x40;
	if(tt != 0)
	  parity ^=0x01;
	tt = gp & 0x80;
	if(tt != 0)
	  parity ^=0x01;
}

void CHECKSUM(void)
{
	unsigned int CXOR = 0;
	for(k=0;k<10+BUF_METER[12];k++)
	{
		CXOR = CXOR + BUF_METER[3+k];
	}
	BUF_METER[3+10+BUF_METER[12]] = (unsigned char)CXOR;
	BUF_METER[3+10+BUF_METER[12]+1] = 0x16;
}

void PowerDownModule(void)
{
/*	
	LoadCMD_CFUN01();		//关闭模块的大部分功能,立即执行
	ByteRecvUART2 = 0;
	SendToModule (CFUN_SIZE);
	delay200ms();
*/  
  	ONOFF = 0 ;			//power down
	delay200ms();

  	RSTModule = 0 ;			//复位信号低电平有效,低电平脉冲宽度应不小于100mS
	delay200ms();

	RSTModule = 1;
	delay200ms();
	for(k = 60;k > 0;k--) 	//延时3秒
  	{
		delay50ms ();
  	}

	ClearCommREG();
}

void PowerOnModule(void)
{
  	ONOFF = 1 ;			//power on
	delay200ms();
	for(k = 60;k > 0;k--) 	//延时3秒
  	{
		delay50ms ();
  	}

	ClearCommREG();
}

void ResetModule(void)
{
/* 怎么将 modem 复位?
软件:通过使用指令 AT+CFUN=0,然后,再输入 AT+CFUN=1
硬件:将 reset 脚接地,至少300 毫秒。平时不用的时候,将它空置。
*/	
	RSTModule = 0;			//复位信号低电平有效,低电平脉冲宽度应不小于100mS
	delay200ms ();
	delay200ms ();
	RSTModule = 1;
}

void W_eeprom(char *pData,unsigned int addr,unsigned char DataLen)
{
  EEADRH = hibyte(addr);
  EEADR = lobyte(addr);
  EECON1bits.EEPGD=0;
  EECON1bits.CFGS=0;
  EECON1bits.WREN=1;
  INTCONbits.GIE = 0; 
	
  for (k = 0; k < DataLen; k++)
  {
	EEDATA=pData[k];
	EECON2=0x55;
	EECON2=0xAA;
	EECON1bits.WR=1;
	while (!PIR2bits.EEIF)
	;
	PIR2bits.EEIF=0;
	EEADR++;
  }
  EECON1bits.WREN = 0;
  INTCONbits.GIE = 1; 
}

void R_eeprom(char *pData,unsigned int addr,unsigned char DataLen)
{
  EEADRH = hibyte(addr);
  EEADR = lobyte(addr);
  EECON1bits.EEPGD=0;	// Point to DATA memory
  EECON1bits.CFGS=0;
  INTCONbits.GIE = 0; 
  for (k = 0; k < DataLen; k++)
  {
  	EECON1bits.RD=1;
	temp1 = EEDATA;
	pData[k] = temp1;
	EEADR++;
  }
  INTCONbits.GIE = 1; 
}
void ReLink(void)
{
//   	while(1)	//若server的TCP服务未启动,则while循环导致死机
//    {
  		ResetModule();
  		for(k = 10;k>0;k--) 	//延时2秒
  		{
	  		delay200ms ();
  		}
		ClearCommREG();

////重新初始化,因Reset 之后,CGATT、CIPHEAD等设置可能被改变
	 	Module_Init();
////    	
    	ReadDynamicIP();
    	LoadCipstartBuf();    
		WaitReturn = 3;
		SendToModule (LengthCipstart);	//发出 at+cipstart命令

  		for(k = 240;k>0;k--) 	//延时12秒
  		{
	  		if(FrameFlag.Bit.EchoModule == 1)
	  			break;
	  		delay50ms ();
  		}

  		if(FrameFlag.Bit.EchoModule == 1)	//等待建立TCP链接
  		{
  			cRet = strncmppgm2ram(RecvFromMS,OK_CONNECT_OK,L_OK_CONNECT_OK);
			Nop();
  			if(cRet == 0)
			{
				ClearCommREG();
				ModuleSta.Bit.TCPLink = 1;
//				break;
			}
		}
		delay50ms();
	
//    }//END of while(1)
	WaitReturn = 0;
}
void Proc_err(void)
{
/* 连接未建立或已被断开, 返回 ERROR
如果数据发送成功, 返回 SEND OK
如果数据发送失败, 返回 SEND FAIL
*/	
  if(strncmppgm2ram(RecvFromMS,ERROR,L_ERROR) == 0)
  {//server软件未启动TCP服务
	ReLink();
  }//END of if(strncmppgm2ram(RecvFromMS,ERROR,L_ERROR) == 0)
  else if(strncmppgm2ram(RecvFromMS,CLOSED,L_CLOSED) == 0)
  {//主站server主动断开链接/server软件异常退出
  	ReLink();
  }
  else if(strncmppgm2ram(RecvFromMS,SEND_FAIL,L_SEND_FAIL) == 0)
  {//发送失败,可能尚未建立连接
	ResetModule();
  	for(k = 70;k>0;k--) 	//延时14秒
  	{
	  	delay200ms ();
  	}
	ClearCommREG();
////重新初始化,因Reset 之后,CGATT、CIPHEAD等设置可能被改变
	Module_Init();
////    	
  }
  else if(strncmppgm2ram(RecvFromMS,PLUSSCKS0,L_PLUSSCKS0) == 0)
  {//+SCKS:0错,没放sim卡?
	ResetModule();
  	for(k = 70;k>0;k--) 	//延时14秒
  	{
  		if(FrameFlag.Bit.EchoModule == 1)
  			break;
	  	delay200ms ();
  	}
	ClearCommREG();
	Module_Init();

   	ReadDynamicIP();
   	LoadCipstartBuf();    
	WaitReturn = 3;
	SendToModule (LengthCipstart);	//发出 at+cipstart命令
	for(k = 240;k>0;k--) 	//延时12秒
	{
  		if(FrameFlag.Bit.EchoModule == 1)
  			break;
  		delay50ms ();
	}
  }
}

void Proc_TimerOver(void)
{
	near unsigned int tOT1;
	TimeFlag.Bit.TimerOver = 0;

	cMinute++;
  	temp2 = lobyte(cMinute);
  	if(hibyte(cMinute) == hibyte(t1use))	//整数只比较高字节!,BUG!
  	{
	  if(temp2 > lobyte(t1use))
	  {
		cMinute = 0; 
		Proc_min();
	  }
  	}

  	if(ByteReceived >0)
  	{
  		OverTimeMeter++;
	    tOT1 = FiveSeconds;		//等待FiveSeconds秒
	   	if(OverTimeMeter >= tOT1) 		
	   	{
			ClearCommREG();
			OverTimeMeter = 0;
	   	   	TempFlag.Bit.RecvMeter = 0;
	   	}
  	}
  	if(ByteRecvUART2 >0)
  	{
  		OverTimeGPRS++;
	    tOT1 = FiveSeconds;		//等待FiveSeconds秒
	   	if(OverTimeGPRS >= tOT1) 		
	   	{
			ClearCommREG();
			OverTimeGPRS = 0;
	   	}
  	}
	
}

void Proc_min(void)
{
//读出时间日期 --------------------------------
////  LoadCMD_CCLK();
//  ByteRecvUART2 = 0;
//  SendToModule (CCLK_SIZE);
//---------------------------------------------

  	MinCounter++;
  
  	if(ModuleSta.Bit.LinkClosed == 1)
  	{
    	ReadDynamicIP();
		LoadCipstartBuf();
		WaitReturn = 3;					//CIPSTART需要等待3个回车
    	SendToModule (LengthCipstart);	
		for(k=240;k>0;k--) 				//延时12秒
  		{
			if(FrameFlag.Bit.EchoModule == 1) break;
			delay50ms ();
  		}

  		if(FrameFlag.Bit.EchoModule == 1)	//等待建立TCP链接
		{
  			cRet = strncmppgm2ram(RecvFromMS,OK_CONNECT_OK,L_OK_CONNECT_OK);
  			if(cRet == 0)
			{
				ClearCommREG();
  				ModuleSta.Bit.LinkClosed = 0;	
				ModuleSta.Bit.TCPLink = 1;
			}

		}//END if
	}
  
  if(MinCounter >= HeartBeatT)
  {
	MinCounter = 0;

	if(ModuleSta.Bit.TCPLink == 1)
	{
  	  	LoadCMD_CIPSEND();
	  	TranToMS[CIPSEND_SIZE] = _EQUAL;
  	  	TranToMS[CIPSEND_SIZE+1] = _1;
  	  	TranToMS[CIPSEND_SIZE+2] = _CR;	
 	 	SendToModule(CIPSEND_SIZE+3);
	  	delay10ms();			//避免双方冲突
	  	delay10ms();

	  	TranToMS[0] = _0;		////_B;
  	  	SendToModule (1);	//发送心跳包,就一个字节
  	  
  	  	while(FrameFlag.Bit.EchoModule == 0)	//等待返回SEND OK
	  	{
	    	Nop();
	  
	    	if(RevWaitDelay>FiveSeconds) 	//等待20*0.25s=5秒
	    	{
				RevWaitDelay = 0;
  	  			break;
	    	}//END if(RevWaitDelay>FiveSeconds)

	  	}//END while(FrameFlag.Bit.EchoModule == 0)
	  	Nop();

  	  	cRet = strncmppgm2ram(RecvFromMS,SEND_OK,L_SEND_OK);
  	  	if(cRet == 0)
	  	{
  			for (k = 0; k < 32; k++)
	  		{
	  			RecvFromMS[k] = 0;
				return;
			}
	  	}
  	  	else
  	  	{
			ModuleSta.Bit.TCPLink = 0;
	    	Proc_err();
  	  	}
	}//END of if(ModuleSta.Bit.TCPLink == 1)
	else if(IPAddressSeted == 0x33CC)
	{
  		ReLink();
	}
  }//END of if(MinCounter>=20)
}

void ReadDynamicIP(void)
{
//test eeprom read
  EEADRH = 0;
  EEADR = IPAddress;
  EECON1bits.EEPGD = 0;	// Point to DATA memory

⌨️ 快捷键说明

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