📄 红外收发成功.c
字号:
parity ^=0x01;
tt = gp & 0x08;
if(tt != 0)
parity ^=0x01;
tt = gp & 0x10;
if(tt != 0)
parity ^=0x01;
tt = gp & 0x20;
if(tt != 0)
parity ^=0x01;
tt = gp & 0x40;
if(tt != 0)
parity ^=0x01;
tt = gp & 0x80;
if(tt != 0)
parity ^=0x01;
}
void CHECKSUM(void)
{
unsigned int CXOR = 0;
for(k=0;k<10+BUF_METER[12];k++)
{
CXOR = CXOR + BUF_METER[3+k];
}
BUF_METER[3+10+BUF_METER[12]] = (unsigned char)CXOR;
BUF_METER[3+10+BUF_METER[12]+1] = 0x16;
}
void YC_CHECKSUM(void)
{
unsigned int CXOR = 0;
for(k=0;k<10+YC_CMD_BUF[12];k++)
{
CXOR = CXOR + YC_CMD_BUF[3+k];
}
YC_CMD_BUF[3+10+YC_CMD_BUF[12]] = (unsigned char)CXOR;
YC_CMD_BUF[3+10+YC_CMD_BUF[12]+1] = 0x16;
}
void TT_CHECKSUM(void)
{
unsigned int CXOR = 0;
for(k=0;k<10;k++)
{
CXOR = CXOR + TranToMS[k]; //没有前导符0xFE
}
TranToMS[10] = (unsigned char)CXOR;
TranToMS[11] = 0x16;
}
void SMS_CHECKSUM(void)
{
unsigned int CXOR = 0;
for(k=0;k<10+SMS_CMD_BUF[12];k++)
{
CXOR = CXOR + SMS_CMD_BUF[3+k];
}
SMS_CMD_BUF[3+10+SMS_CMD_BUF[12]] = (unsigned char)CXOR;
SMS_CMD_BUF[3+10+SMS_CMD_BUF[12]+1] = 0x16;
}
void PWRKeyOn(void)
{
PowerKey = HIGH;
PassSeconds(2);
PowerKey = LOW; //power down
PassSeconds(1);
PassSeconds(5);
LoadCMD_AT();
SendToModule (3);
PassSeconds(40); //等待CALL READY
ModulFlags.Bit.EchoModule = 0;
ModulFlags.Bit.RecvEcho = 0;
ClearGPRSREG();
Nop();
for (k = 0; k < 32; k++) //清除字节的接收区
{
RecvFromMS[k] = 0;
}
Nop();
}
void PWRKeyOff(void)
{
PowerKey = HIGH;
PassSeconds(1);
PowerKey = LOW; //power down
PassSeconds(10);
ModulFlags.Bit.EchoModule = 0;
ModulFlags.Bit.RecvEcho = 0;
ClearGPRSREG();
Nop();
for (k = 0; k < 32; k++) //清除字节的接收区
{
RecvFromMS[k] = 0;
}
Nop();
}
void PowerOnModule(void)
{
SHANGDIAN = HIGH;
PassSeconds(1);
}
void PowerOffModule(void)
{
SHANGDIAN = LOW;
PassSeconds(10);
}
void W_eeprom(char *pData,unsigned int addr,unsigned char DataLen)
{
EEADRH = hibyte(addr);
EEADR = lobyte(addr);
EECON1bits.EEPGD=0;
EECON1bits.CFGS=0;
EECON1bits.WREN=1;
INTCONbits.GIE = 0;
for (k = 0; k < DataLen; k++)
{
EEDATA=pData[k];
EECON2=0x55;
EECON2=0xAA;
EECON1bits.WR=1;
while (!PIR2bits.EEIF)
;
PIR2bits.EEIF=0;
EEADR++;
}
EECON1bits.WREN = 0;
INTCONbits.GIE = 1;
}
void R_eeprom(char *pData,unsigned int addr,unsigned char DataLen)
{
EEADRH = hibyte(addr);
EEADR = lobyte(addr);
EECON1bits.EEPGD=0; // Point to DATA memory
EECON1bits.CFGS=0;
INTCONbits.GIE = 0;
for (k = 0; k < DataLen; k++)
{
EECON1bits.RD=1;
temp1 = EEDATA;
pData[k] = temp1;
EEADR++;
}
INTCONbits.GIE = 1;
}
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;
ReadTime();
//看看是否到0点0分开始抄电表数据
//----------------------------------------------
//----------------------------------------------
}
}
if(OtherFlags.Bit.TCPLink == 0x01)
{//已连接上
if(MinCounter >= BT)
SendBeatPack();
/*
OnLineTime++;
if(OnLineTime>10)
{
OnLineTime = 0;
OtherFlags.Bit.TCPLink = 0;
OnlineLed = HIGH; //关闭在线灯
SignalLed = HIGH; //关闭信号强度灯
ModulFlags.ModuleBYTE = 0;
Close_Shut();
Nop();
}
*/
}
// if(Minute >= 0x56 && OtherFlags.Bit.TCPLink == 0x00) //57分,58分,59分请求连接三次
if(OtherFlags.Bit.TCPLink == 0x00)
{
Close_Shut();
Nop();
ConnectIP();
}
}
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[16]; //日高位
Text2 = RecvFromMS[17]; //日低位
temp2 = Text1 - 0x30;
temp1 = temp2<<4;
temp3 = Text2 - 0x30;
Date = temp1 + temp3;
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();
}
ClearGPRSREG();
}
void Read_IP(void)
{
EEADRH = 0;
EEADR = IPAddress;
EECON1bits.EEPGD = 0; // Point to DATA memory
EECON1bits.CFGS = 0;
LengthIPDNS = 0;
for (k = 0; k < 16; k++)
{
EECON1bits.RD=1;
temp1 = EEDATA;
if(temp1 == 0x00 || temp1 == 0xFF) break;
Ip_start_buf2[k] = temp1;
EEADR++;
LengthIPDNS++;
}
Nop();
}
void Read_APN(void)
{
TranToMS[0] = _A;
TranToMS[1] = _T;
TranToMS[2] = _PLUS;
TranToMS[3] = _C;
TranToMS[4] = _S;
TranToMS[5] = _T;
TranToMS[6] = _T;
TranToMS[7] = _EQUAL;
TranToMS[8] = _QUOTE;
EEADRH = 0; //1K空间共有4页:000~3FFH
EEADR = APNAddr;
EECON1bits.EEPGD = 0; // Point to DATA memory
EECON1bits.CFGS = 0;
temp2 = 9; //读出字节计数
for (k = 0; k < 16; k++)
{
EECON1bits.RD=1;
temp1 = EEDATA;
if(temp1 == 0x00) break;
TranToMS[k+9] = temp1;
EEADR++;
temp2++;
}
TranToMS[temp2] = _QUOTE;
temp2++;
TranToMS[temp2] = _COMMA;
temp2++;
TranToMS[temp2] = _QUOTE;
temp2++;
TranToMS[temp2] = _QUOTE;
temp2++;
TranToMS[temp2] = _COMMA;
temp2++;
TranToMS[temp2] = _QUOTE;
temp2++;
TranToMS[temp2] = _QUOTE;
temp2++;
TranToMS[temp2] = _CR;
temp2++;
}
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 //取上月电量
{
for(tt=0;tt<Energy_Length;tt++)
{
SMS_Return[EnergyDataAddr+tt] = LMTotalE[tt]; //装载 上月总:
}
}
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] = PeakE[tt];
}
PeakE_Addr = TotalE_Addr + 4;
EnergyData[0] = BUF_METER[PeakE_Addr] - 0x33;
EnergyData[1] = BU
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -