📄 main.c
字号:
}
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 + -