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

📄 main.c

📁 PIC18F6520+SIM300做的透明传输的DTU
💻 C
📖 第 1 页 / 共 5 页
字号:
		else if(SMS_CMD == 'S' || SMS_CMD == 's')	//S:上月电量
		{
			BUF_METER[3] = 0x02;					//上月电量数据位
			OtherFlags.Bit.WS_NowLastE = 1;
		}
		else
			return;
		BUF_METER[4] = 0x00;
		BUF_METER[5] = 0x00;
		BUF_METER[6] = BUF_METER[0]^BUF_METER[1]^BUF_METER[2]^BUF_METER[3]^BUF_METER[4]^BUF_METER[5];
		for(k=0;k<6;k++)
		{
			cSum = cSum + BUF_METER[k];
		}
			BUF_METER[7] = (unsigned char)cSum;
			BUF_METER[8] = _CR;
			SendCMDtoMeter(9);
			for(ii = 80;ii > 0;ii--) 	//延时4秒
			{
				if(MeterComm.Bit.aFrame == 0x01)
					break;
  				delay50ms ();
			}
			if(MeterComm.Bit.aFrame == 0x00)
				return;
			WS_Energy();		//用短信上报威胜表电量:有功总,峰,平,谷,无功总,反向无功
			MeterComm.Bit.aFrame = 0x00;

	}//END of else if(TP_UDL == 3)
	else if(TP_UDL >= 0x0D)
	{
		for(k=0;k<DNE_SIZE;k++)
		{
			SMS_Return[k] = RecvFromMS[DataAddr + k];	//对方号码
		}
		if(strncmppgm2ram((char *)SMS_Return,(const far rom char *)DOMAINNAMEEQUAL,DNE_SIZE) == 0)		
		{
			TP_UDL -=3;						//总长度中减去 域名= 这三个字符
//
			for(k=0;k<TP_UDL;k++)
			{
	  			temp1 = RecvFromMS[(DataAddr+12)+k*4+2];
	  			temp2 = RecvFromMS[(DataAddr+12)+k*4+3];
	  			if(temp1 == '2' && temp2 == 'E')
		  		{
					temp3 = '.' ;
				}
	  			else if(isalnum(temp1) && isalnum(temp2))
	  			{
					ASC2B();	//将temp2转化
  					Text2 = temp2;
  					temp2 = temp1;
  					ASC2B();	//将temp1转化
  					Text1 = temp2;
  					Text3 = Text1 <<4;
  					temp3 = Text3 + Text2;
  				}
  				else
  					return;
	  			Ip_start_buf2[k] = temp3;
			}//END for
			Ip_start_buf2[k] = 0x0D;		//写入EEPROM前置结束符
			W_eeprom((char *)Ip_start_buf2,DomainNameAddr,(TP_UDL+1));
			OK_Data();
			SendSMS();						//发送短信 OK
			OtherFlags.Bit.TCPLink = 0;
			Close_Shut();
//
			Link_Mode[0] = _D;
			Link_Mode[1] = _N;
			LoadCMD_CIPLINK();
			WaitReturn = 0;
			SendToModule (AT_CDNSORIP_SIZE);
			DelaySeconds(3);
   			ModulFlags.Bit.EchoModule = 0;
			W_eeprom((char *)Link_Mode,LinkMode,2);
		}
		else if(strncmppgm2ram((char *)SMS_Return,(const far rom char *)IPAddressEqual,IP_SIZE) == 0)		
		{
			TP_UDL -=3;					//总长度中减去 地址= 这三个字符
			Text1 = 0;					//IP地址长度初始化为0
//
			for(k=0;k<TP_UDL;k++)
			{
	  			temp1 = RecvFromMS[(DataAddr+12)+k*4+2];
	  			temp2 = RecvFromMS[(DataAddr+12)+k*4+3];
	  			if(temp1 == '2' && temp2 == 'E')
		  		{
					temp3 = '.' ;
				}
	  			else if(isdigit(temp1) && isdigit(temp2))
	  			{
					temp1 -=0x30;						
					temp2 -=0x30;						
					Text3 = temp1 <<4;
					temp3 = Text3 + temp2;
  				}
  				else
  					return;
	  			Ip_start_buf2[k] = temp3;
				Text1 += 1;
			}//END for
			Ip_start_buf2[k] = 0x0D;		//写入EEPROM前置结束符
			W_eeprom((char *)Ip_start_buf2,IPAddress,(Text1+1));
			OK_Data();
			SendSMS();						//发送短信 OK
			OtherFlags.Bit.TCPLink = 0;
			Close_Shut();
//
			Link_Mode[0] = _I;
			Link_Mode[1] = _P;
			LoadCMD_CIPLINK();
			WaitReturn = 0;
			SendToModule (AT_CDNSORIP_SIZE);
			DelaySeconds(3);
   			ModulFlags.Bit.EchoModule = 0;
			W_eeprom((char *)Link_Mode,LinkMode,2);
		}
		else if(strncmppgm2ram((char *)SMS_Return,(const far rom char *)DateTimeEQUAL,DTE_SIZE) == 0)		
		{
			TP_UDL -=3;		//总长度中减去 时间= 这三个字符
//
      		SetDateTime();
			k = 0x09;		//destination
			for(j=0;j<TP_UDL;j++)	//12个数字
			{
	  			temp1 = RecvFromMS[(DataAddr+12)+j*4+2];
	  			temp2 = RecvFromMS[(DataAddr+12)+j*4+3];
				Text1 = temp1 - 0x30;
				Text2 = temp2 - 0x30;
				Text3 = Text1 << 4;
				TranToMS[k] = Text3 + Text2;
				k++;
				j++;
	  			temp1 = RecvFromMS[(DataAddr+12)+j*4+2];
	  			temp2 = RecvFromMS[(DataAddr+12)+j*4+3];
				Text1 = temp1 - 0x30;
				Text2 = temp2 - 0x30;
				Text3 = Text1 << 4;
				TranToMS[k] = Text3 + Text2;
				k +=2;
				j++;
			}//END for
  			SendToModule (SetCCLK_SIZE);
			DelaySeconds(2);

  			if(ModulFlags.Bit.EchoModule == 1)
  			{
  	  			cRet = strncmppgm2ram((char *)RecvFromMS,(const far rom char *)OK,L_OK);
  	  			if(cRet == 0)
  	  			{
					OK_Data();
					SendSMS();						//发送短信 OK
					ReadTime();
				}
  			}
			ModulFlags.Bit.EchoModule = 0 ;
  			ByteRecvUART2 = 0;
		}
		else
			return;
	}
	WaitReturn = 0;		//必须加!否则,module主动上报帧会一直等第二个回车
}//END Proc_SMS

void ErrorMSG(void)
{
	LoadCMD_CMGD();
	WaitReturn = 0;
 	SendToModule (CMGR_CMGD_SIZE);
	DelaySeconds(4);
}
//**********************************************************
void LoadCipstartBuf(void)
{
	for(k=0;k<L_start_buf1;k++)	
	{
	  TranToMS[k] = Ip_start_buf1[k];
	}
	for(k=0;k<LengthIPDNS;k++)	
	{
	  TranToMS[k+L_start_buf1] = Ip_start_buf2[k];
	}
	for(k=0;k<L_start_buf3;k++)	
	{
	  TranToMS[k+LengthIPDNS+L_start_buf1] = Ip_start_buf3[k];
	}
//TranToMS数组数据准备好
	LengthCipstart = L_start_buf1 + LengthIPDNS + L_start_buf3;
}

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

	TRIS_TXD2 = OUTPUT;
	TRIS_RXD2 = INPUT;

	ONOFF = HIGH;
	ONOFF_CTRL = OUTPUT;

	RSTModule = HIGH;
	RSTModule_CTRL = OUTPUT;
//
	CMCON = 0x07;	// Turn off comparators
	ADCON1 = 0x0F; 	// Set PORTF as digital I/O
	RedLed_CTRL = OUTPUT;
	GreenLed_CTRL = OUTPUT;
	RedLed = CLOSE;
	GreenLed = CLOSE;
//
}
/*
void LedOn(void)
{
	RedLed = LIGHT;
	GreenLed = LIGHT;
	RedLed_CTRL = OUTPUT;
	GreenLed_CTRL = OUTPUT;
	
	CMCON = 0x07;	// Turn off comparators
	ADCON1 = 0x0F; 	// Set PORTF as digital I/O
  	for(k=20;k>0;k--) 	//延时1秒
  	{
 		delay50ms ();
  	}
}
*/
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  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_CREG(void)
{
	for(k=0;k<CREG_SIZE;k++)	
	{
		TranToMS[k] = Ip_CREG_buf[k];
	}
}

void LoadCMD_CREGAsk(void)
{
	for(k=0;k<CREG_ASK_SIZE;k++)	
	{
		TranToMS[k] = CREG_ASK_buf[k];
	}
}

void LoadCMD_CIPLINK(void)
{
	for(k=0;k<AT_CDNSORIP_SIZE;k++)	
	{
		TranToMS[k] = AT_IPLINK_buf[k];
	}
}

void LoadCMD_CDNSLINK(void)
{
	for(k=0;k<AT_CDNSORIP_SIZE;k++)	
	{
		TranToMS[k] = AT_DNSLINK_buf[k];
	}
}


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

void LoadCMD_CDNSCFG(void)
{
	for(k=0;k<AT_CDNSCFG_SIZE;k++)	
	{
		TranToMS[k] = AT_CDNSCFG_buf[k];
	}
}

void LoadCMD_CIPDPDP(void)
{
	for(k=0;k<L_Cipdpdp;k++)	
	{
		TranToMS[k] = ArrCipdpdp[k];
	}
}

void LoadCMD_CPOWD(void)
{
	for(k=0;k<L_CPOWD;k++)	
	{
		TranToMS[k] = ArrCPOWD[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_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_CMGL(void)
{
	TranToMS[0] = _A;
	TranToMS[1] = _T;
	TranToMS[2] = _PLUS;
	TranToMS[3] = _C;
	TranToMS[4] = _M;
	TranToMS[5] = _G;
	TranToMS[6] = _L;
	TranToMS[7] = _EQUAL;
	TranToMS[8] = _0;
	TranToMS[9] = _CR;
}


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)

⌨️ 快捷键说明

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