📄 main.c
字号:
else if(SMS_CMD == 'S' || SMS_CMD == 's') //S:上月电量
{
BUF_METER[3] = 0x02; //上月电量数据位
OtherFlags.Bit.WS_NowLastE = 1;
}
else
return;
BUF_METER[4] = 0x00;
BUF_METER[5] = 0x00;
BUF_METER[6] = BUF_METER[0]^BUF_METER[1]^BUF_METER[2]^BUF_METER[3]^BUF_METER[4]^BUF_METER[5];
for(k=0;k<6;k++)
{
cSum = cSum + BUF_METER[k];
}
BUF_METER[7] = (unsigned char)cSum;
BUF_METER[8] = _CR;
SendCMDtoMeter(9);
for(ii = 80;ii > 0;ii--) //延时4秒
{
if(MeterComm.Bit.aFrame == 0x01)
break;
delay50ms ();
}
if(MeterComm.Bit.aFrame == 0x00)
return;
WS_Energy(); //用短信上报威胜表电量:有功总,峰,平,谷,无功总,反向无功
MeterComm.Bit.aFrame = 0x00;
}//END of else if(TP_UDL == 3)
else if(TP_UDL >= 0x0D)
{
for(k=0;k<DNE_SIZE;k++)
{
SMS_Return[k] = RecvFromMS[DataAddr + k]; //对方号码
}
if(strncmppgm2ram((char *)SMS_Return,(const far rom char *)DOMAINNAMEEQUAL,DNE_SIZE) == 0)
{
TP_UDL -=3; //总长度中减去 域名= 这三个字符
//
for(k=0;k<TP_UDL;k++)
{
temp1 = RecvFromMS[(DataAddr+12)+k*4+2];
temp2 = RecvFromMS[(DataAddr+12)+k*4+3];
if(temp1 == '2' && temp2 == 'E')
{
temp3 = '.' ;
}
else if(isalnum(temp1) && isalnum(temp2))
{
ASC2B(); //将temp2转化
Text2 = temp2;
temp2 = temp1;
ASC2B(); //将temp1转化
Text1 = temp2;
Text3 = Text1 <<4;
temp3 = Text3 + Text2;
}
else
return;
Ip_start_buf2[k] = temp3;
}//END for
Ip_start_buf2[k] = 0x0D; //写入EEPROM前置结束符
W_eeprom((char *)Ip_start_buf2,DomainNameAddr,(TP_UDL+1));
OK_Data();
SendSMS(); //发送短信 OK
OtherFlags.Bit.TCPLink = 0;
Close_Shut();
//
Link_Mode[0] = _D;
Link_Mode[1] = _N;
LoadCMD_CIPLINK();
WaitReturn = 0;
SendToModule (AT_CDNSORIP_SIZE);
DelaySeconds(3);
ModulFlags.Bit.EchoModule = 0;
W_eeprom((char *)Link_Mode,LinkMode,2);
}
else if(strncmppgm2ram((char *)SMS_Return,(const far rom char *)IPAddressEqual,IP_SIZE) == 0)
{
TP_UDL -=3; //总长度中减去 地址= 这三个字符
Text1 = 0; //IP地址长度初始化为0
//
for(k=0;k<TP_UDL;k++)
{
temp1 = RecvFromMS[(DataAddr+12)+k*4+2];
temp2 = RecvFromMS[(DataAddr+12)+k*4+3];
if(temp1 == '2' && temp2 == 'E')
{
temp3 = '.' ;
}
else if(isdigit(temp1) && isdigit(temp2))
{
temp1 -=0x30;
temp2 -=0x30;
Text3 = temp1 <<4;
temp3 = Text3 + temp2;
}
else
return;
Ip_start_buf2[k] = temp3;
Text1 += 1;
}//END for
Ip_start_buf2[k] = 0x0D; //写入EEPROM前置结束符
W_eeprom((char *)Ip_start_buf2,IPAddress,(Text1+1));
OK_Data();
SendSMS(); //发送短信 OK
OtherFlags.Bit.TCPLink = 0;
Close_Shut();
//
Link_Mode[0] = _I;
Link_Mode[1] = _P;
LoadCMD_CIPLINK();
WaitReturn = 0;
SendToModule (AT_CDNSORIP_SIZE);
DelaySeconds(3);
ModulFlags.Bit.EchoModule = 0;
W_eeprom((char *)Link_Mode,LinkMode,2);
}
else if(strncmppgm2ram((char *)SMS_Return,(const far rom char *)DateTimeEQUAL,DTE_SIZE) == 0)
{
TP_UDL -=3; //总长度中减去 时间= 这三个字符
//
SetDateTime();
k = 0x09; //destination
for(j=0;j<TP_UDL;j++) //12个数字
{
temp1 = RecvFromMS[(DataAddr+12)+j*4+2];
temp2 = RecvFromMS[(DataAddr+12)+j*4+3];
Text1 = temp1 - 0x30;
Text2 = temp2 - 0x30;
Text3 = Text1 << 4;
TranToMS[k] = Text3 + Text2;
k++;
j++;
temp1 = RecvFromMS[(DataAddr+12)+j*4+2];
temp2 = RecvFromMS[(DataAddr+12)+j*4+3];
Text1 = temp1 - 0x30;
Text2 = temp2 - 0x30;
Text3 = Text1 << 4;
TranToMS[k] = Text3 + Text2;
k +=2;
j++;
}//END for
SendToModule (SetCCLK_SIZE);
DelaySeconds(2);
if(ModulFlags.Bit.EchoModule == 1)
{
cRet = strncmppgm2ram((char *)RecvFromMS,(const far rom char *)OK,L_OK);
if(cRet == 0)
{
OK_Data();
SendSMS(); //发送短信 OK
ReadTime();
}
}
ModulFlags.Bit.EchoModule = 0 ;
ByteRecvUART2 = 0;
}
else
return;
}
WaitReturn = 0; //必须加!否则,module主动上报帧会一直等第二个回车
}//END Proc_SMS
void ErrorMSG(void)
{
LoadCMD_CMGD();
WaitReturn = 0;
SendToModule (CMGR_CMGD_SIZE);
DelaySeconds(4);
}
//**********************************************************
void LoadCipstartBuf(void)
{
for(k=0;k<L_start_buf1;k++)
{
TranToMS[k] = Ip_start_buf1[k];
}
for(k=0;k<LengthIPDNS;k++)
{
TranToMS[k+L_start_buf1] = Ip_start_buf2[k];
}
for(k=0;k<L_start_buf3;k++)
{
TranToMS[k+LengthIPDNS+L_start_buf1] = Ip_start_buf3[k];
}
//TranToMS数组数据准备好
LengthCipstart = L_start_buf1 + LengthIPDNS + L_start_buf3;
}
//**********************************************************
void InitPeriph(void)
{
EN485 = EnReceive;
EN485_CTRL = OUTPUT;
TRIS_TXD2 = OUTPUT;
TRIS_RXD2 = INPUT;
ONOFF = HIGH;
ONOFF_CTRL = OUTPUT;
RSTModule = HIGH;
RSTModule_CTRL = OUTPUT;
//
CMCON = 0x07; // Turn off comparators
ADCON1 = 0x0F; // Set PORTF as digital I/O
RedLed_CTRL = OUTPUT;
GreenLed_CTRL = OUTPUT;
RedLed = CLOSE;
GreenLed = CLOSE;
//
}
/*
void LedOn(void)
{
RedLed = LIGHT;
GreenLed = LIGHT;
RedLed_CTRL = OUTPUT;
GreenLed_CTRL = OUTPUT;
CMCON = 0x07; // Turn off comparators
ADCON1 = 0x0F; // Set PORTF as digital I/O
for(k=20;k>0;k--) //延时1秒
{
delay50ms ();
}
}
*/
void UART1_setup(void)
{
/* relates crystal freq to baud rate - see PIC18Fxxx data sheet
BRGH=1, Fosc=3.6864MHz BRGH=1, Fosc=4MHz BRGH=1, Fosc=8MHz BRGH=1, Fosc=16MHz
---------------------- ----------------- ----------------- ------------------
Baud SPBRG Baud SPBRG Baud SPBRG Baud SPBRG
1200 191 1200 207.3 1200 415.7 9600 103
2400 95 2400 103.2 2400 207.3 19200 51
4800 47 4800 51.1 4800 103.2 38400 25
9600 23 9600 25.0 9600 51.1 57600 16
19200 11 19200 12.0 19200 25.0 115200 8
38400 5 38400 5.5 38400 12.0
57600 3 57600 3.3 57600 7.7
115200 1 115200 1 115200 1.2 115200 3.3
*/
//#define BRGH_VALUE 1: 1200 +0.16 207 这个误差小,准确
//#define BRGH_VALUE 0: 1200 +1.67 51
#define BAUD1 1200
// #define BAUD1 9600
// #define BAUD 38400
#define SPBRG1_VALUE ((PIC_CLK/(16UL * BAUD1) -1))
#define BRGH_VALUE 1
//如果 BRGH_VALUE=0 则SPBRG_VALUE= ((PIC_CLK/(64UL * BAUD1) -1))
TXSTA1bits.TRMT=0;
TXSTA1bits.BRGH=BRGH_VALUE;
TXSTA1bits.SYNC=0; //asynchronous
TXSTA1bits.TXEN=0; //enable the transmitter
TXSTA1bits.TX9=1; //发送9位
// TXSTA1bits.TX9=0; //发送8位
// TXSTA1bits.CSRC=1; //异步方式don't care
SPBRG1 = SPBRG1_VALUE;
RCSTA1bits.OERR=0; //enable serial port pins
RCSTA1bits.FERR=0; //enable serial port pins
RCSTA1bits.ADDEN=0; //enable serial port pins
RCSTA1bits.CREN=1; //enable reception
// RCSTA1bits.SREN=0; //异步方式don't care
RCSTA1bits.RX9=1; //接收9位
// RCSTA1bits.RX9=0; //接收8位
RCSTA1bits.SPEN=1; //Serial Port Enable bit
}
void UART2_setup(void)
{
/* relates crystal freq to baud rate - see PIC18Fxxx data sheet
BRGH=1, Fosc=3.6864MHz BRGH=1, Fosc=4MHz BRGH=1, Fosc=8MHz BRGH=1, Fosc=16MHz
---------------------- ----------------- ----------------- ------------------
Baud SPBRG Baud SPBRG Baud SPBRG Baud SPBRG
1200 191 1200 207.3 1200 415.7 9600 103
2400 95 2400 103.2 2400 207.3 19200 51
4800 47 4800 51.1 4800 103.2 38400 25
9600 23 9600 25.0 9600 51.1 57600 16
19200 11 19200 12.0 19200 25.0 115200 8
38400 5 38400 5.5 38400 12.0
57600 3 57600 3.3 57600 7.7
115200 1 115200 1.2 115200 3.3
*/
// #define BAUD1 1200
#define BAUD2 9600
#define BRGH_VALUE2 1
#define SPBRG2_VALUE ((PIC_CLK/(16UL * BAUD2) -1))
TXSTA2bits.TX9D=0; //无奇偶校验位
TXSTA2bits.TRMT=0; //Transmit Shift Register Status bit
TXSTA2bits.BRGH=BRGH_VALUE2;
TXSTA2bits.SYNC=0;
TXSTA2bits.TXEN=0;
TXSTA2bits.TX9=0; //发送8位
// TXSTA2bits.CSRC=1;
SPBRG2 = SPBRG2_VALUE;
RCSTA2bits.RX9D=0; //无奇偶校验位
RCSTA2bits.OERR=0;
RCSTA2bits.FERR=0;
RCSTA2bits.ADDEN=0;
RCSTA2bits.CREN=1; //Continuous Receive Enable bit
// RCSTA2bits.SREN=0;
RCSTA2bits.RX9=0; //接收8位
RCSTA2bits.SPEN=1; //Serial Port Enable bit
}
void LoadCMD_AT(void)
{
TranToMS[0] = _A;
TranToMS[1] = _T;
TranToMS[2] = _CR;
}
void LoadCMD_CSCS(void)
{
for(k=0;k<AT_CSCS_SIZE;k++)
{
TranToMS[k] = AT_CSCS_buf[k];
}
}
void LoadCMD_CFUN01(void) //关闭模块的大部分功能,立即执行
{
for(k=0;k<CFUN_SIZE;k++)
{
TranToMS[k] = CFUN01_buf[k];
}
}
void LoadCMD_CIPSPRT(void)
{
for(k=0;k<CIPSPRT_SIZE;k++)
{
TranToMS[k] = Ip_CIPSPRT_buf[k];
}
}
void LoadCMD_CREG(void)
{
for(k=0;k<CREG_SIZE;k++)
{
TranToMS[k] = Ip_CREG_buf[k];
}
}
void LoadCMD_CREGAsk(void)
{
for(k=0;k<CREG_ASK_SIZE;k++)
{
TranToMS[k] = CREG_ASK_buf[k];
}
}
void LoadCMD_CIPLINK(void)
{
for(k=0;k<AT_CDNSORIP_SIZE;k++)
{
TranToMS[k] = AT_IPLINK_buf[k];
}
}
void LoadCMD_CDNSLINK(void)
{
for(k=0;k<AT_CDNSORIP_SIZE;k++)
{
TranToMS[k] = AT_DNSLINK_buf[k];
}
}
void LoadCMD_CCLK(void)
{
for(k=0;k<CCLK_SIZE;k++)
{
TranToMS[k] = Ip_CCLK_buf[k];
}
}
void LoadCMD_CDNSCFG(void)
{
for(k=0;k<AT_CDNSCFG_SIZE;k++)
{
TranToMS[k] = AT_CDNSCFG_buf[k];
}
}
void LoadCMD_CIPDPDP(void)
{
for(k=0;k<L_Cipdpdp;k++)
{
TranToMS[k] = ArrCipdpdp[k];
}
}
void LoadCMD_CPOWD(void)
{
for(k=0;k<L_CPOWD;k++)
{
TranToMS[k] = ArrCPOWD[k];
}
}
void LoadCMD_CIPHEAD(void)
{
for(k=0;k<CIPHEAD_SIZE;k++)
{
TranToMS[k] = Ip_CIPHEAD_buf[k];
}
}
void LoadCMD_CIPSTATUS(void)
{
for(k=0;k<CIPSTATUS_SIZE;k++)
{
TranToMS[k] = AT_CIPSTATUS[k];
}
}
void LoadCMD_ATE0(void)
{
for(k=0;k<ATE0_SIZE;k++)
{
TranToMS[k] = CMD_ATE0[k];
}
}
void LoadCMD_CMGR(void)
{
TranToMS[0] = _A;
TranToMS[1] = _T;
TranToMS[2] = _PLUS;
TranToMS[3] = _C;
TranToMS[4] = _M;
TranToMS[5] = _G;
TranToMS[6] = _R;
TranToMS[7] = _EQUAL;
TranToMS[8] = Index0;
TranToMS[9] = Index1;
if(Index1 == _D)
{
// SMS_Start = 0x09; //如果短信的序号是1位数,则CMGR读出的短信头从020FH开始
CMGR_CMGD_SIZE = 10;
}
else
{
TranToMS[10] = _CR;
CMGR_CMGD_SIZE = 11;
}
}
void LoadCMD_CMGD(void)
{
TranToMS[0] = _A;
TranToMS[1] = _T;
TranToMS[2] = _PLUS;
TranToMS[3] = _C;
TranToMS[4] = _M;
TranToMS[5] = _G;
TranToMS[6] = _D;
TranToMS[7] = _EQUAL;
TranToMS[8] = Index0;
TranToMS[9] = Index1;
if(Index1 == _D)
{
CMGR_CMGD_SIZE = 10;
}
else
{
TranToMS[10] = _CR;
CMGR_CMGD_SIZE = 11;
}
}
void LoadCMD_CMGL(void)
{
TranToMS[0] = _A;
TranToMS[1] = _T;
TranToMS[2] = _PLUS;
TranToMS[3] = _C;
TranToMS[4] = _M;
TranToMS[5] = _G;
TranToMS[6] = _L;
TranToMS[7] = _EQUAL;
TranToMS[8] = _0;
TranToMS[9] = _CR;
}
void LoadCMD_CIPSEND(void)
{
/* AT+CIPSTART只有在IP_INITIAL、IP_CLOSE、IP_STATUS状态下
才可以进行连接的建立,连接建立成功后的状态为CONNECT OK;
连接失败,则处在失败的状态上。
*/
for(k=0;k<CIPSEND_SIZE;k++)
{
TranToMS[k] = Ip_send_buf[k];
}
}
void LoadCMD_CMGS(void)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -