📄 pdu手机采老威胜电量成功 main.c
字号:
LoadCMD_CSCS();
TempFlag.Bit.f1 = 0;
while(TempFlag.Bit.f1 == 0)
{
SendToModule (AT_CSCS_SIZE);
delay200ms ();
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)
Nop();
}
/*at+cgatt?: 检查DTU有没有登陆(附着attach)GPRS网络
如返回的是1则表示进入GPRS 网络,如返回的是0 则表示还未登入GPRS 网络。
*/
LoadCMD_CGATT();
TempFlag.Bit.f1 = 0;
// while(TempFlag.Bit.f1 == 0)
// {
ByteRecvUART2 = 0;
SendToModule (CGATT_SIZE);
delay200ms ();
/*
if(FrameFlag.Bit.EchoModule == 1)
{
cRet = strncmppgm2ram(RecvFromMS,PLUSCGATT,L_PLUSCGATT);
if(cRet == 0)
{
FrameFlag.Bit.EchoModule = 0;
Flags.Bit.RecvEcho = 0;
break ;
}//END if(FrameFlag.Bit.EchoModule == 1)
ONOFF = 0 ; //power down
for(count = 20;count>0;count--) //延时1秒
{
delay50ms ();
}
ONOFF = 1 ; //power on
for(count = 200;count>0;count--) //延时10秒
{
delay50ms ();
}
}
*/
// }//END while(1)
LoadCMD_CIPSPRT(); //设at+cipsprt=0 之后,发完cipsend后,不需大于号和空格
while(1)
{
SendToModule (CIPSPRT_SIZE);
delay50ms (); //如果只延时20ms,就只能收到回送15个字节
if(FrameFlag.Bit.EchoModule == 1)
{
if(RecvFromMS[2]==_O && RecvFromMS[3]==_K)
{
FrameFlag.Bit.EchoModule = 0;
Flags.Bit.RecvEcho = 0;
break ;
}//END if(FrameFlag.Bit.EchoModule == 1)
}
}//END while(1)
LoadCMD_CIPHEAD(); //设at+ciphead=1,远端发来的数据自动加上报头 +IPDn
while(1)
{
ByteRecvUART2 = 0;
SendToModule (CIPHEAD_SIZE);
delay50ms (); //如果只延时20ms,就只能收到回送15个字节
if(FrameFlag.Bit.EchoModule == 1)
{
if(RecvFromMS[2]==_O && RecvFromMS[3]==_K)
{
ClearCommREG();
break ;
}//END if(FrameFlag.Bit.EchoModule == 1)
}
}//END while(1)
//亮正确的灯。。。
//如果IP 地址已置,则直接建立TCP链接
///////////////////////////////////////////////////////////
// Nop();
// if(IPAddressSeted == 0x33CC)
// ReLink();
///////////////////////////////////////////////////////////
}//END Module_Init()
void ClearCommREG(void)
{
ByteReceived = 0;
ByteRecvUART2 = 0;
FrameFlag.FrameBYTE = 0;
WaitReturn = 0;
ReceivedReturn = 0;
IPDHead = 0;
Length = 0;
Flags.fCOMM = 0;
RCSTA2bits.FERR = 0;
RCSTA2bits.OERR = 0;
}
void SendCMDtoMeter(unsigned char num)
{
EN485 = EnTransport;
delay20ms();
PIE1bits.TMR1IE = 0; //关闭定时中断
TXSTA1bits.TXEN = 1; //*发送允许
RCSTA1bits.CREN = 0; //禁止接收
PIR1bits.TX1IF = 0;
for(k = 0;k < num;k++)
{
GenParity(BUF_METER[k]);
if(parity == 1)
TXSTA1bits.TX9D = 1;
else
TXSTA1bits.TX9D = 0;
TXREG1 = BUF_METER[k];
while(1)
{
if(PIR1bits.TX1IF == 1) break;
}
delay10ms();//字节间延时至少10ms!!!
}
while(1)
{
if(TXSTA1bits.TRMT == 1) break; //最后一个字节也发完
}
// delay10ms(); //江苏表回送很快,不能加延时
// delay4ms();
EN485 = EnReceive;
TXSTA1bits.TXEN = 0; //发送禁止
RCSTA1bits.CREN = 1; //接收数据允许
RCSTA1bits.FERR = 0;
PIE1bits.TMR1IE = 1; //打开定时中断
}
void GenParity(unsigned char DataWillSend)
{
unsigned char gp,tt;
gp = DataWillSend;
parity = 0;
tt = gp & 0x01;
if(tt != 0)
parity ^=0x01;
tt = gp & 0x02;
if(tt != 0)
parity ^=0x01;
tt = gp & 0x04;
if(tt != 0)
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 PowerDownModule(void)
{
/*
LoadCMD_CFUN01(); //关闭模块的大部分功能,立即执行
ByteRecvUART2 = 0;
SendToModule (CFUN_SIZE);
delay200ms();
*/
ONOFF = 0 ; //power down
delay200ms();
RSTModule = 0 ; //复位信号低电平有效,低电平脉冲宽度应不小于100mS
delay200ms();
RSTModule = 1;
delay200ms();
for(k = 60;k > 0;k--) //延时3秒
{
delay50ms ();
}
ClearCommREG();
}
void PowerOnModule(void)
{
ONOFF = 1 ; //power on
delay200ms();
for(k = 60;k > 0;k--) //延时3秒
{
delay50ms ();
}
ClearCommREG();
}
void ResetModule(void)
{
/* 怎么将 modem 复位?
软件:通过使用指令 AT+CFUN=0,然后,再输入 AT+CFUN=1
硬件:将 reset 脚接地,至少300 毫秒。平时不用的时候,将它空置。
*/
RSTModule = 0; //复位信号低电平有效,低电平脉冲宽度应不小于100mS
delay200ms ();
delay200ms ();
RSTModule = 1;
}
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 ReLink(void)
{
// while(1) //若server的TCP服务未启动,则while循环导致死机
// {
ResetModule();
for(k = 10;k>0;k--) //延时2秒
{
delay200ms ();
}
ClearCommREG();
////重新初始化,因Reset 之后,CGATT、CIPHEAD等设置可能被改变
Module_Init();
////
ReadDynamicIP();
LoadCipstartBuf();
WaitReturn = 3;
SendToModule (LengthCipstart); //发出 at+cipstart命令
for(k = 240;k>0;k--) //延时12秒
{
if(FrameFlag.Bit.EchoModule == 1)
break;
delay50ms ();
}
if(FrameFlag.Bit.EchoModule == 1) //等待建立TCP链接
{
cRet = strncmppgm2ram(RecvFromMS,OK_CONNECT_OK,L_OK_CONNECT_OK);
Nop();
if(cRet == 0)
{
ClearCommREG();
ModuleSta.Bit.TCPLink = 1;
// break;
}
}
delay50ms();
// }//END of while(1)
WaitReturn = 0;
}
void Proc_err(void)
{
/* 连接未建立或已被断开, 返回 ERROR
如果数据发送成功, 返回 SEND OK
如果数据发送失败, 返回 SEND FAIL
*/
if(strncmppgm2ram(RecvFromMS,ERROR,L_ERROR) == 0)
{//server软件未启动TCP服务
ReLink();
}//END of if(strncmppgm2ram(RecvFromMS,ERROR,L_ERROR) == 0)
else if(strncmppgm2ram(RecvFromMS,CLOSED,L_CLOSED) == 0)
{//主站server主动断开链接/server软件异常退出
ReLink();
}
else if(strncmppgm2ram(RecvFromMS,SEND_FAIL,L_SEND_FAIL) == 0)
{//发送失败,可能尚未建立连接
ResetModule();
for(k = 70;k>0;k--) //延时14秒
{
delay200ms ();
}
ClearCommREG();
////重新初始化,因Reset 之后,CGATT、CIPHEAD等设置可能被改变
Module_Init();
////
}
else if(strncmppgm2ram(RecvFromMS,PLUSSCKS0,L_PLUSSCKS0) == 0)
{//+SCKS:0错,没放sim卡?
ResetModule();
for(k = 70;k>0;k--) //延时14秒
{
if(FrameFlag.Bit.EchoModule == 1)
break;
delay200ms ();
}
ClearCommREG();
Module_Init();
ReadDynamicIP();
LoadCipstartBuf();
WaitReturn = 3;
SendToModule (LengthCipstart); //发出 at+cipstart命令
for(k = 240;k>0;k--) //延时12秒
{
if(FrameFlag.Bit.EchoModule == 1)
break;
delay50ms ();
}
}
}
void Proc_TimerOver(void)
{
near unsigned int tOT1;
TimeFlag.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)
{
ClearCommREG();
OverTimeMeter = 0;
TempFlag.Bit.RecvMeter = 0;
}
}
if(ByteRecvUART2 >0)
{
OverTimeGPRS++;
tOT1 = FiveSeconds; //等待FiveSeconds秒
if(OverTimeGPRS >= tOT1)
{
ClearCommREG();
OverTimeGPRS = 0;
}
}
}
void Proc_min(void)
{
//读出时间日期 --------------------------------
//// LoadCMD_CCLK();
// ByteRecvUART2 = 0;
// SendToModule (CCLK_SIZE);
//---------------------------------------------
MinCounter++;
if(ModuleSta.Bit.LinkClosed == 1)
{
ReadDynamicIP();
LoadCipstartBuf();
WaitReturn = 3; //CIPSTART需要等待3个回车
SendToModule (LengthCipstart);
for(k=240;k>0;k--) //延时12秒
{
if(FrameFlag.Bit.EchoModule == 1) break;
delay50ms ();
}
if(FrameFlag.Bit.EchoModule == 1) //等待建立TCP链接
{
cRet = strncmppgm2ram(RecvFromMS,OK_CONNECT_OK,L_OK_CONNECT_OK);
if(cRet == 0)
{
ClearCommREG();
ModuleSta.Bit.LinkClosed = 0;
ModuleSta.Bit.TCPLink = 1;
}
}//END if
}
if(MinCounter >= HeartBeatT)
{
MinCounter = 0;
if(ModuleSta.Bit.TCPLink == 1)
{
LoadCMD_CIPSEND();
TranToMS[CIPSEND_SIZE] = _EQUAL;
TranToMS[CIPSEND_SIZE+1] = _1;
TranToMS[CIPSEND_SIZE+2] = _CR;
SendToModule(CIPSEND_SIZE+3);
delay10ms(); //避免双方冲突
delay10ms();
TranToMS[0] = _0; ////_B;
SendToModule (1); //发送心跳包,就一个字节
while(FrameFlag.Bit.EchoModule == 0) //等待返回SEND OK
{
Nop();
if(RevWaitDelay>FiveSeconds) //等待20*0.25s=5秒
{
RevWaitDelay = 0;
break;
}//END if(RevWaitDelay>FiveSeconds)
}//END while(FrameFlag.Bit.EchoModule == 0)
Nop();
cRet = strncmppgm2ram(RecvFromMS,SEND_OK,L_SEND_OK);
if(cRet == 0)
{
for (k = 0; k < 32; k++)
{
RecvFromMS[k] = 0;
return;
}
}
else
{
ModuleSta.Bit.TCPLink = 0;
Proc_err();
}
}//END of if(ModuleSta.Bit.TCPLink == 1)
else if(IPAddressSeted == 0x33CC)
{
ReLink();
}
}//END of if(MinCounter>=20)
}
void ReadDynamicIP(void)
{
//test eeprom read
EEADRH = 0;
EEADR = IPAddress;
EECON1bits.EEPGD = 0; // Point to DATA memory
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -