📄 pdu手机采老威胜电量成功 main.c
字号:
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 + -