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

📄 main.c

📁 PIC18F6520+SIM300做的透明传输的DTU
💻 C
📖 第 1 页 / 共 5 页
字号:
  	}
  	else 	//if(strncmppgm2ram((char *)RecvFromMS,(const far rom char *)PLUSSCKS0,L_PLUSSCKS0) == 0)
  	{	//若出现错误+SCKS:0  原因:强行对模块掉电或使用 at+cpowd 引起。
		//没放sim卡错返回的是:SCLK0
		Close_Shut();
		ReInitial();
  	}
}

void Proc_TimerOver(void)
{
	unsigned int tOT1;
	OtherFlags.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) 		
	   	if(OverTimeMeter >= 100) 	//5秒(一次中断50ms)	
	   	{
			ClearMeterREG();
	   	}
  	}
  	if(ByteRecvUART2 >0)
  	{
  		OverTimeGPRS++;
//	    tOT1 = FiveSeconds;		//等待FiveSeconds秒
//	   	if(OverTimeGPRS >600) 	//30秒(一次中断50ms)
	   	if(OverTimeGPRS >300) 	//15秒(一次中断50ms)
	   	{
			ClearGPRSREG();
	   	}
  	}
}

void Proc_min(void)
{
  	MinCounter++;
  	Minute++;
  	temp1 = Minute & 0x0F;
  	if(temp1 == 0x0A)
  	{
  		Minute += 0x06;		//convert to BCD code
		if(Minute >= 0x60)		//到60分
		{
			Minute = 0;
			R_eeprom((char *)Link_Mode,LinkMode,2);
			ReadTime();
			if(Hour == 0x00)
			{
				OtherFlags.Bit.SysCancel = 0;	//每日00:00清除系统软件主动关闭连接标志
			}
			
//每到一小时,检查一次与GPRS网络的连接
  			LoadCMD_CREGAsk();
			WaitReturn = 2;
			SendToModule (CREG_ASK_SIZE);
			DelaySeconds(8);
  			if(ModulFlags.Bit.EchoModule == 1)
  			{
  				cRet = strncmppgm2ram((char *)RecvFromMS,(const far rom char *)CREGSta_buf,L_CREGSta);
  				if(cRet != 0)
  	  			{
	    			ModulFlags.Bit.EchoModule = 0;
					WaitReturn = 0;
//AT+CREG=1, 注册GPRS网络
  					LoadCMD_CREG();
					SendToModule (CREG_SIZE);
					DelaySeconds(2);
  					if(ModulFlags.Bit.EchoModule == 1)
  					{
  	  					cRet = strncmppgm2ram((char *)RecvFromMS,(const far rom char *)OK,L_OK);
  						if(cRet != 0)
  	  					{
							ResetModule();
							PassSeconds(20);
							ClearGPRSREG();
							Module_Init();
							OtherFlags.Bit.TCPLink = 0x00;
  	  					}//END if(FrameFlag.Bit.EchoModule == 1)
  					}
  	  			}//END if(ModulFlags.Bit.EchoModule == 1)
  			}
		}
  	}
//	Proc_Hour();  
//	if(OtherFlags.Bit.SysCancel == 0x00)//不是主站主动退出,才可以连接
//	{
		temp1 = Minute & 0x0F;
		temp2 = DTU_Number[0] & 0x0F;
		if(OtherFlags.Bit.TCPLink == 0x00 && temp1 == temp2)
		{							////每终端号个位分钟连结server一次
			Close_Shut();
//			PassSeconds(10);
			ConnectDNS();
		}
//	}

	if(OtherFlags.Bit.TCPLink == 1)
	{
		if(MinCounter >= BT)
		{
			for (k = 0; k < 32; k++)	//clear module 应答区
  			{
  				RecvFromMS[k] = 0;
			}
  	  		LoadCMD_CIPSEND();
			WaitReturn = 0;
	  		TranToMS[CIPSEND_SIZE] = _EQUAL;
  	  		TranToMS[CIPSEND_SIZE+1] = _1;
  	  		TranToMS[CIPSEND_SIZE+2] = _CR;	
 	 		SendToModule(CIPSEND_SIZE+3);
	  		delay20ms();					//避免双方冲突
//			PassSeconds(2);

//			if(ModulFlags.Bit.EchoModule == 1)	//若已断开连接会有应答:ERROR
//			{
//				OtherFlags.Bit.TCPLink = 0;
//				Close_Shut();
//				ReInitial();
//				return;
//			}
//若连接正常,此处无任何应答
	  		TranToMS[0] = _0;				//_B;
  	  		SendToModule (1);				//发送心跳包,就一个字节
//			DelaySeconds(30);				//原来 =4秒
			DelaySeconds(8);
			MinCounter = 0;
//
  			if(ModulFlags.Bit.EchoModule == 1)	//等待返回SEND OK
  			{
				ByteRecvUART2 = 0;
				WaitReturn = 0;
  	  			cRet = strncmppgm2ram((char *)RecvFromMS,(const far rom char *)SEND_OK,L_SEND_OK);
  	  			if(cRet == 0)
  	  			{
					ClearGPRSREG();
  	  			}
  	  			else
  	  			{
					OtherFlags.Bit.TCPLink = 0;
	    			Proc_err();
  	  			}
  	  		}
  	  		else	//发心跳包长时间没反应,疑似死机
  	  		{
				CantLinkMin++;
				if(CantLinkMin>1)		//2*10 = 20minutes
				{
					OtherFlags.Bit.TCPLink = 0;
					CantLinkMin = 0;
					Close_Shut();
					ReInitial();
				}
  	  		}
		}//END of if(MinCounter>=BT)
	}//END of if(OtherFlags.Bit.TCPLink == 1)
}

void DTUNO2Str(void)
{
	for(k=0;k<4;k++)
	{
		temp1 = DTU_Number[k] & 0xF0;
		temp3 = temp1 >>4;
		EnergyDataUCS2[k+k] = temp3 + 0x30;
		temp2 = DTU_Number[k] & 0x0F;
		EnergyDataUCS2[k+k+1] = temp2 + 0x30;
	}
}

void ConvertTime(void)
{  			
  		Text1 = RecvFromMS[19];		//小时高位
  		Text2 = RecvFromMS[20];		//小时低位
  		temp2 = Text1 - 0x30;
  		temp1 = temp2<<4;

  		temp3 = Text2 - 0x30;
  		Hour = temp1 + temp3;

  		Text1 = RecvFromMS[22];		//分高位
  		Text2 = RecvFromMS[23];		//分低位
  		temp2 = Text1 - 0x30;
  		temp1 = temp2<<4;

  		temp3 = Text2 - 0x30;
  		Minute = temp1 + temp3;

//  		Text1 = RecvFromMS[25];		//秒高位
//  		Text2 = RecvFromMS[26];		//秒低位
//  		temp2 = Text1 - 0x30;
//  		temp1 = temp2<<4;

//  		temp3 = Text2 - 0x30;
//  		Second = temp1 + temp3;
}

void ReadTime(void)
{
	LoadCMD_CCLK();
	WaitReturn = 2;
	SendToModule (CCLK_SIZE);
	DelaySeconds(5);

	if(ModulFlags.Bit.EchoModule == 1)
	{
		ConvertTime();
	}
	else
	{
		PassSeconds(2);

		LoadCMD_CCLK();
		WaitReturn = 2;
		SendToModule (CCLK_SIZE);
		DelaySeconds(5);
		if(ModulFlags.Bit.EchoModule == 1)
		{
			ConvertTime();
		}
		else if(ByteRecvUART2 == 0)
		{
			OtherFlags.Bit.TCPLink = 0;	
			Close_Shut();
			ReInitial();
		}
	}
	ClearGPRSREG();
}

void ReadDN_IP(void)
{
//test eeprom read
	EEADRH = 0;
	if(Link_Mode[0] ==_D && Link_Mode[1] ==_N)
	{
		EEADR = DomainNameAddr;
	}
	else if(Link_Mode[0] ==_I && Link_Mode[1] ==_P)
	{
		EEADR = IPAddress;
	}
	else
		return;

	EECON1bits.EEPGD = 0;	// Point to DATA memory
	EECON1bits.CFGS = 0;
	LengthIPDNS = 0;
	for (k = 0; k < LengthOfDomainName; k++)
	{
		EECON1bits.RD=1;
		temp1 = EEDATA;
		if(temp1 == 0x0D) break;
		Ip_start_buf2[k] = temp1;
		EEADR++;
		LengthIPDNS++;
	}
}

void ConvertToUCS2(void)
{
	for(tt=0;tt<36;tt++)
	{
		EnergyDataUCS2[tt] = 0x30;
	}
//先转高三个字节
	for(k=3;k>0;k--)
	{
	//字节高四位
		temp1 = EnergyData[k] & 0xF0;
		temp2 = temp1 >> 4;
		temp3 = temp2 + 0x30;

		temp1 = temp3 & 0xF0;
		temp2 = temp1 >> 4;
		tt = (3-k)<<3;
		tt = tt + 2;
		EnergyDataUCS2[tt] = temp2 + 0x30;
		temp1 = temp3 & 0x0F;
		tt = (3-k)<<3;
		tt = tt + 3;
		EnergyDataUCS2[tt] = temp1 + 0x30;
	//字节低四位
		temp1 = EnergyData[k] & 0x0F;
		temp3 = temp1 + 0x30;

		temp1 = temp3 & 0xF0;
		temp2 = temp1 >> 4;
		tt = (3-k)<<3;
		tt = tt + 6;
		EnergyDataUCS2[tt] = temp2 + 0x30;
		temp1 = temp3 & 0x0F;
		tt = (3-k)<<3;
		tt = tt + 7;
		EnergyDataUCS2[tt] = temp1 + 0x30;
	}

	//转小数点
		EnergyDataUCS2[26] = 0x32;
		EnergyDataUCS2[27] = 0x45;
		//转小数0.1位
		temp1 = EnergyData[0] & 0xF0;
		temp2 = temp1 >> 4;
		temp3 = temp2 + 0x30;

		temp1 = temp3 & 0xF0;
		temp2 = temp1 >> 4;
		EnergyDataUCS2[30] = temp2 + 0x30;
		temp1 = temp3 & 0x0F;
		EnergyDataUCS2[31] = temp1 + 0x30;
	//转小数0.01位
		temp1 = EnergyData[0] & 0x0F;
		temp3 = temp1 + 0x30;

		temp1 = temp3 & 0xF0;
		temp2 = temp1 >> 4;
		EnergyDataUCS2[34] = temp2 + 0x30;
		temp1 = temp3 & 0x0F;
		EnergyDataUCS2[35] = temp1 + 0x30;
}
void TimeDataToUCS2(void)
{
	for(tt=0;tt<68;tt++)	//(17*4=68)
	{
		SMS_Return[EnergyDataAddr+tt] = 0x30;	//数据转换区全清为30H
	}
//先转高三个字节
	for(k=0;k<17;k++)	//17个字节:05/05/23,14:49:00,字符方式
	{
	//高半字节
		temp1 = RecvFromMS[0x0A + k] & 0xF0;
		temp2 = temp1 >> 4;
		temp3 = temp2 + 0x30;
		tt = k<<2;
		tt = tt + 2;
	//低半字节
		SMS_Return[EnergyDataAddr+tt] = temp3;
		temp1 = RecvFromMS[0x0A + k] & 0x0F;
		tt = k<<2;
		tt = tt + 3;
		SMS_Return[EnergyDataAddr+tt] = temp1 + 0x30;
		k +=1;
//下一字节:
	//高半字节
		temp1 = RecvFromMS[0x0A + k] & 0xF0;
		temp2 = temp1 >> 4;
		temp3 = temp2 + 0x30;
		tt = k<<2;
		tt = tt + 2;
	//低半字节
		SMS_Return[EnergyDataAddr+tt] = temp3;
		temp1 = RecvFromMS[0x0A + k] & 0x0F;
		tt = k<<2;
		tt = tt + 3;
		SMS_Return[EnergyDataAddr+tt] = temp1 + 0x30;
		k +=1;
	}
	//转符号
		SMS_Return[EnergyDataAddr+0x0A] = 0x32;
		SMS_Return[EnergyDataAddr+0x0B] = _F;
		SMS_Return[EnergyDataAddr+22] = 0x32;
		SMS_Return[EnergyDataAddr+23] = _F;
		SMS_Return[EnergyDataAddr+34] = 0x32;
		SMS_Return[EnergyDataAddr+35] = _C;
		SMS_Return[EnergyDataAddr+46] = 0x33;
		SMS_Return[EnergyDataAddr+47] = _A;
		SMS_Return[EnergyDataAddr+58] = 0x33;
		SMS_Return[EnergyDataAddr+59] = _A;
}

void SMS_Energy(void)
{
		NOAddr = SMS_Start + 0x18;
		for(tt=0;tt<Address_Length;tt++)
		{
			//对方号码
			SMS_Return[tt] = RecvFromMS[NOAddr+tt];
		}
		for(tt=0;tt<SMS_Header2_SIZE;tt++)
		{
			SMS_Return[Address_Length+tt] = SMS_Header2[tt];
		}
		UDLAddr = Address_Length+SMS_Header2_SIZE;

//计算出UDL...
	//总:---------------------------------------------------
		EnergyDataAddr = UDLAddr+2;
		if(EnergyOfMonth == 0x00)	//取当前电量
		{
			for(tt=0;tt<Energy_Length;tt++)
			{
				SMS_Return[EnergyDataAddr+tt] = TotalE[tt];		//装载 有功总:
			}
		}
		else if(EnergyOfMonth == 0x01)	//取上月电量
		{
			for(tt=0;tt<Energy_Length;tt++)
			{
				SMS_Return[EnergyDataAddr+tt] = LMTotalE[tt];		//装载 上月总:
			}
		}
		else if(EnergyOfMonth == 0x02)	//取前月电量
		{
			for(tt=0;tt<Energy_Length;tt++)
			{
				SMS_Return[EnergyDataAddr+tt] = BLMTotalE[tt];		//装载 前月总:
			}
		}
		else if(EnergyOfMonth == 0x03)	//取无功电量
		{
			for(tt=0;tt<Energy_Length;tt++)
			{
				SMS_Return[EnergyDataAddr+tt] = WuGongE[tt];		//装载 无功总:
			}
		}
		else
			return;
		for(tt=0;tt<5;tt++)	//找到第一个68H,定位帧头
		{
			if(BUF_METER[tt] == 0x68)
				break;
		}
		TotalE_Addr = tt + 0x0C;
		EnergyData[0] = BUF_METER[TotalE_Addr] - 0x33;
		EnergyData[1] = BUF_METER[TotalE_Addr+1] - 0x33;
		EnergyData[2] = BUF_METER[TotalE_Addr+2] - 0x33;
		EnergyData[3] = BUF_METER[TotalE_Addr+3] - 0x33;
		ConvertToUCS2();
//填入总电量UCS2数据............
		for(tt=0;tt<PerEnergyDataLength;tt++)
		{
			SMS_Return[EnergyDataAddr+Energy_Length+tt] = EnergyDataUCS2[tt];
		}

	//尖:---------------------------------------------------
		NowPosition = EnergyDataAddr + Energy_Length + PerEnergyDataLength;//=0x54

		for(tt=0;tt<TABChar_Length;tt++)
		{
			SMS_Return[NowPosition+tt] = SharpE[tt];
		}
		SharpE_Addr = TotalE_Addr + 4;
		EnergyData[0] = BUF_METER[SharpE_Addr] - 0x33;
		EnergyData[1] = BUF_METER[SharpE_Addr+1] - 0x33;
		EnergyData[2] = BUF_METER[SharpE_Addr+2] - 0x33;
		EnergyData[3] = BUF_METER[SharpE_Addr+3] - 0x33;
		ConvertToUCS2();
//填入尖电量UCS2数据............
		for(tt=0;tt<PerEnergyDataLength;tt++)
		{
			SMS_Return[NowPosition+TABChar_Length+tt] = EnergyDataUCS2[tt];
		}
//峰:---------------------------------------------------
		NowPosition = NowPosition + TABChar_Length + PerEnergyDataLength;

		for(tt=0;tt<TABChar_Length;tt++)
		{
			SMS_Return[NowPosition+tt] = PeakE[tt];
		}
		PeakE_Addr = SharpE_Addr + 4;
		EnergyData[0] = BUF_METER[PeakE_Addr] - 0x33;
		EnergyData[1] = BUF_METER[PeakE_Addr+1] - 0x33;
		EnergyData[2] = BUF_METER[PeakE_Addr+2] - 0x33;
		EnergyData[3] = BUF_METER[PeakE_Addr+3] - 0x33;
		ConvertToUCS2();
//填入峰电量UCS2数据............
		for(tt=0;tt<PerEnergyDataLength;tt++)
		{
			SMS_Return[NowPosition+TABChar_Length+tt] = EnergyDataUCS2[tt];
		}
//平:---------------------------------------------------
		NowPosition = NowPosition + TABChar_Length + PerEnergyDataLength;

		for(tt=0;tt<TABChar_Length;tt++)
		{
			SMS_Return[NowPosition+tt] = DayE[tt];
		}
		DayE_Addr = PeakE_Addr + 4;
		EnergyData[0] = BUF_METER[DayE_Addr] - 0x33;
		EnergyData[1] = BUF_METER[DayE_Addr+1] - 0x33;
		EnergyData[2] = BUF_METER[DayE_Addr+2] - 0x33;
		EnergyData[3] = BUF_METER[DayE_Addr+3] - 0x33;
		ConvertToUCS2();
//填入平电量UCS2数据............
		for(tt=0;tt<PerEnergyDataLength;tt++)
		{
			SMS_Return[NowPosition+TABChar_Length+tt] = EnergyDataUCS2[tt];
		}

//谷:---------------------------------------------------
		NowPosition = NowPosition + TABChar_Length + PerEnergyDataLength;//=0x54
	
		for(tt=0;tt<TABChar_Length;tt++)
		{
			SMS_Return[NowPosition+tt] = LowE[tt];
		}
		LowE_Addr = DayE_Addr + 4;
		EnergyData[0] = BUF_METER[LowE_Addr] - 0x33;
		EnergyData[1] = BUF_METER[LowE_Addr+1] - 0x

⌨️ 快捷键说明

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