?? main12.c
字號:
/* **************************************************
3.14 改為透傳
3.15 Line 1583 delay4ms()刪除,加快發(fā)給模塊速度
3.19 powerkey 上電之后延時過短(40s)會導(dǎo)致cipstart不能連接。
不使用透傳,改回成AT命令模式發(fā)送
發(fā)完at+cipsend=xx之后,必須等待大于號的應(yīng)答
加上對send ok 的判斷。
5。29 最新版和小莊帶到廈門的手工版只有在線燈的改變,只在FuntionPin.h中改動了。
6.6 莊添加:目的:實(shí)現(xiàn)信號強(qiáng)度燈指示
1.屏蔽掉所有信號強(qiáng)度燈操作;
2.在proc_min中加讀信號強(qiáng)度;
3.在proc_timeover中加信號強(qiáng)度燈的亮暗設(shè)置
4.在主循環(huán)while(1)之前加信號強(qiáng)度讀取
6.16 刪除SoftDog,移動初上電55AA里的語句
6.19 掌機(jī)設(shè)置終端號的協(xié)議解釋里加了個ConnectIP(),目的:讓后臺原來連接的終端號斷線,讓新設(shè)的終端號上線
6.21 增加采集器對掌機(jī)的485端口檢查命令的應(yīng)答(原來只有紅外)
*/
// GPRS data terminal unit
// MPLAB6.30 + C18 2.40.01
// MPLAB7.10 + C18 2.42
// MPLAB7.50 + C18 3.04
//
#include <p18f6520.h> /* for the special function register declarations */
#include <usart.h>
#include <string.h>
#include <ctype.h>
#include "Parameters.h"
#include "always.h"
#include "delay.h"
#include "FuntionPin.h"
#pragma config CP0 = OFF
#pragma config CP1 = OFF
#pragma config CP2 = OFF
#pragma config CP3 = OFF
#pragma config OSC = HS
#pragma config WDT = OFF //狗打開,分頻比默認(rèn)1:128,最大延時2304ms
#pragma config LVP = OFF
#pragma config DEBUG = ON
#pragma udata mydata2 =0x0200 //初始化了的數(shù)據(jù)放到idata
unsigned char RecvFromMS[240]; //AT+CMGR的回送最長142,再加上port=2020(9x4=36)
unsigned char MeterNumber[6];
unsigned char delayus_variable;
unsigned char WaitReturn; //=0:發(fā)送的是初始化幀,接受到除了起始符外的回車即收到一幀
//=3:發(fā)送的是cipstart,需要接收3個回車,相當(dāng)于兩幀
//=4:發(fā)送的是cmgr,需要接收4個回車,相當(dāng)于3幀
#pragma udata mydata3 =0x0300
//每一個section的空間不能超過256個,利用對數(shù)組的初始化就可以把它定義到別的section。
unsigned char BUF_METER[256]; //只作為從485接口接受數(shù)據(jù)的緩沖區(qū)
#pragma udata mydata4 =0x0400 //短信數(shù)據(jù)
//短信最長140+15=155(還有一個長度字節(jié),則數(shù)組定義為156)
unsigned char SMS_Return[DataLength];
//18F6520:2kRAM,最大到7FFH
#pragma udata mydata5 =0x0500
//接收到的主站命令,提取出來放到此處
unsigned char YC_CMD_BUF[250];
#pragma udata mydata7 =0x0700
unsigned char SMS_CMD_BUF[50]; //接收到的主站命令,提取出來放到此處
//unsigned char APN[16];
#pragma udata access my_access //放入ACCESS BANK
//定義一個數(shù)組存儲發(fā)送數(shù)據(jù)
near unsigned char k,j,tt,cRet,DataAddr,parity;
near unsigned char LengthCipstart,LengthCipsend,LengthBUF2,LengthIPDNS;
near unsigned char dLength,tempArr[3];
near unsigned char SecCounter,MinCounter,temp1,temp2,temp3,temp4,LampDelay,SigQua,bitFL;
near unsigned char SMS_CMD,NOAddr,NOLength;
near unsigned char EnergyDataAddr,UDLAddr,UDLLength,SMS_Start,AllLength;
near unsigned char Date,Hour,Minute,Second,CantLinkMin; //CantLinkMin:不能建立連接一共多少分鐘
near unsigned char MaxTry; //最大嘗試次數(shù),以便從while(1)死循環(huán)中退出
near unsigned char BUFFER_ID,OnLineTime,MetersNum;
near unsigned char IrTX9D,Ir_ByteToSend; //紅外發(fā)送第九位
near volatile unsigned int SoftDog;
near volatile unsigned int T1DELAY;
near volatile unsigned char ReceivedReturn,ByteReceived,ByteRecvUART2;
near volatile unsigned char RevTemp,IPDHead,Length;
near volatile unsigned char CMDLengthLow,CMDLengthHigh;
// !!!!!!!! 滿了!FULL!!!!!!
//********* 位域定義 ***********
near union
{ //用法:if (Flags.Bit.Timeout == 1)
struct
{
// unsigned isIr:1; //是紅外通訊
unsigned aFrame:1; //收到電表回送的一幀
unsigned RecvMeter:1;
unsigned :6;
} Bit;
unsigned char Comm1Byte;
} MeterComm;
near union
{ //用法:if (Flags.Bit.Timeout == 1)
struct
{
unsigned RecvGPRS:1; //收到主站從GPRS信道傳過來的命令
unsigned RecvUART2:1;
unsigned CMD_Frame:1; //收到主站的命令幀
unsigned :5;
} Bit;
unsigned char Comm2Byte;
} GPRSComm;
near union
{
struct
{
unsigned RecvEcho:1; //收到module的應(yīng)答 or 主動上報(bào)的狀態(tài)
unsigned EchoModule:1; //module應(yīng)答完畢
unsigned CMGSSent:1; //是發(fā)送短信
unsigned :5;
} Bit;
unsigned char ModuleBYTE;
} ModulFlags;
near union
{
struct
{
unsigned TimerOver:1;
unsigned TCPLink:1;
unsigned :6;
} Bit;
unsigned char FlagsByte;
} OtherFlags;
#pragma udata my_data1 = 0x0100
unsigned char TranToMS[DataLength];
#pragma udata datatest = 0x0060
unsigned char Text1,Text2,Text3;
unsigned char DepNOLow,DepNOHigh;
unsigned int RWDTemp;
unsigned int OverTimeMeter,OverTimeGPRS;
unsigned int cMinute,t1use,PWRUP55AA;
unsigned long EnergyValue=0,LeftLong=0,MidLong=0;
unsigned long LargeValueHigh=0,LargeValueLow=0;
unsigned char NowPosition;
unsigned char EnergyOfMonth;
unsigned char Ip_start_buf2[MaxDNSIPSize];
unsigned char EnergyData[4],EnergyDataUCS2[36];
unsigned char PortNO[4];
unsigned char LeftedMoney[4];
unsigned char MeterNO[6];
unsigned char TotalE_Addr;
unsigned char SharpE_Addr;
unsigned char PeakE_Addr;
unsigned char DayE_Addr;
unsigned char LowE_Addr;
unsigned char invE_Addr;
unsigned char leftedM_Addr;
unsigned char Address_Length,IndexOfTP_UDL,TP_UDL,IndexOfTP_DCS,TP_DCS,CMGR_CMGD_SIZE;
unsigned char DTU_Number[4],Index0,Index1;
unsigned char TxData,RxData;
unsigned char Link_Mode[2];
unsigned char BT;
// *****************************************************************
//funtion prototype
void INT_Procedure (void); /* prototype needed for 'goto' below */
void LoadCMD_AT(void);
void LoadCMD_CSCS(void);
void LoadCMD_ATE0(void);
void LoadCMD_CIPSPRT(void);
void LoadCMD_CREG(void);
void LoadCMD_CREGAsk(void);
void LoadCMD_CCLK(void);
void LoadCMD_CSQ(void);
void LoadCMD_CNUM(void);
void LoadCMD_CIPHEAD(void);
void LoadCMD_CIPSTATUS(void);
void LoadCipstartBuf(void);
void LoadCMD_ATO(void);
void LoadCMD_CIPSEND(void);
void LoadCMD_CMGS(void);
void LoadCMD_CIPCLOSE(void);
void LoadCMD_CIPSHUT(void);
void LoadCMD_CMGR(void);
void LoadCMD_CMGD(void);
void LoadCMD_CMGL(void);
void LoadCMD_CIICR(void);
void LoadCMD_CIFSR(void);
void ThreeCommand(void);
void ClearMeterREG(void);
void ClearGPRSREG(void);
void GenParity(unsigned char DataWillSend);
void CHECKSUM(void);
void YC_CHECKSUM(void);
void TT_CHECKSUM(void);
void SMS_CHECKSUM(void);
void SendCMDtoMeter(unsigned char num);
void ReturnDataToHander(unsigned char num);
void Proc_SMS(void);
void SMS_Energy(void);
void OK_Data(void);
void SendSMS(void);
void HandleData(unsigned char ei);
void ConvertToUCS2(void);
void TimeDataToUCS2(void);
void ASC2B(void);
void B2ASC(void);
void Load645Header(void);
void ErrorMSG(void);
void Timer1_setup(void);
void PWM_setup(void);
void Proc_TimerOver(void);
void Proc_min(void);
void ConfigInt(void);
void SendBeatPack(void);
void FirstTimeInitial(void);
void Module_Init(void);
void PowerOnModule(void);
void PowerOffModule(void);
void PWRKeyOn(void);
void PWRKeyOff(void);
void SetDateTime(void);
void DTUNO2Str(void);
void ReadTime(void);
void ConvertTime(void);
void ConnectIP(void);
void ReInitial(void);
void Close_Shut(void);
void SendDTUNO(void);
void CMDtoDTU(void);
void W_eeprom(char *pData,unsigned int addr,unsigned char DataLen);
void R_eeprom(char *pData,unsigned int addr,unsigned char Datalen);
void Read_IP(void);
void Read_APN(void);
void HanderCMD(void);
void InitPeriph(void);
//void LedOn(void);
void UART1_setup(void);
void UART2_setup(void);
void SPI_setup(void);
void SPIRX(unsigned int sAddr,unsigned char *DestAddr,unsigned char rCount);
void SPIDX(unsigned char TrData);
void SendToModule(unsigned int num);
void Proc_0HourData(void);
void UploadData(void);
void DelaySeconds(unsigned char cSec);
void PassSeconds(unsigned char PSec);
/* delay10ms is found in an assembly file */
extern void delay4ms (void);
extern void delay10ms (void);
extern void delay20ms (void);
extern void delay50ms (void);
extern void delay200ms (void);
extern void RB0INT (void); //外部中斷:紅外接收
extern void SendByte (void); //紅外單字節(jié)發(fā)送
// ************************************************************************
#pragma code LOW_INTERRUPT_VECTOR = 0x08
void low_ISR (void)
{
_asm
goto INT_Procedure
_endasm
}
#pragma code /* allow the linker to locate the remaining code */
//************* 中斷處理程序 ****************
#pragma interrupt INT_Procedure
void INT_Procedure (void)
{
volatile unsigned char tLength,arr;
if(PIR1bits.TMR1IF == 1) //50ms中斷一次
{
T1CONbits.TMR1ON = 0; //關(guān)閉TMR1
TMR1H = hibyte(T1DELAY);
TMR1L = lobyte(T1DELAY);
T1CONbits.TMR1ON = 1; //啟動TMR1
PIR1bits.TMR1IF = 0;
OtherFlags.Bit.TimerOver = 1;
/*
SoftDog += 1; //50ms增1
if(SoftDog > 2000) //2000 * 50ms =100秒
{
SoftDog = 0x00;
RESET();
}
*/
}//END if(PIR1bits.TMR1IF)
if(INTCONbits.INT0IF == 1) //紅外接收起始位觸發(fā)下降沿中斷
{
RB0INT();
}
// -------------------------------------------------------------
// 在這里處理從電表收到的應(yīng)答。
if(PIR1bits.RC1IF == 1 || INTCONbits.INT0IF == 1) //串口 1 與電表連接,加超時處理
{ //1200bps,8,E
if(PIR1bits.RC1IF == 1)
RevTemp = RCREG1; //讀RCREG1清PIR1bits.RCIF
else
//如果是INTCONbits.INT0IF == 1,RevTemp就已被賦值
INTCONbits.INT0IF = 0;
OverTimeMeter = 0; //清零防止接收超時
//*******************************************************
// BUF_METER[ByteReceived]=RevTemp;
// ByteReceived++;
//*******************************************************
if(MeterComm.Bit.RecvMeter == 0)
{//未收到68H
if(RevTemp == 0x68)
MeterComm.Bit.RecvMeter = 1;
else
return;
}
// 讀出接收到的第9位數(shù)據(jù)
// if(RCSTA1bits.RX9D==1)
// MeterComm.Bit.RX9D_copy=1;
// else
// MeterComm.Bit.RX9D_copy=0;
// 計(jì)算偶校驗(yàn)位,與RX9D_copy比較 ......
// 清除OERR
RCSTA1bits.OERR=0;
if(ByteReceived<=9)
{
switch (ByteReceived)
{
case 0:
case 7:
if(RevTemp==0x68)
{
BUF_METER[ByteReceived]=RevTemp;
ByteReceived++;
}
break;
case 8:
BUF_METER[ByteReceived]=RevTemp;
ByteReceived++;
break;
case 9:
if(RevTemp > DataLength) //大于最大長度
{
ByteReceived = 0;
break;
}
//否則往下執(zhí)行
default:
BUF_METER[ByteReceived]=RevTemp;
ByteReceived++;
break;
}//end switch
}//end if(ByteReceived<=9)
else
{
arr=BUF_METER[9]+11; //DI0,DI1記入長度L
if(ByteReceived == arr)
{
if(RevTemp == 0x16)
{
BUF_METER[ByteReceived] = RevTemp;
MeterComm.Bit.aFrame = 1;
ByteReceived++;
}
else
{
ByteReceived = 0;
MeterComm.Bit.RecvMeter = 0;
}
}
else
{
BUF_METER[ByteReceived]=RevTemp;
ByteReceived++;
}
}
}//END if(PIR1bits.RC1IF == 1 || INTCONbits.INT0IF == 1)
//--------------------------------------------------
if(PIR3bits.RC2IF == 1) //串口 2 與module連接
{ //9600bps,8,N
RevTemp = RCREG2; //讀RCREG2清PIR3bits.RCIF
OverTimeGPRS = 0;
if(ByteRecvUART2>250)
ByteRecvUART2 = 0;
if(GPRSComm.Bit.RecvUART2 == 0x00)
{ //未收到起始符:0D 或 +
if(RevTemp == _CR)
{
ModulFlags.Bit.RecvEcho = 1 ;
GPRSComm.Bit.RecvUART2 = 1;
RecvFromMS[ByteRecvUART2]=RevTemp;
ByteRecvUART2++;
}
else if(RevTemp == _PLUS) //+:遠(yuǎn)端(主站)發(fā)來的命令前導(dǎo)符
{
GPRSComm.Bit.RecvGPRS = 1 ;
GPRSComm.Bit.RecvUART2 = 1;
RecvFromMS[ByteRecvUART2]=RevTemp;
ByteRecvUART2++;
}
else
return;
}
else //已收到起始符:0D 或 +
{
RecvFromMS[ByteRecvUART2]=RevTemp;
ByteRecvUART2++;
if(ModulFlags.Bit.RecvEcho == 0x01)
{
if(ModulFlags.Bit.CMGSSent == 0x01) //發(fā)送短信
{
if(RevTemp == _SPACE)
ModulFlags.Bit.EchoModule = 1;
}
if(RevTemp == _CR)
{
if(WaitReturn == 0x03)
{
ReceivedReturn++;
if(ReceivedReturn == 0x03)
{
ModulFlags.Bit.EchoModule = 1 ;
ReceivedReturn = 0;
}
}
else if(WaitReturn == 0x04)
{
ReceivedReturn++;
if(ReceivedReturn == 0x04)
{
ModulFlags.Bit.EchoModule = 1 ;
ReceivedReturn = 0;
}
}
else ModulFlags.Bit.EchoModule = 1 ; //WaitReturn = 2的情況在這處理
}
}//END of if(Flags.Bit.RecvEcho == 1)
//=+:遠(yuǎn)端(主站)數(shù)據(jù)
if(GPRSComm.Bit.RecvGPRS == 0x01)
{
//從前導(dǎo)+IPDxx:_SPACE取出xx
if(RevTemp == _COLON && ByteRecvUART2 >4 && ByteRecvUART2 <8)
//收到:后就可以取出長度
{
CMDLengthLow = RecvFromMS[ByteRecvUART2-2];
CMDLengthLow -= 0x30; //字符轉(zhuǎn)成數(shù)字
if(RecvFromMS[ByteRecvUART2-3] == _D) // || RecvFromMS[ByteRecvUART2-2] == _d)
{
Length = CMDLengthLow;
}
else
{
CMDLengthHigh = RecvFromMS[ByteRecvUART2-3];
CMDLengthHigh -= 0x30;
tLength = CMDLengthHigh;
//轉(zhuǎn)換成10進(jìn)制:Length = CMDLengthHigh*10+CMDLengthLow
Length = tLength <<3;
Length = Length + CMDLengthHigh + CMDLengthHigh + CMDLengthLow;
}
IPDHead = ByteRecvUART2;
}//BED of if(RevTemp == _COLON && ByteRecvUART2 >4 && ByteRecvUART2 <8)
if(ByteRecvUART2 == IPDHead + Length)//+IPDxx:FE.. 68 NO 68 CMD L CHECKSUM 16
{
GPRSComm.Bit.CMD_Frame = 1;
//SignalLed = HIGH; //關(guān)閉信號強(qiáng)度燈
}
}//END of if(Flags.Bit.RecvGPRS == 1)
}//END of else
}//END if(PIR3bits.RCIF)
}//END void INT_Procedure (void)
void Load_SigQua(void) //信號強(qiáng)度讀?。呵f
{
LoadCMD_CSQ();
SendToModule (CSQ_SIZE);
DelaySeconds(2);
temp4=((RecvFromMS[8]-0x30)*10+(RecvFromMS[9]-0x30))/7;
if(ModulFlags.Bit.EchoModule == 1)
{
if(temp4!=SigQua)
{
SigQua=temp4;
LampDelay=0;
if(SigQua==0)
{
bitFL=1; //從暗開始
SignalLed=CLOSE;
}
else
{
bitFL=0;
SignalLed=LIGHT;
}
}
}
else
{
SigQua=0; //GPRS模塊未響應(yīng)時燈暗
SignalLed=CLOSE;
}
ModulFlags.Bit.EchoModule = 0 ;
ByteRecvUART2 = 0;
}
void main (void)
{
unsigned char *p;
near unsigned int ClearNum;
temp4=0; //增加信號強(qiáng)度部分 :莊
SigQua=0;
LampDelay=0;
bitFL=1;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -