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

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

📁 PIC18F6520+SIM300做的透明传输的DTU
💻 C
📖 第 1 页 / 共 5 页
字号:
  EECON1bits.CFGS = 0;
  LengthIP = 0;
  for (k = 0; k < 15; k++)
  {
  	EECON1bits.RD=1;
	temp1 = EEDATA;
	if(temp1 == 0x00) break;
	Ip_start_buf2[k] = temp1;
	EEADR++;
	LengthIP++;
  }
}

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 RetSMS(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;
		for(tt=0;tt<TotalE_Length;tt++)
		{
			SMS_Return[EnergyDataAddr+tt] = TotalE[tt];		//装载 有功总:
		}
		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<36;tt++)
		{
			SMS_Return[EnergyDataAddr+TotalE_Length+tt] = EnergyDataUCS2[tt];
		}

	//尖:---------------------------------------------------
		SEPosition = EnergyDataAddr + TotalE_Length + 36;//=0x54

		for(tt=0;tt<SharpE_Length;tt++)
		{
			SMS_Return[SEPosition+tt] = SharpE[tt];
		}
		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<36;tt++)
		{
			SMS_Return[SEPosition+SharpE_Length+tt] = EnergyDataUCS2[tt];
		}
//峰:---------------------------------------------------
		PEPosition=SEPosition + SharpE_Length + 36;//=0x54

		for(tt=0;tt<PeakE_Length;tt++)
		{
			SMS_Return[PEPosition+tt] = PeakE[tt];
		}
		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<36;tt++)
		{
			SMS_Return[PEPosition+PeakE_Length+tt] = EnergyDataUCS2[tt];
		}
//平:---------------------------------------------------
		DEPosition=PEPosition + PeakE_Length + 36;//=0x54

		for(tt=0;tt<DayE_Length;tt++)
		{
			SMS_Return[DEPosition+tt] = DayE[tt];
		}
		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<36;tt++)
		{
			SMS_Return[DEPosition+DayE_Length+tt] = EnergyDataUCS2[tt];
		}

//谷:---------------------------------------------------
		LEPosition=DEPosition + DayE_Length + 36;//=0x54
	
		for(tt=0;tt<LowE_Length;tt++)
		{
			SMS_Return[LEPosition+tt] = LowE[tt];
		}
		EnergyData[0] = BUF_METER[LowE_Addr] - 0x33;
		EnergyData[1] = BUF_METER[LowE_Addr+1] - 0x33;
		EnergyData[2] = BUF_METER[LowE_Addr+2] - 0x33;
		EnergyData[3] = BUF_METER[LowE_Addr+3] - 0x33;
		ConvertToUCS2();
//填入谷电量UCS2数据............
		for(tt=0;tt<36;tt++)
		{
			SMS_Return[LEPosition+LowE_Length+tt] = EnergyDataUCS2[tt];
		}


//------------------------------------------------------------------------------
//最大0x8C,有功总: 就4个字符,但乘2变成8作为UDL,而实际占用的字节是8再乘2 =16字节
//如此算来,4个字节的电量,再加小数点共9个字符,UDL的长度应为18,而实际占用36个字节.
//这样,用功总:123456.78 的UDLLength=8+18=26
		UDLLength = 114;	//26+22+22+22+22=72h;	//总尖峰平92(5CH),最大8C
		temp3 = UDLLength;
		dLength = temp3 + 15;
		temp1 = temp3>>4;			// 除以16转换成16进制的两个数字
		tt = temp1<<4;
		temp2 = temp3 - tt;			//如果temp2=A~F?
		B2ASC();
		SMS_Return[UDLAddr] = temp1 + 0x30;
		SMS_Return[UDLAddr + 1] = temp2;
//结束符
  		AllLength = LEPosition + LowE_Length + 36;	//D8
  		SMS_Return[AllLength] = _CTRLZ;
		
///////////////////////////////
		for(k=0;k<32;k++)
		{
			RecvFromMS[k] = 0;
		}
///////////////////////////////
//CMGS send:
		WaitReturn = 0;
		while(1)
		{
			LoadCMD_CMGS();
	  		if(dLength >= 100)
	  		{
				tempArr[0] = dLength / 100;						//求百位
	  			temp2 = dLength-(dLength / 100) * 100;	
	  			tempArr[1] = temp2 / 10;						//求十位
	  			tempArr[2] = temp2-(temp2 / 10) * 10;			//求个位
	  			TranToMS[AT_CMGS_SIZE] = tempArr[0]+0x30;	//转换成字符
	  			TranToMS[AT_CMGS_SIZE + 1] = tempArr[1]+0x30;	//转换成字符
	  			TranToMS[AT_CMGS_SIZE + 2] = tempArr[2]+0x30;	//转换成字符
	  			TranToMS[AT_CMGS_SIZE + 3] = _CR;	
  	  			SendToModule (AT_CMGS_SIZE + 4);
	  		}  
	  		else if(dLength >= 10)
	  		{
	  			tempArr[0] = dLength/10;						//求十位
	  			tempArr[1] = dLength-(dLength/10)*10;			//求个位
	  			TranToMS[AT_CMGS_SIZE] = tempArr[0]+0x30;	//转换成字符
	  			TranToMS[AT_CMGS_SIZE + 1] = tempArr[1]+0x30;	//转换成字符
	  			TranToMS[AT_CMGS_SIZE + 2] = _CR;	
  	  			SendToModule (AT_CMGS_SIZE + 3);
 	  		}	
	  		else		//dLength<10
	  		{
	  			TranToMS[AT_CMGS_SIZE] = dLength + 0x30;	//转换成字符
	  			TranToMS[AT_CMGS_SIZE + 1] = _CR;	
  	  			SendToModule (AT_CMGS_SIZE + 2);
 	  		}	
		  	TempFlag.Bit.CMGSSent = 1;

  			for(tt=100;tt>0;tt--) 	//延时5秒
  			{
  				if(FrameFlag.Bit.EchoModule == 1)
						break;
    			delay50ms ();
  			}
  			if(RecvFromMS[2] == _YOUJ)
  				break;
  		}	//end while

		TempFlag.Bit.CMGSSent = 0;

//先发header1
		for(tt=0;tt<SMS_Header1_SIZE;tt++)
		{
  			TranToMS[tt] = SMS_Header1[tt]; 
		}
  		WaitReturn = 3;
  		SendToModule (SMS_Header1_SIZE);	//+1: 加上了_CTRLZ

//取出准备好的电量数据
  		for(k = 0;k < (AllLength+1);k++)
  		{
  			TranToMS[k] = SMS_Return[k]; 
  		}
//data send to main station
  		SendToModule (AllLength + 1);	//+1: 加上了_CTRLZ

		for(k = 100;k>0;k--) 	//延时5秒
		{
  			if(FrameFlag.Bit.EchoModule == 1)
  				break;
  			delay50ms ();
		}
  		cRet = strncmppgm2ram(RecvFromMS,PlusCMGS,L_PlusCMGS);
  		if(cRet == 0)
  		{//短信发送成功
			ClearCommREG();
  		}
  	   	TempFlag.Bit.SMS_GetData = 0;
		FrameFlag.Bit.REV_Meter = 0;  	    	
}

void WS_RetSMS(void)
{
	unsigned char EIndex;
	
		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;
		for(tt=0;tt<TotalE_Length;tt++)
		{
			SMS_Return[EnergyDataAddr+tt] = TotalE[tt];		//装载 有功总:
		}
////
		EIndex = WS_TotalE_Addr;
		HandleData(EIndex);
		
//填入总电量UCS2数据............
		for(tt=0;tt<32;tt++)
		{
			SMS_Return[EnergyDataAddr+TotalE_Length+tt] = EnergyDataUCS2[tt];
		}

//峰:---------------------------------------------------
		PEPosition=EnergyDataAddr + TotalE_Length + 32;

		for(tt=0;tt<PeakE_Length;tt++)
		{
			SMS_Return[PEPosition+tt] = PeakE[tt];
		}
////
		EIndex = WS_PeakE_Addr;
		HandleData(EIndex);
//填入峰电量UCS2数据............
		for(tt=0;tt<32;tt++)
		{
			SMS_Return[PEPosition+PeakE_Length+tt] = EnergyDataUCS2[tt];
		}
//平:---------------------------------------------------
		DEPosition=PEPosition + PeakE_Length + 32;//=0x54

		for(tt=0;tt<DayE_Length;tt++)
		{
			SMS_Return[DEPosition+tt] = DayE[tt];
		}
////
		EIndex = WS_DayE_Addr;
		HandleData(EIndex);
//填入平电量UCS2数据............
		for(tt=0;tt<32;tt++)
		{
			SMS_Return[DEPosition+DayE_Length+tt] = EnergyDataUCS2[tt];
		}

//谷:---------------------------------------------------
		LEPosition=DEPosition + DayE_Length + 32;//=0x54
	
		for(tt=0;tt<LowE_Length;tt++)
		{
			SMS_Return[LEPosition+tt] = LowE[tt];
		}
////
		EIndex = WS_LowE_Addr;
		HandleData(EIndex);
//填入谷电量UCS2数据............
		for(tt=0;tt<32;tt++)
		{
			SMS_Return[LEPosition+LowE_Length+tt] = EnergyDataUCS2[tt];
		}
//尖:---------------------------------------------------
		SEPosition = LEPosition + LowE_Length + 32;//=0x54

		for(tt=0;tt<SharpE_Length;tt++)
		{
			SMS_Return[SEPosition+tt] = SharpE[tt];
		}
////
		EIndex = WS_SharpE_Addr;
		HandleData(EIndex);
//填入尖电量UCS2数据............
		for(tt=0;tt<32;tt++)
		{
			SMS_Return[SEPosition+SharpE_Length+tt] = EnergyDataUCS2[tt];
		}

//------------------------------------------------------------------------------
//最大0x8C,有功总: 就4个字符,但乘2变成8作为UDL,而实际占用的字节是8再乘2 =16字节
//如此算来,4个字节的电量,UDL的长度应为16,而实际占用32个字节.
//这样,用功总:12345678 的UDLLength=8+16=24
		UDLLength = 104;	//24+20+20+20+20=68h;	//总峰平谷尖92(5CH),最大8C
		temp3 = UDLLength;
		dLength = temp3 + 15;
		temp1 = temp3>>4;			// 除以16转换成16进制的两个数字
		tt = temp1<<4;
		temp2 = temp3 - tt;			//如果temp2=A~F?
		B2ASC();
		SMS_Return[UDLAddr] = temp1 + 0x30;
		SMS_Return[UDLAddr + 1] = temp2;
//结束符
  		AllLength = SEPosition + SharpE_Length + 32;	//D8
  		SMS_Return[AllLength] = _CTRLZ;
		
///////////////////////////////
		for(k=0;k<32;k++)
		{
			RecvFromMS[k] = 0;
		}
///////////////////////////////
//CMGS send:
		WaitReturn = 0;
		while(1)
		{
			LoadCMD_CMGS();
	  		if(dLength >= 100)
	  		{
				tempArr[0] = dLength / 100;						//求百位
	  			temp2 = dLength-(dLength / 100) * 100;	
	  			tempArr[1] = temp2 / 10;						//求十位
	  			tempArr[2] = temp2-(temp2 / 10) * 10;			//求个位
	  			TranToMS[AT_CMGS_SIZE] = tempArr[0]+0x30;	//转换成字符
	  			TranToMS[AT_CMGS_SIZE + 1] = tempArr[1]+0x30;	//转换成字符
	  			TranToMS[AT_CMGS_SIZE + 2] = tempArr[2]+0x30;	//转换成字符
	  			TranToMS[AT_CMGS_SIZE + 3] = _CR;	
  	  			SendToModule (AT_CMGS_SIZE + 4);
	  		}  
	  		else if(dLength >= 10)
	  		{
	  			tempArr[0] = dLength/10;						//求十位
	  			tempArr[1] = dLength-(dLength/10)*10;			//求个位
	  			TranToMS[AT_CMGS_SIZE] = tempArr[0]+0x30;	//转换成字符
	  			TranToMS[AT_CMGS_SIZE + 1] = tempArr[1]+0x30;	//转换成字符
	  			TranToMS[AT_CMGS_SIZE + 2] = _CR;	
  	  			SendToModule (AT_CMGS_SIZE + 3);
 	  		}	
	  		else		//dLength<10
	  		{
	  			TranToMS[AT_CMGS_SIZE] = dLength + 0x30;	//转换成字符
	  			TranToMS[AT_CMGS_SIZE + 1] = _CR;	
  	  			SendToModule (AT_CMGS_SIZE + 2);
 	  		}	
		  	TempFlag.Bit.CMGSSent = 1;

  			for(tt=100;tt>0;tt--) 	//延时5秒
  			{
  				if(FrameFlag.Bit.EchoModule == 1)
						break;
    			delay50ms ();
  			}
  			if(RecvFromMS[2] == _YOUJ)
  				break;
  		}	//end while

		TempFlag.Bit.CMGSSent = 0;

//先发header1
		for(tt=0;tt<SMS_Header1_SIZE;tt++)
		{
  			TranToMS[tt] = SMS_Header1[tt]; 
		}
  		WaitReturn = 3;
  		SendToModule (SMS_Header1_SIZE);	//+1: 加上了_CTRLZ

//取出准备好的电量数据
  		for(k = 0;k < (AllLength+1);k++)
  		{
  			TranToMS[k] = SMS_Return[k]; 
  		}
//data send to main station
  		SendToModule (AllLength + 1);	//+1: 加上了_CTRLZ

		for(k = 100;k>0;k--) 	//延时5秒
		{
  			if(FrameFlag.Bit.EchoModule == 1)
  				break;
  			delay50ms ();
		}
  		cRet = strncmppgm2ram(RecvFromMS,PlusCMGS,L_PlusCMGS);
  		if(cRet == 0)
  		{//短信发送成功
			ClearCommREG();
  		}
  	   	TempFlag.Bit.SMS_GetData = 0;
		TempFlag.Bit.isWEISHENG = 0;//清除威胜表通信标志
		FrameFlag.Bit.REV_Meter = 0;  	    	
}

void HandleData(unsigned char ei)
{
//变成一个大的长整型
		temp2 = BUF_METER[ei];
		ASC2B();
		temp1 = temp2;
		temp2 = BUF_METER[ei+1];
		ASC2B();
		LargeValueHigh = (unsigned long)temp1<<4;
		EnergyValue = LargeValueHigh + (unsigned long)temp2;

		temp2 = BUF_METER[ei+2];
		ASC2B();
		temp1 = temp2;
		temp2 = BUF_METER[ei+3];
		ASC2B();
		LargeValueHigh = (unsigned long)temp1<<12;
		LargeValueLow = (unsigned long)temp2<<8;
		EnergyValue = EnergyValue+LargeValueHigh+LargeValueLow;

		temp2 = BUF_METER[ei+4];
		ASC2B();
		temp1 = temp2;
		temp2 = BUF_METER[ei+5];
		ASC2B();
		LargeValueHigh = (unsigned long)temp1<<20;
		LargeValueLow = (unsigned long)temp2<<16;
		EnergyValue = EnergyValue+LargeValueHigh+LargeValueLow;

		temp2 = BUF_METER[ei+6];
		ASC2B();
		temp1 = temp2;
		temp2 = BUF_METER[ei+7];
		ASC2B();
		LargeValueHigh = (unsigned long)temp1<<28;
		LargeValueLow = (unsigned long)temp2<<

⌨️ 快捷键说明

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