?? main12.c
字號:
T2CON = 0B00000100; //1:1 prescale, 1:1 postscale, TMR2 on
}
void SendToModule(unsigned int num)
{
unsigned int cSendData;
RCSTA2bits.CREN = 0; //連續接收數據禁止
ByteRecvUART2 = 0;
ModulFlags.Bit.EchoModule = 0;
ModulFlags.Bit.RecvEcho = 0;
GPRSComm.Bit.RecvUART2 = 0;
GPRSComm.Bit.RecvGPRS = 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 Proc_0HourData(void)
{
unsigned int address;
unsigned char cnt_meters;
unsigned char PerMeterDataSize;
unsigned char DataStart;
cnt_meters = 32;
PerMeterDataSize = 32;
DataStart = 32;
TranToMS[0] = 0x68;
TranToMS[1] = _T;
TranToMS[2] = _PLUS;
TranToMS[3] = _C;
TranToMS[4] = _I;
TranToMS[5] = _I;
TranToMS[6] = _C;
TranToMS[7] = _R;
TranToMS[8] = _CR;
for (j=0;j<cnt_meters;j++)
{
address = NO1Area + NO1Area*PerMeterDataSize;
SPIRX(address,TranToMS,PerMeterDataSize);
Nop();
SendToModule(PerMeterDataSize);
Nop();
for (k = 0; k < 32; k++) //清除發送區
{
TranToMS[k] = 0;
}
Nop();
}
}
void UploadData(void)
{
//指定CIPSEND要發送的字節長度
LoadCMD_CIPSEND();
ModulFlags.Bit.CMGSSent = 0x01; //等待回車 換行 大于號 空格
WaitReturn = 0;
dLength = ByteReceived;
ByteReceived = 0;
if(dLength>=100)
{
tempArr[0] = dLength / 100; //求百位
temp2 = dLength-(dLength / 100) * 100;
tempArr[1] = temp2 / 10; //求十位
tempArr[2] = temp2-(temp2 / 10) * 10; //求個位
TranToMS[CIPSEND_SIZE] = _EQUAL;
TranToMS[CIPSEND_SIZE + 1] = tempArr[0]+0x30; //轉換成字符
TranToMS[CIPSEND_SIZE + 2] = tempArr[1]+0x30; //轉換成字符
TranToMS[CIPSEND_SIZE + 3] = tempArr[2]+0x30; //轉換成字符
TranToMS[CIPSEND_SIZE + 4] = _CR;
SendToModule (CIPSEND_SIZE + 5);
}
else if(dLength >= 10)
{
tempArr[0] = dLength/10; //求十位
tempArr[1] = dLength-(dLength/10)*10; //求個位
TranToMS[CIPSEND_SIZE] = _EQUAL;
TranToMS[CIPSEND_SIZE + 1] = tempArr[0]+0x30; //轉換成字符
TranToMS[CIPSEND_SIZE + 2] = tempArr[1]+0x30; //轉換成字符
TranToMS[CIPSEND_SIZE + 3] = _CR;
SendToModule (CIPSEND_SIZE + 4);
}
else //dLength<10
{
TranToMS[CIPSEND_SIZE] = _EQUAL;
TranToMS[CIPSEND_SIZE + 1] = dLength + 0x30; //轉換成字符
TranToMS[CIPSEND_SIZE + 2] = _CR;
SendToModule (CIPSEND_SIZE + 3);
}
//等待回傳大于號和空格 0D 0A 3E 20
DelaySeconds(5);
if(ModulFlags.Bit.EchoModule) //GPRS模塊對CIPSENDd的應答
{
for(k=0;k<dLength;k++)
{
TranToMS[k] = BUF_METER[k];
}
WaitReturn = 0;
SendToModule (dLength); //把從電表那收到的回送上傳給主站
DelaySeconds(30); //30秒等send ok
if(ModulFlags.Bit.EchoModule == 1)
{
if(RecvFromMS[0]==0x0D && RecvFromMS[1]==0x0D)
cRet = strncmppgm2ram(((char *)RecvFromMS+1),(const far rom char *)SEND_OK,L_SEND_OK);
else
cRet = strncmppgm2ram((char *)RecvFromMS,(const far rom char *)SEND_OK,L_SEND_OK);
if(cRet == 0) //發送成功
{
//SignalLed = LOW; //打開信號強度燈
ClearMeterREG(); //清除電表標志
ClearGPRSREG();
MinCounter = 0;
for (k = 0; k < 48; k++) //clear module 應答區
{
RecvFromMS[k] = 0;
}
return;
}
}
}
//SignalLed = HIGH; //關閉信號強度燈
Close_Shut();
PowerOffModule();
PowerOnModule();
PWRKeyOn();
Module_Init();
}//END of else:電表回送數據上傳
void SendBeatPack(void)
{
for (k = 0; k < 32; k++) //clear module 應答區
{
RecvFromMS[k] = 0;
}
LoadCMD_CIPSEND();
ModulFlags.Bit.CMGSSent = 0x01; //等待回車 換行 大于號 空格
WaitReturn = 0;
TranToMS[CIPSEND_SIZE] = _EQUAL;
TranToMS[CIPSEND_SIZE+1] = _1;
TranToMS[CIPSEND_SIZE+2] = _CR;
SendToModule(CIPSEND_SIZE+3);
//等待回傳大于號和空格 0D 0A 3E 20
DelaySeconds(5);
if(ModulFlags.Bit.EchoModule) //GPRS模塊對CIPSENDd的應答
{
cRet = strncmppgm2ram((char *)RecvFromMS,(const far rom char *)ERROR,L_ERROR);
if(cRet == 0) //對CIPSEND的應答為ERROR,說明主站已經斷開連接
{
OnlineLed = HIGH; //關閉在線燈
//SignalLed = HIGH; //關閉信號強度燈
OtherFlags.Bit.TCPLink = 0;
Close_Shut();
ClearGPRSREG();
return;
}
TranToMS[0] = _0; //_B;
SendToModule (1); //發送心跳包,就一個字節
DelaySeconds(30); //30秒等send ok
if(ModulFlags.Bit.EchoModule == 1)
{
if(RecvFromMS[0]==0x0D && RecvFromMS[1]==0x0D)
cRet = strncmppgm2ram(((char *)RecvFromMS+1),(const far rom char *)SEND_OK,L_SEND_OK);
else
cRet = strncmppgm2ram((char *)RecvFromMS,(const far rom char *)SEND_OK,L_SEND_OK);
if(cRet == 0) //發送成功
{
// SignalLed = LOW; //打開信號強度燈
ClearGPRSREG();
MinCounter = 0;
for (k = 0; k < 48; k++) //clear module 應答區
{
RecvFromMS[k] = 0;
}
return;
}
}
}
OnlineLed = HIGH; //關閉在線燈
//SignalLed = HIGH; //關閉信號強度燈
OtherFlags.Bit.TCPLink = 0;
Close_Shut();
PowerOffModule();
PowerOnModule();
PWRKeyOn();
Module_Init();
}
void FirstTimeInitial(void)
{
Nop();
// R_eeprom((char *)tempArr,VirginTime,2);
EEADRH = 0x00;
EEADR = 0x08;
EECON1bits.EEPGD = 0; // Point to DATA memory
EECON1bits.CFGS = 0;
EECON1bits.RD = 1;
temp1 = EEDATA;
EEADR++;
EECON1bits.RD = 1;
temp2 = EEDATA;
Nop();
if(temp1 != 0x55 || temp2 != 0xAA)
{//是終端的第一次上電
for (k = 0; k < 16; k++) //清除EEPROM中的要使用的一片區域。
{
RecvFromMS[k] = 0;
}
for (j = 0; j < 8; j++) //清除EEPROM中的前128字節。
{
W_eeprom((char *)RecvFromMS,j*0x10,16);
}
//寫入默認終端號:實際上=00000000
// ------- write a byte to EEPROM ------------------
BT = 0x07;
EEADRH = 0x00;
EEADR = lobyte(BeatTime);
EECON1bits.EEPGD = 0;
EECON1bits.CFGS = 0;
EECON1bits.WREN = 1;
INTCONbits.GIE = 0;
EEDATA = BT;
EECON2 = 0x55;
EECON2 = 0xAA;
EECON1bits.WR = 1;
while (!PIR2bits.EEIF)
;
PIR2bits.EEIF = 0;
EECON1bits.WREN = 0;
INTCONbits.GIE = 1;
//寫入APN默認值:CMNET
/*
RecvFromMS[0] = _X;
RecvFromMS[1] = _M;
RecvFromMS[2] = _D;
RecvFromMS[3] = _L;
RecvFromMS[4] = _DOT;
RecvFromMS[5] = _F;
RecvFromMS[6] = _J;
W_eeprom((char *)RecvFromMS,APNAddr,7);
*/
RecvFromMS[0] = _C;
RecvFromMS[1] = _M;
RecvFromMS[2] = _N;
RecvFromMS[3] = _E;
RecvFromMS[4] = _T;
W_eeprom((char *)RecvFromMS,APNAddr,5);
//寫入默認IP地址:219.232.44.101
RecvFromMS[0] = _2;
RecvFromMS[1] = _1;
RecvFromMS[2] = _9;
RecvFromMS[3] = _DOT;
RecvFromMS[4] = _2;
RecvFromMS[5] = _3;
RecvFromMS[6] = _2;
RecvFromMS[7] = _DOT;
RecvFromMS[8] = _4;
RecvFromMS[9] = _4;
RecvFromMS[0x0A] = _DOT;
RecvFromMS[0x0B] = _1;
RecvFromMS[0x0C] = _0;
RecvFromMS[0x0D] = _1;
W_eeprom((char *)RecvFromMS,IPAddress,14);
//寫入默認端口
RecvFromMS[0] = _2;
RecvFromMS[1] = _0;
RecvFromMS[2] = _0;
RecvFromMS[3] = _5;
W_eeprom((char *)RecvFromMS,PortAddr,4);
//最后寫上已上過電標志
DTU_Number[0] = 0x55;
DTU_Number[1] = 0xAA;
W_eeprom((char *)DTU_Number,VirginTime,2);
}
}
void Module_Init(void)
{
unsigned char count;
ModulFlags.ModuleBYTE = 0 ;
WaitReturn = 0;
/* 在實際應用中,RESET 和ON/~OFF 可由MCU 控制,MCU 通過對ON/~OFF 和RESET 的控制
可以實現模塊的關機,具體程序為:MCU 先發命令(AT+CFUN=0,1),模塊開始注銷網絡登
記,然后使ON/~OFF 信號為反向有效(0FF 有效)200ms,再使RESET 有效(低電平維持100ms 以
上),這樣就可以關掉模塊。模塊關機后的電流為50uA。
*/
LoadCMD_AT();
SendToModule (3);
PassSeconds(5);
ModulFlags.Bit.EchoModule = 0;
ModulFlags.Bit.RecvEcho = 0;
ClearGPRSREG();
MaxTry = 0;
while(1)
{
LoadCMD_AT();
SendToModule (3);
DelaySeconds(5);
if(ModulFlags.Bit.EchoModule == 1)
{
ModulFlags.Bit.EchoModule = 0;
ModulFlags.Bit.RecvEcho = 0;
break;
}//END if(ModulFlags.Bit.EchoModule == 1)
else
{
ClearGPRSREG();
MaxTry++;
if(MaxTry > 1)
{
PowerOnModule();
Nop();
PWRKeyOn();
Nop();
MaxTry = 0;
}
}
}//END
//在這先發ATE0命令,設置為命令無ECHO
Nop();
LoadCMD_ATE0();
SendToModule (ATE0_SIZE);
delay200ms (); //如果只延時20ms,就只能收到回送15個字節
if(ModulFlags.Bit.EchoModule == 1)
{
if(RecvFromMS[2]==_O && RecvFromMS[3]==_K)
{
ModulFlags.Bit.RecvEcho = 0;
}//END if(ModulFlags.Bit.EchoModule == 1)
}
//默認是CMGF=0 PDU模式,再初始化成UCS2編碼
LoadCMD_CSCS();
SendToModule (AT_CSCS_SIZE);
delay200ms ();
if(ModulFlags.Bit.EchoModule == 1)
{
cRet = strncmppgm2ram((char *)RecvFromMS,(const far rom char *)OK,L_OK);
if(cRet == 0)
{
ModulFlags.Bit.EchoModule = 0;
ModulFlags.Bit.RecvEcho = 0;
}//END if(cRet == 0)
PassSeconds(2);
}//END if(ModulFlags.Bit.EchoModule == 1)
LoadCMD_CIPHEAD(); //設at+ciphead=1,遠端發來的數據自動加上報頭 +IPDn
MaxTry = 0;
while(1)
{
ByteRecvUART2 = 0;
SendToModule (CIPHEAD_SIZE);
delay50ms (); //如果只延時20ms,就只能收到回送15個字節
if(ModulFlags.Bit.EchoModule == 1)
{
if(RecvFromMS[2]==_O && RecvFromMS[3]==_K)
{
ClearGPRSREG();
break ;
}//END if(ModulFlags.Bit.EchoModule == 1)
}
MaxTry++;
if(MaxTry > 2)
break;
}//END while(1)
Nop();
ThreeCommand();
Nop();
// ConnectIP(); 不在此處調用,否則會嵌套。
Nop();
}//END Module_Init()
void ThreeCommand(void)
{
WaitReturn = 0;
Read_APN();
SendToModule (temp2);
DelaySeconds(8);
if(ModulFlags.Bit.EchoModule == 1)
{
cRet = strncmppgm2ram((char *)RecvFromMS,(const far rom char *)ERROR,L_ERROR);
if(cRet == 0)
{
Close_Shut();
ClearGPRSREG();
//重發
Read_APN();
SendToModule (temp2);
DelaySeconds(8);
}
else
{
ModulFlags.Bit.EchoModule = 0;
ModulFlags.Bit.RecvEcho = 0;
}
}
else
{
Nop();
//RESET();
//設置無卡標志并閃爍燈而且建立連接前,先調用ThreeCommand進行初始化。
}
PassSeconds(1);
LoadCMD_CIICR();
SendToModule (9);
DelaySeconds(8);
if(ModulFlags.Bit.EchoModule == 1)
{
for(tt=0;tt<3;tt++) //找到第一個68H,定位幀頭
{
if(RecvFromMS[tt] == 0x0A)
break;
}
if(RecvFromMS[tt+1]==_O && (RecvFromMS[tt+2]==_K || RecvFromMS[tt+2]==_H))
{
ModulFlags.Bit.RecvEcho = 0;
ModulFlags.Bit.EchoModule = 0;
}//END if(ModulFlags.Bit.EchoModule == 1)
else
{
Nop();
//RESET();
//設置無卡標志并閃爍燈而且建立連接前,先調用ThreeCommand進行初始化。
}
}
else
{
Nop();
//RESET();
//設置無卡標志并閃爍燈而且建立連接前,先調用ThreeCommand進行初始化。
}
LoadCMD_CIFSR();
WaitReturn = 0;
SendToModule (9);
DelaySeconds(10);
ModulFlags.Bit.EchoModule = 0;
ModulFlags.Bit.RecvEcho = 0;
}
void ClearMeterREG(void)
{
ByteReceived = 0;
MeterComm.Comm1Byte = 0;
RCSTA2bits.FERR = 0;
RCSTA2bits.OERR = 0;
OverTimeMeter = 0;
}
void ClearGPRSREG(void)
{
ByteRecvUART2 = 0;
GPRSComm.Comm2Byte = 0;
WaitReturn = 0;
ReceivedReturn = 0;
OverTimeGPRS = 0;
Length = 0;
ModulFlags.ModuleBYTE = 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++)
{
if(BUFFER_ID == 0)
temp1 = BUF_METER[k];
else if(BUFFER_ID == 1)
temp1 = YC_CMD_BUF[k];
else
temp1 = SMS_CMD_BUF[k];
GenParity(temp1);
if(parity == 1)
TXSTA1bits.TX9D = 1;
else
TXSTA1bits.TX9D = 0;
TXREG1 = temp1;
while(1)
{
if(PIR1bits.TX1IF == 1) break;
}
delay10ms();//字節間延時至少10ms!!!
}
while(1)
{
if(TXSTA1bits.TRMT == 1) break; //最后一個字節也發完
}
// delay10ms(); //江蘇表回送很快,不能加延時
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -