📄 pdu手机采老威胜电量成功 main.c
字号:
}
if(strncmppgm2ram(RecvFromMS,CONNECT_OK,L_CONNECT_OK) == 0)
{
LoadCMD_CIPCLOSE();
WaitReturn = 0;
SendToModule (CIPCLOSE_SIZE);
for(ii=60;ii>0;ii--) //延时3秒
{
if(FrameFlag.Bit.EchoModule == 1)
break;
delay50ms ();
}
ClearCommREG();
} //END of if(strncmppgm2ram(RecvFromMS,CONNECT_OK,L_CONNECT_OK)
else if(strncmppgm2ram(RecvFromMS,IP_CLOSE,L_IP_CLOSE) == 0)
{
Nop();
} //END of else if
else if(strncmppgm2ram(RecvFromMS,IP_INITIAL,L_IP_INITIAL) == 0)
{
Nop();
} //END of else if
else if(strncmppgm2ram(RecvFromMS,IP_STATUS,L_IP_STATUS) == 0)
{
Nop();
} //END of else if
else
{
WaitReturn = 0;
LoadCMD_CIPSHUT();
SendToModule (CIPSHUT_SIZE);
for(ii=60;ii>0;ii--) //延时3秒
{
if(FrameFlag.Bit.EchoModule == 1)
break;
delay50ms ();
}
ClearCommREG();
}
//发出 at+cipstart命令
LoadCipstartBuf();
WaitReturn = 3;
SendToModule (LengthCipstart);
for(ii = 120;ii > 0;ii--) //延时6秒
{
if(FrameFlag.Bit.EchoModule == 1)
break;
delay50ms ();
}
//CIPSTART需要等待3个回车
RevWaitDelay = 0;
while(FrameFlag.Bit.EchoModule == 0) //等待建立TCP链接
{
Nop();
RWDTemp = FourtySeconds;
if(RevWaitDelay > RWDTemp) //等待40秒
{
RevWaitDelay = 0;
SendToModule (LengthCipstart);
}//END if(RevWaitDelay>FourtySeconds)
}//END while(FrameFlag.Bit.EchoModule == 0)
Nop();
if(strncmppgm2ram(RecvFromMS,OK_CONNECT_OK,L_OK_CONNECT_OK) == 0)
{
ClearCommREG();
ModuleSta.Bit.TCPLink = 1;
}
else //if(strncmppgm2ram(RecvFromMS,CONNECTING,L_CONNECTING) == 0)
{
Proc_err();
}
}//END of else if(TP_UDL > 10)
// ErrorMSG();
WaitReturn = 0; //必须加!否则,module主动上报帧会一直等第二个回车
}//END Proc_SMS
void ErrorMSG(void)
{
LoadCMD_CMGD();
WaitReturn = 0;
SendToModule (CMGR_CMGD_SIZE);
delay200ms ();
delay200ms ();
}
//**********************************************************
void LoadCipstartBuf(void)
{
for(k=0;k<18;k++)
{
TranToMS[k] = Ip_start_buf1[k];
}
TranToMS[18] =_YINH;
// for(k=0;k<TP_UDL;k++)
for(k=0;k<LengthIP;k++)
{
TranToMS[k+19] = Ip_start_buf2[k];
}
// TranToMS[TP_UDL+19] =_YINH;
// TranToMS[TP_UDL+20] =_DOUH;
TranToMS[LengthIP+19] =_YINH;
TranToMS[LengthIP+20] =_DOUH;
for(k=0;k<7;k++)
{
// TranToMS[k+TP_UDL+21] = Ip_start_buf3[k];
TranToMS[k+LengthIP+21] = Ip_start_buf3[k];
}
//TranToMS数组数据准备好
ByteRecvUART2 = 0;
TempFlag.Bit.RecvMeter = 0; //!!
LengthCipstart = 18+(LengthIP+3)+7;
}
//**********************************************************
void InitPeriph(void)
{
EN485 = EnReceive;
EN485_CTRL = OUTPUT;
TRIS_TXD2 = OUTPUT;
TRIS_RXD2 = INPUT;
ONOFF = HIGH;
ONOFF_CTRL = OUTPUT;
RSTModule = HIGH;
RSTModule_CTRL = OUTPUT;
}
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.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_CGATT(void)
{
for(k=0;k<CGATT_SIZE;k++)
{
TranToMS[k] = Ip_CGATT_buf[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_CCLK(void)
{
// 读短信,取IP地址
for(k=0;k<CCLK_SIZE;k++)
{
TranToMS[k] = Ip_CCLK_buf[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_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)
{
/* AT+CIPSTART只有在IP_INITIAL、IP_CLOSE、IP_STATUS状态下
才可以进行连接的建立,连接建立成功后的状态为CONNECT OK;
连接失败,则处在失败的状态上。
*/
for(k=0;k<AT_CMGS_SIZE;k++)
{
TranToMS[k] = AT_CMGS_buf[k];
}
}
//给数组装载命令
void LoadCMD_DATA(void)
{
for(k=0;k<CIPDATA_SIZE;k++)
{
TranToMS[k] = TestData[k];
}
}
void LoadCMD_CIPCLOSE(void)
{
for(k=0;k<CIPCLOSE_SIZE;k++)
{
TranToMS[k] = Ip_close_buf[k];
}
}
void LoadCMD_CIPSHUT(void)
{
for(k=0;k<CIPSHUT_SIZE;k++)
{
TranToMS[k] = Ip_shut_buf[k];
}
}
void ConfigInt(void)
{
RCONbits.IPEN = 0;
PIE1bits.RC1IE=1; // USART1 receive interrupt enable
PIE3bits.RC2IE=1; // USART2 receive interrupt enable
PIE1bits.TMR1IE=1;
INTCONbits.PEIE=1; //Peripheral interrupt enable
INTCONbits.GIE=1;
}
void Timer1_setup(void)
{
TMR1H = hibyte(T1DELAY);
TMR1L = lobyte(T1DELAY);
T1CONbits.T1CKPS0 = 1;
T1CONbits.T1CKPS1 = 1; //八分频
T1CONbits.T1OSCEN = 0; //不使用内部振荡
T1CONbits.TMR1CS = 0; //fOSC/4=TCYC
T1CONbits.TMR1ON = 1; //启动TMR1
}
void SendToModule(unsigned int num)
{
unsigned int cSendData;
RCSTA2bits.CREN = 0; //连续接收数据禁止
ByteRecvUART2 = 0;
FrameFlag.Bit.EchoModule = 0;
Flags.Bit.RecvUART2 = 0;
Flags.Bit.RecvEcho = 0;
Flags.Bit.RecvGPRS = 0;
RevWaitDelay = 0;
ReceivedReturn = 0;
TXSTA2bits.TXEN = 1; //发送允许
for(cSendData=0;cSendData<num;cSendData++)
{
TXREG2 = TranToMS[cSendData];
while(1)
{
if(PIR3bits.TX2IF == 1) break;
}
delay4ms();
}//END of for(cSendData=0;cSendData<num;cSendData++)
RCSTA2bits.CREN = 1; //连续接收数据允许
delay4ms();
}
void Module_Init(void)
{
unsigned char count;
FrameFlag.FrameBYTE = 0 ;
/* 在实际应用中,RESET 和ON/~OFF 可由MCU 控制,MCU 通过对ON/~OFF 和RESET 的控制
可以实现模块的关机,具体程序为:MCU 先发命令(AT+CFUN=0,1),模块开始注销网络登
记,然后使ON/~OFF 信号为反向有效(0FF 有效)200ms,再使RESET 有效(低电平维持100ms 以
上),这样就可以关掉模块。模块关机后的电流为50uA。
*/
TempFlag.Bit.f1 = 0;
while(TempFlag.Bit.f1 == 0)
{
Nop();
LoadCMD_AT();
SendToModule (3);
for(count = 40;count>0;count--) //延时2秒
{
delay50ms ();
}
if(FrameFlag.Bit.EchoModule == 1)
{
cRet = strncmppgm2ram(RecvFromMS,OK,L_OK);
if(cRet == 0)
{
FrameFlag.Bit.EchoModule = 0;
Flags.Bit.RecvEcho = 0;
TempFlag.Bit.f1 = 1;
}//END if(cRet == 0)
else
{
for(count = 40;count>0;count--) //延时2秒
{
delay50ms ();
}
}
}//END if(FrameFlag.Bit.EchoModule == 1)
if(TempFlag.Bit.f1 == 1) break;
Nop();
ResetModule();
Nop();
for(count = 70;count>0;count--) //延时14秒
{
delay200ms ();
}
ClearCommREG();
Nop();
}//END while(1)
//在这先发ATE0命令,设置为命令无ECHO
LoadCMD_ATE0();
TempFlag.Bit.f1 = 0;
while(TempFlag.Bit.f1 == 0)
{
SendToModule (ATE0_SIZE);
delay200ms (); //如果只延时20ms,就只能收到回送15个字节
if(FrameFlag.Bit.EchoModule == 1)
{
if(RecvFromMS[2]==_O && RecvFromMS[3]==_K)
{
ModuleSta.Bit.Error = 0;
Flags.Bit.RecvEcho = 0;
TempFlag.Bit.f1 = 1;
}//END if(FrameFlag.Bit.EchoModule == 1)
}
}//END while(TempFlag.Bit.f1 == 0)
//默认是CMGF=0 PDU模式,再初始化成UCS2编码
Nop();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -