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

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

📁 PIC18F6520+SIM300做的透明传输的DTU
💻 C
📖 第 1 页 / 共 5 页
字号:
  		}
  		if(strncmppgm2ram(RecvFromMS,CONNECT_OK,L_CONNECT_OK) == 0)
		{
    		LoadCMD_CIPCLOSE();
	  		WaitReturn = 0;
  	  		SendToModule (CIPCLOSE_SIZE);
  	  		for(ii=60;ii>0;ii--) 	//延时3秒
  	  		{
  	  			if(FrameFlag.Bit.EchoModule == 1)
  	  				break;
	    		delay50ms ();
  	  		}
			ClearCommREG();
		} //END of if(strncmppgm2ram(RecvFromMS,CONNECT_OK,L_CONNECT_OK)
  		else if(strncmppgm2ram(RecvFromMS,IP_CLOSE,L_IP_CLOSE) == 0)
		{
    	  	Nop();
		} //END of else if
  		else if(strncmppgm2ram(RecvFromMS,IP_INITIAL,L_IP_INITIAL) == 0)
		{
    		Nop();
		} //END of else if
  		else if(strncmppgm2ram(RecvFromMS,IP_STATUS,L_IP_STATUS) == 0)
		{
    	  	Nop();
		} //END of else if
		else
		{
	  		WaitReturn = 0;
  	  		LoadCMD_CIPSHUT();
  	  		SendToModule (CIPSHUT_SIZE);
  	  		for(ii=60;ii>0;ii--) 	//延时3秒
  	  		{
  	  			if(FrameFlag.Bit.EchoModule == 1)
  	  				break;
	    		delay50ms ();
  	  		}
			ClearCommREG();
		}

//发出 at+cipstart命令
		LoadCipstartBuf();
		WaitReturn = 3;
    	SendToModule (LengthCipstart);	
		for(ii = 120;ii > 0;ii--) 	//延时6秒
		{
	  		if(FrameFlag.Bit.EchoModule == 1) 
	  			break;
	  		delay50ms ();
		}
//CIPSTART需要等待3个回车
		RevWaitDelay = 0;
  		while(FrameFlag.Bit.EchoModule == 0)	//等待建立TCP链接
		{
	  		Nop();
	  
	  		RWDTemp = FourtySeconds;
	  		if(RevWaitDelay > RWDTemp) 	//等待40秒
	  		{
				RevWaitDelay = 0;
  				SendToModule (LengthCipstart);
	   		}//END if(RevWaitDelay>FourtySeconds)
		}//END while(FrameFlag.Bit.EchoModule == 0)
  		Nop();
  		if(strncmppgm2ram(RecvFromMS,OK_CONNECT_OK,L_OK_CONNECT_OK) == 0)
		{
			ClearCommREG();
			ModuleSta.Bit.TCPLink = 1;
		}
		else //if(strncmppgm2ram(RecvFromMS,CONNECTING,L_CONNECTING) == 0)
		{
			Proc_err();
		}
	}//END of else if(TP_UDL > 10)
//	ErrorMSG();	
	WaitReturn = 0;		//必须加!否则,module主动上报帧会一直等第二个回车
}//END Proc_SMS

void ErrorMSG(void)
{
	LoadCMD_CMGD();
	WaitReturn = 0;
 	SendToModule (CMGR_CMGD_SIZE);
 	delay200ms ();
 	delay200ms ();
}
//**********************************************************
void LoadCipstartBuf(void)
{
	for(k=0;k<18;k++)	
	{
	  TranToMS[k] = Ip_start_buf1[k];
	}
	TranToMS[18] =_YINH;
//	for(k=0;k<TP_UDL;k++)	
	for(k=0;k<LengthIP;k++)	
	{
	  TranToMS[k+19] = Ip_start_buf2[k];
	}
//	TranToMS[TP_UDL+19] =_YINH;
//	TranToMS[TP_UDL+20] =_DOUH;
	TranToMS[LengthIP+19] =_YINH;
	TranToMS[LengthIP+20] =_DOUH;
	for(k=0;k<7;k++)	
	{
//	  TranToMS[k+TP_UDL+21] = Ip_start_buf3[k];
	  TranToMS[k+LengthIP+21] = Ip_start_buf3[k];
	}
		//TranToMS数组数据准备好
	ByteRecvUART2 = 0;
	TempFlag.Bit.RecvMeter = 0;		//!!
	LengthCipstart = 18+(LengthIP+3)+7;
}

//**********************************************************
void InitPeriph(void)
{
	EN485 = EnReceive;
	EN485_CTRL = OUTPUT;

	TRIS_TXD2 = OUTPUT;
	TRIS_RXD2 = INPUT;

	ONOFF = HIGH;
	ONOFF_CTRL = OUTPUT;

	RSTModule = HIGH;
	RSTModule_CTRL = OUTPUT;
}
void UART1_setup(void)
{
	/* relates crystal freq to baud rate - see PIC18Fxxx data sheet

	BRGH=1, Fosc=3.6864MHz		BRGH=1, Fosc=4MHz      BRGH=1, Fosc=8MHz    BRGH=1, Fosc=16MHz
	----------------------	  -----------------      -----------------    ------------------
	Baud		SPBRG             Baud		SPBRG          Baud		SPBRG         Baud		SPBRG
	1200		191               1200		207.3          1200		415.7         9600    103
	2400		95                2400		103.2          2400		207.3         19200		51
	4800		47                4800		51.1           4800		103.2         38400   25
	9600		23                9600		25.0           9600		51.1          57600   16
	19200		11                19200		12.0           19200	25.0          115200  8
	38400		5                 38400		5.5            38400	12.0
	57600		3                 57600		3.3            57600	7.7
	115200	        1              	  115200	1.2            115200	3.3

	*/
//#define BRGH_VALUE 1:		1200 +0.16 207	这个误差小,准确
//#define BRGH_VALUE 0:		1200 +1.67 51
	#define BAUD1 1200
//	#define BAUD1 9600
//	#define BAUD 38400
	#define SPBRG1_VALUE ((PIC_CLK/(16UL * BAUD1) -1))
	#define BRGH_VALUE 1
//如果 BRGH_VALUE=0 则SPBRG_VALUE= ((PIC_CLK/(64UL * BAUD1) -1))


	TXSTA1bits.TRMT=0;
	TXSTA1bits.BRGH=BRGH_VALUE;	
	TXSTA1bits.SYNC=0;				//asynchronous
	TXSTA1bits.TXEN=0;				//enable the transmitter
	TXSTA1bits.TX9=1;				//发送9位
//	TXSTA1bits.TX9=0;				//发送8位
//	TXSTA1bits.CSRC=1;				//异步方式don't care

	SPBRG1 = SPBRG1_VALUE;

	RCSTA1bits.OERR=0;				//enable serial port pins
	RCSTA1bits.FERR=0;				//enable serial port pins
	RCSTA1bits.ADDEN=0;				//enable serial port pins
	RCSTA1bits.CREN=1;				//enable reception
//	RCSTA1bits.SREN=0;				//异步方式don't care
	RCSTA1bits.RX9=1;				//接收9位
//	RCSTA1bits.RX9=0;				//接收8位
	RCSTA1bits.SPEN=1;				//Serial Port Enable bit
	
}

void UART2_setup(void)
{
	/* relates crystal freq to baud rate - see PIC18Fxxx data sheet

	BRGH=1, Fosc=3.6864MHz		BRGH=1, Fosc=4MHz      BRGH=1, Fosc=8MHz    BRGH=1, Fosc=16MHz
	----------------------	  -----------------      -----------------    ------------------
	Baud		SPBRG             Baud		SPBRG          Baud		SPBRG         Baud		SPBRG
	1200		191               1200		207.3          1200		415.7         9600    103
	2400		95                2400		103.2          2400		207.3         19200		51
	4800		47                4800		51.1           4800		103.2         38400   25
	9600		23                9600		25.0           9600		51.1          57600   16
	19200		11                19200		12.0           19200	25.0          115200  8
	38400		5                 38400		5.5            38400	12.0
	57600		3                 57600		3.3            57600	7.7
	115200	        1              	  115200	1.2            115200	3.3

	*/

//	#define BAUD1 1200
	#define BAUD2 9600
	#define BRGH_VALUE2 1
	#define SPBRG2_VALUE ((PIC_CLK/(16UL * BAUD2) -1))

	TXSTA2bits.TX9D=0;	//无奇偶校验位
	TXSTA2bits.TRMT=0;	//Transmit Shift Register Status bit
	TXSTA2bits.BRGH=BRGH_VALUE2;	
	TXSTA2bits.SYNC=0;						
	TXSTA2bits.TXEN=0;						
	TXSTA2bits.TX9=0;	//发送8位
//	TXSTA2bits.CSRC=1;						

	SPBRG2 = SPBRG2_VALUE;

	RCSTA2bits.RX9D=0;	//无奇偶校验位				
	RCSTA2bits.OERR=0;						
	RCSTA2bits.FERR=0;						
	RCSTA2bits.ADDEN=0;						
	RCSTA2bits.CREN=1;	//Continuous Receive Enable bit		
//	RCSTA2bits.SREN=0;						
	RCSTA2bits.RX9=0;	//接收8位
	RCSTA2bits.SPEN=1;	//Serial Port Enable bit		
}

void LoadCMD_AT(void)
{
	TranToMS[0] = _A;	
	TranToMS[1] = _T;	
	TranToMS[2] = _CR;
}

void LoadCMD_CSCS(void)
{
	for(k=0;k<AT_CSCS_SIZE;k++)	
	{
		TranToMS[k] = AT_CSCS_buf[k];
	}
}

void LoadCMD_CFUN01(void)			//关闭模块的大部分功能,立即执行
{
	for(k=0;k<CFUN_SIZE;k++)	
	{
		TranToMS[k] = CFUN01_buf[k];
	}
}

void LoadCMD_CIPSPRT(void)
{
	for(k=0;k<CIPSPRT_SIZE;k++)	
	{
		TranToMS[k] = Ip_CIPSPRT_buf[k];
	}
}

void LoadCMD_CGATT(void)
{
	for(k=0;k<CGATT_SIZE;k++)	
	{
		TranToMS[k] = Ip_CGATT_buf[k];
	}
}

void LoadCMD_CIPHEAD(void)
{
	for(k=0;k<CIPHEAD_SIZE;k++)	
	{
		TranToMS[k] = Ip_CIPHEAD_buf[k];
	}
}

void LoadCMD_CIPSTATUS(void)
{
	for(k=0;k<CIPSTATUS_SIZE;k++)	
	{
		TranToMS[k] = AT_CIPSTATUS[k];
	}
}

void LoadCMD_ATE0(void)
{
	for(k=0;k<ATE0_SIZE;k++)	
	{
		TranToMS[k] = CMD_ATE0[k];
	}
}

void LoadCMD_CCLK(void)
{
// 读短信,取IP地址

	for(k=0;k<CCLK_SIZE;k++)	
	{
		TranToMS[k] = Ip_CCLK_buf[k];
	}
}

void LoadCMD_CMGR(void)
{
	TranToMS[0] = _A;
	TranToMS[1] = _T;
	TranToMS[2] = _PLUS;
	TranToMS[3] = _C;
	TranToMS[4] = _M;
	TranToMS[5] = _G;
	TranToMS[6] = _R;
	TranToMS[7] = _EQUAL;
	TranToMS[8] = Index0;
	TranToMS[9] = Index1;
	if(Index1 == _D)
	{
//		SMS_Start = 0x09;		//如果短信的序号是1位数,则CMGR读出的短信头从020FH开始
		CMGR_CMGD_SIZE = 10;	
	}
	else
	{
		TranToMS[10] = _CR;		
		CMGR_CMGD_SIZE = 11;
	}
}

void LoadCMD_CMGD(void)
{
	TranToMS[0] = _A;
	TranToMS[1] = _T;
	TranToMS[2] = _PLUS;
	TranToMS[3] = _C;
	TranToMS[4] = _M;
	TranToMS[5] = _G;
	TranToMS[6] = _D;
	TranToMS[7] = _EQUAL;
	TranToMS[8] = Index0;
	TranToMS[9] = Index1;
	if(Index1 == _D)
	{
		CMGR_CMGD_SIZE = 10;
	}
	else
	{
		TranToMS[10] = _CR;
		CMGR_CMGD_SIZE = 11;
	}
}

void LoadCMD_CIPSEND(void)
{
/* AT+CIPSTART只有在IP_INITIAL、IP_CLOSE、IP_STATUS状态下
才可以进行连接的建立,连接建立成功后的状态为CONNECT OK;
连接失败,则处在失败的状态上。
*/
	for(k=0;k<CIPSEND_SIZE;k++)	
	{
		TranToMS[k] = Ip_send_buf[k];
	}
}

void LoadCMD_CMGS(void)
{
/* AT+CIPSTART只有在IP_INITIAL、IP_CLOSE、IP_STATUS状态下
才可以进行连接的建立,连接建立成功后的状态为CONNECT OK;
连接失败,则处在失败的状态上。
*/
	for(k=0;k<AT_CMGS_SIZE;k++)	
	{
		TranToMS[k] = AT_CMGS_buf[k];
	}
}

//给数组装载命令
void LoadCMD_DATA(void)
{
	for(k=0;k<CIPDATA_SIZE;k++)	
	{
		TranToMS[k] = TestData[k];
	}
}

void LoadCMD_CIPCLOSE(void)
{
	for(k=0;k<CIPCLOSE_SIZE;k++)	
	{
		TranToMS[k] = Ip_close_buf[k];
	}
}

void LoadCMD_CIPSHUT(void)
{
	for(k=0;k<CIPSHUT_SIZE;k++)	
	{
		TranToMS[k] = Ip_shut_buf[k];
	}
}

void ConfigInt(void)
{
	RCONbits.IPEN = 0;
	PIE1bits.RC1IE=1;	// USART1 receive interrupt enable
	PIE3bits.RC2IE=1;	// USART2 receive interrupt enable
	PIE1bits.TMR1IE=1;
	INTCONbits.PEIE=1;	//Peripheral interrupt enable
	
	INTCONbits.GIE=1;
}

void Timer1_setup(void)
{
	TMR1H = hibyte(T1DELAY);
	TMR1L = lobyte(T1DELAY);	
	T1CONbits.T1CKPS0 = 1;
	T1CONbits.T1CKPS1 = 1;		//八分频
	T1CONbits.T1OSCEN = 0;		//不使用内部振荡
	T1CONbits.TMR1CS = 0;		//fOSC/4=TCYC
	T1CONbits.TMR1ON = 1;		//启动TMR1
}
void SendToModule(unsigned int num)
{
  unsigned int cSendData;

	RCSTA2bits.CREN = 0;				//连续接收数据禁止

	ByteRecvUART2 = 0;
	FrameFlag.Bit.EchoModule = 0;
	Flags.Bit.RecvUART2 = 0;
	Flags.Bit.RecvEcho = 0;
	Flags.Bit.RecvGPRS = 0;
	RevWaitDelay = 0;
	ReceivedReturn = 0;
  
	TXSTA2bits.TXEN = 1;				//发送允许
   	for(cSendData=0;cSendData<num;cSendData++)
   	{	
		TXREG2 = TranToMS[cSendData];	
   		while(1)
   		{
		  if(PIR3bits.TX2IF == 1) break;
		}
		delay4ms();
	}//END of for(cSendData=0;cSendData<num;cSendData++)

	RCSTA2bits.CREN = 1;		//连续接收数据允许
	delay4ms();
}

void Module_Init(void)
{
  unsigned char count;
  
  FrameFlag.FrameBYTE = 0 ;
/* 在实际应用中,RESET 和ON/~OFF 可由MCU 控制,MCU 通过对ON/~OFF 和RESET 的控制
可以实现模块的关机,具体程序为:MCU 先发命令(AT+CFUN=0,1),模块开始注销网络登
记,然后使ON/~OFF 信号为反向有效(0FF 有效)200ms,再使RESET 有效(低电平维持100ms 以
上),这样就可以关掉模块。模块关机后的电流为50uA。
*/

  TempFlag.Bit.f1 = 0;
  while(TempFlag.Bit.f1 == 0)
  {
  	Nop();
	LoadCMD_AT();
  	SendToModule (3);
  	for(count = 40;count>0;count--) 	//延时2秒
  	{
	  	delay50ms ();
  	}

  	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)

  	if(TempFlag.Bit.f1 == 1) break;

	Nop();
  	ResetModule();
	Nop();

  	for(count = 70;count>0;count--) 	//延时14秒
  	{
	  	delay200ms ();
  	}
	ClearCommREG();
	Nop();
  }//END while(1)
  
//在这先发ATE0命令,设置为命令无ECHO
  LoadCMD_ATE0();
  TempFlag.Bit.f1 = 0;
  while(TempFlag.Bit.f1 == 0)
  {
  		SendToModule (ATE0_SIZE);
		delay200ms ();				//如果只延时20ms,就只能收到回送15个字节
  		if(FrameFlag.Bit.EchoModule == 1)
  		{
  	  		if(RecvFromMS[2]==_O && RecvFromMS[3]==_K)
  	  		{
	    		ModuleSta.Bit.Error = 0;
	    		Flags.Bit.RecvEcho = 0;
  				TempFlag.Bit.f1 = 1;
  	  		}//END if(FrameFlag.Bit.EchoModule == 1)
  		}
  }//END while(TempFlag.Bit.f1 == 0)


//默认是CMGF=0 PDU模式,再初始化成UCS2编码
  	Nop();

⌨️ 快捷键说明

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