?? gprs003.c
字號:
//=====GPRS MODULE PROGRAM=============
//==FROM 2003.9.=======================
//=======by cfj========================
#include<msp430x12x2.h>
//#include<intrinsics.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
#include<math.h>
#define Uint unsigned int
#define _3NOP() _NOP();_NOP();_NOP();
#define _4NOP() _NOP();_NOP();_NOP();_NOP();
#define _5NOP() _NOP();_NOP();_NOP();_NOP();_NOP();
#define Estart_Addr 0 //0 EEprom起始地址
#define Work_Mode_Addr Estart_Addr+6 //6 工作模式設(shè)置:1字節(jié)
#define MAPN_Addr Work_Mode_Addr+1 //7 移動(dòng)網(wǎng)關(guān)接入點(diǎn)名稱:20字節(jié)ASCII
#define DSC_Ip_Addr MAPN_Addr+20 //27 數(shù)據(jù)服務(wù)中心IP地址:12字節(jié)ASCII
#define DSC_Port_Addr DSC_Ip_Addr+12 //39 數(shù)據(jù)中心端口:5字節(jié)ASCII
#define Net_Protocol_Addr DSC_Port_Addr+5 //44 網(wǎng)絡(luò)數(shù)據(jù)傳輸協(xié)議
#define Terminal_SIM_Addr Net_Protocol_Addr+1 //45 終端SIM
#define Beat_Addr Terminal_SIM_Addr+11 //56 心跳周期地址
#define PassWord_Addr Beat_Addr+1 //57 設(shè)置密碼
#define SCA_SIM_Addr PassWord_Addr+6 //63 短信服務(wù)中心號碼
#define DSC_SIM_Addr SCA_SIM_Addr+11 //74 數(shù)據(jù)中心號碼
#define BackUp_Addr DSC_SIM_Addr+11 //85 備用
#define Set_Crc BackUp_Addr+4 //89 CRC校驗(yàn)碼
#define Estart2_Addr Estart_Addr+100
//******************************************************************
//函數(shù):main()
//功能:主函數(shù)
//輸入?yún)?shù):
//輸出參數(shù):
//===================================================================================================================
//常量定義
//===================================================================================================================
char *AT="AT\r";//AT命令用于檢測GPRS是否存在或開機(jī)。
char AT_Echo[12]={'A','T','E','=','0','V','=','1','&','D','1',0X0D};//命令碼不返回。
//char *AT_Echo="ATE=0V=1&D1\r";//命令碼不返回。
char *AT_O="ATO\r";//從命令狀態(tài)返回到數(shù)據(jù)狀態(tài)。
char *AT_3Plus="+++AT\r";
char *AT_W="AT&W\r"; //保存設(shè)置。
char *AT_ActivateIp="AT*E2IPA=1,1\r";
char OpenIp[11]={'A','T','*','E','2','I','P','O','=','1',',',};
char *AT_CloseIp="AT*E2IPC\r";//關(guān)閉GPRS通道
char *AT_CMGF="AT+CMGF=0\r";//短信PDU MODE
char Terminal_Command[19]={0x68,0x0d,0x0d,0x68,0x4a,0x99,0x99,0x07,0x00,0x0b,0x80,0x30,0x00,0x48,0x4c,0x44,0x57,0x6d,0x16};
char Echo_Array[]={0X2F,0X00,0X07,0XFF,0XFF,0XFD,0XA3,0X03};//設(shè)置正確信號
char Alarm_Switch_Echo[]={0X2F,0X00,0X08,0XFF,0XFF,0XCE,0XEC,0X8F,0X14};
char Data_Switch_Echo[]={0X2F,0X00,0X08,0XFF,0XFF,0XCD,0XEC,0XDA,0X47};
//=================================================================================================================
//函數(shù)定義
//=================================================================================================================
void Port_Initial(void);
void Delay(Uint);
void First_Wr_EEprom(void);
void Variable_Initial(void);
void Turn_On_Gprs(void);
void Turn_Off_Gprs(void);//打開GPRS電源
void USART0_Initial(void);
void USART1_Initial(void);
void Timer_Initial(void);
void Data_Cmnd_Snd(Uint L,char *Temp_Pointer,char Sport,Uint);
void Gprs_At_Command(Uint,char *Pcommand,Uint WTime);
void Rx1Data_Judge_Trasmit(void);
void Rx0Data_Judge_Trasmit(void);
//extern void EWEN_93lc66(void);
extern void Start_93lc66(char Op_Code);
extern char Rd_Data(char Start_Addr,char Data_Len,Uint *Pointer);
extern void Wr_Data(char Start_Addr,char Data_Len,Uint *Pointer);
void Cal_Crc(char *Pointer,Uint L);//計(jì)算返回CRC值。
char Read_Parameters_Initial(char);//從EEPROM中讀取工作參數(shù)、初始化。
void WorkMode_Initial_Log(void);
extern void Construct_PDU_SMS(char UDL,char *User_Data);//構(gòu)造SMS內(nèi)容。
extern void Echo_SMS_Master(char);
void Asci_To_Hex(char *Pointer,Uint);
extern void Echo_Sms_Mobile(void);
void Echo_Rx0(char *Pointer,char Lenth);
extern void Mobile_SMS_Get(char);
extern void Mobile_SMS_Set(char);
extern void Encode7Bit(char);
extern void Decode8Bit(char);
extern char ReturnHex(char);
void Heart_Beat(void);
void Read_Delete_SMS(void);
void Feed_WatchDog(void);
void Gprs_Mode_SMS(Uint);
void Judge_SMS_Counter(void);
void Data_Status(void);
void Connect_Master_Station(void);
extern void Waiting_Result(Uint Wresult_Time);
extern void ZheJiang_Protocol_Down(Uint);
extern void ZheJiang_Protocol_Up(Uint);
void Inqury_Signal(void);
//============================
//全局變量定義
//============================
char VIO;
Uint Tx1_Snd_Lenth,Tx1_Pointer,Rx1_Pointer; //發(fā)送長度、發(fā)送指針、接收指針
Uint Tx0_Snd_Lenth,Tx0_Pointer,Rx0_Pointer; //發(fā)送長度、發(fā)送指針、接收
char *Pointer0,*Pointer1;
char Command_Data_Status;
char Rx1_Start_Flag; //串口接收開始標(biāo)志
Uint Rx1_Time_Counter;//串口接收時(shí)間長度
char Rx1_TimeOut_Flag;//接收超時(shí)標(biāo)志
char Rx0_Start_Flag; //串口接收開始標(biāo)志
char Rx0_Time_Counter;//串口接收時(shí)間長度
char Rx0_TimeOut_Flag;//接收超時(shí)標(biāo)志
Uint Wait_Result_Time;
char Wait_Result_TimeOut;
char Flash_Timer_Len; //CPU正常運(yùn)行指示燈。
char Led1_Flash;
Uint Heart_Beat_Interval;//自動(dòng)檢測IP連接的間隔時(shí)間
char Heart_Beat_Flag; //自動(dòng)檢測標(biāo)志
char nMinute_Beat_Flag;
char Heart_Beat_Time;
char AT_OpenIp0[35];
char Rx1_Data_Buffer[360];//GPRS串口數(shù)據(jù)緩沖區(qū)
char Rx0_Data_Buffer[256];//終端數(shù)據(jù)緩沖區(qū)
char Terminal_SIM[12];//終端手機(jī)號碼。
char Center_SIM[12]; //短信通信手機(jī)號碼。
char Data_Center_Sim[12];//數(shù)據(jù)中心手機(jī)號碼。
char SCA_SIM[4]; //短信服務(wù)中心號碼
Uint Temp_iArray[100];//臨時(shí)緩沖區(qū):整數(shù)
char Temp_cArray[200];//臨時(shí)緩沖區(qū):字符
char SMS_TPDU[300];
char User_Data[140];
char PassWord[6];
char AT_CGDCONT[40];
char AT_Set_Ok;
Uint PDU_Len;
char Retry_Counter;
char AT_Test_Flag;
char IpConnect_Flag;
char Rx1_Led,Tx1_Led;//串口1收發(fā)指示燈
Uint CRC;//CRC校驗(yàn)值。
char Signal_Val;//信號強(qiáng)度
Uint Beat_Rcv_Fail;//心跳未接收到次數(shù)(若連續(xù)發(fā)送三次未收到,則重新連接)
Uint Read_SMS_Time;
char Work_Mode;//模塊工作模式
char TCP_UDP; //網(wǎng)絡(luò)數(shù)據(jù)傳輸協(xié)議。
char Msg_Snd_Flag;
char Tx_Head; //發(fā)送引導(dǎo)頭
char SMS_Mode;
char Terminal_Addr_High;
char Terminal_Addr_Low;
char Read_SMS_Flag;
char SIM_SMS_Flag;
char Received_Read_Msg_Flag;
char DSR;
Uint SMS_Index;//連接失敗次數(shù)。
char Read_Flag;
char Ring_Counter;
char Beat_Rcved_Flag;//心跳接收到標(biāo)志。
char Beat_Test_Start;//心跳測試標(biāo)志。
char Beat_Test_Fail;
Uint Beat_Test_Interval;
char First_Connect_Flag;//上電第一次連接標(biāo)志。
Uint Minute2_Interval;
char Minute2_Interval_Flag;
char Inqury_Signal_Flag;
char Terminal_Request_Flag;
char ii;//清緩沖區(qū)指針。
Uint Second;
Uint Signalmscnt;
char Minute;
char Connect_Counter;
Uint Rx1_Time_Interval;
char extern Msg_Snd_Success;
Uint Tel_Ring_Counter;
char Ring_Start_Flag;
Uint Ring_Time;
char Zj_Protocol_Flag;
char SMS_Counter;
char Load_Master_Flag;
char Heart_Flag;
char No_Carrier_Flag;
//===========================
//主程序
//============================
void main(void)
{
char i;
_3NOP();
//WDTCTL=WDTPW+WDTHOLD;
BCSCTL1|=XT2OFF+XTS; //啟動(dòng)LFTX1 4M高速晶振,關(guān)閉XT2晶振
BCSCTL2|=SELM1+SELM0; //LFTTX1CLK:4M-->MCLK
do
{
IFG1&=~OFIFG;
for(i=0xFF;i>0;i--);
}while((IFG1&OFIFG)!=0);//等待時(shí)鐘源轉(zhuǎn)換完。
P2DIR|=0X08;//P2.0:LED5;P2.1:LED6;p2.2--ring
P2OUT&=0XF7;
P1DIR|=0X10;
P1OUT&=0XEF;
WDTCTL=WDTPW+WDTSSEL;//看門狗開啟。
Delay(20000);
Port_Initial();//初始化P1、P2、P3口等
while(VIO==0X00) //若GPRS尚未開機(jī),則打開GPRS電源
{
Turn_On_Gprs();
VIO=P5IN&0X10; //VIO=P5.4
_3NOP();
}
Variable_Initial();//變量初始化。
Delay(10);
//EWEN_93lc66();//EEPROM擦、寫使能
Rd_Data(254,1,Temp_iArray);//檢測是否為第一次運(yùn)行程序
if(Temp_iArray[0]!=0X555C)
First_Wr_EEprom();//寫入出廠默認(rèn)數(shù)據(jù)
Read_Parameters_Initial(Estart_Addr);
if(Read_Flag==0)//從EEPROM中讀取工作參數(shù)、初始化CPU。
Read_Parameters_Initial(Estart2_Addr);//初始化時(shí),若原始數(shù)據(jù)不對,則從備分區(qū)讀取。
_3NOP();
Read_Delete_SMS();//上電時(shí),讀取刪除短信息。
for(;;)//***主循環(huán)*****
{
_3NOP();
VIO=P5IN&0X10; //VIO=P5.4
WDTCTL=WDTPW+WDTCNTCL;
DSR=P3IN&0X08; //P3.3:顯示系統(tǒng)命令狀態(tài)/數(shù)據(jù)狀態(tài)。
if(DSR!=0) //
{
P1OUT|=0X40;//P1.6: 命令狀態(tài)。
//Load_Master_Flag=0;
}
else
P1OUT&=~0X40;//數(shù)據(jù)狀態(tài)。
if(Rx1_TimeOut_Flag==1)//RX1若接收超時(shí),進(jìn)行判斷。
{
Rx1_TimeOut_Flag=0;
Rx1_Start_Flag=0;
Rx1_Time_Counter=0;
Rx1Data_Judge_Trasmit();//串口1數(shù)據(jù)判斷轉(zhuǎn)發(fā)給終端。
}
if(Rx0_TimeOut_Flag==1)//RX0若接收超時(shí),進(jìn)行判斷。
{
Rx0_TimeOut_Flag=0;
Rx0_Start_Flag=0;
Rx0_Time_Counter=0;
Rx0Data_Judge_Trasmit();//串口0數(shù)據(jù)轉(zhuǎn)發(fā)給主站。
}
if(Command_Data_Status==1)//GPRS連接上,則發(fā)2個(gè)心跳,有關(guān)變量復(fù)位。
{
Data_Status();
}
if((DSR!=0X00)&&(Inqury_Signal_Flag==1))//
{
Inqury_Signal_Flag=0;
Inqury_Signal();
}
if((DSR!=0X00)&&(((Minute+1)%30)==0))//每隔周期檢測是否有新的短信接收到。
{
Minute++;
SIM_SMS_Flag=0;
Read_SMS_Flag=0;
Read_Delete_SMS();
}
if((DSR==0)&&(Heart_Flag==1)&&(Work_Mode==1))//for zhejiang test
{
Heart_Beat();
Heart_Flag=0;
Beat_Test_Start=1;
Beat_Test_Interval=2000;//20秒鐘自動(dòng)檢測心跳
Beat_Test_Fail=0;
Beat_Rcved_Flag=0;
}
if((Work_Mode==1)&&(nMinute_Beat_Flag==1)&&(Heart_Beat_Time!=0)) //每隔?分鐘心跳周期發(fā)送心跳信號。
{
nMinute_Beat_Flag=0;
Heart_Beat();
Beat_Test_Start=1;
Beat_Test_Interval=2000;//20秒鐘自動(dòng)檢測心跳
Beat_Test_Fail=0;
Beat_Rcved_Flag=0;
}
if((Tel_Ring_Counter>=1)||(First_Connect_Flag==1)||(Terminal_Request_Flag==1)||(Beat_Test_Fail==1)||(No_Carrier_Flag==1))
{
if((Work_Mode==1)&&(Heart_Beat_Flag==1))
{
Heart_Beat_Flag=0;
Heart_Beat_Interval=6000;
Connect_Master_Station();
if(Connect_Counter++>=30)
Turn_Off_Gprs();//復(fù)位GPRS
}
}
if(VIO==0)//判斷是否有異常關(guān)機(jī)。
{
_5NOP();_5NOP();
VIO=P5IN&0X10; //確認(rèn) VIO=P5.4
_5NOP();_5NOP();
if(VIO==0)
Turn_On_Gprs();
}
}
}
//=============================================
//函數(shù):Variable_Initial(void)
//功能:有關(guān)變量初始化
//輸入:
//輸出:
//==============================================
void Variable_Initial(void)
{
Signalmscnt=0;
Ring_Counter=0;
Received_Read_Msg_Flag=0;
nMinute_Beat_Flag=0;
Connect_Counter=0;
Command_Data_Status=0;
Beat_Rcv_Fail=2;
First_Connect_Flag=1;//第一次連接標(biāo)志
Inqury_Signal_Flag=0;
Terminal_Request_Flag=0;
Beat_Test_Fail=0;
Beat_Test_Start=0;
Beat_Test_Interval=2000;//心跳等待時(shí)間間隔。
Heart_Beat_Interval=6000;
Second=0;
Minute=0;
Rx1_Time_Interval=4;
Msg_Snd_Flag=0;
Msg_Snd_Success=0;
Tel_Ring_Counter=0;
Ring_Start_Flag=0;
Ring_Time=0;
Zj_Protocol_Flag=1;//浙江規(guī)約
SMS_Counter=0;
Load_Master_Flag=0;
Heart_Flag=0;
No_Carrier_Flag=0;
Signal_Val=13;
}
//==============================================
//函數(shù):Data_Status(void)
//功能:數(shù)據(jù)狀態(tài)時(shí)有關(guān)變量狀態(tài)。
//輸入:
//輸出:
//==============================================
void Data_Status(void)
{
char i;
char CheckSum=0;
char Temp_Load[]={0X68,0X91,0X01,0X07,0X1A,0X1E,0X00,0X68,
0XA1,0X03,0X00,0X11,0X11,0X11,0X00,0X16};
Command_Data_Status=0;
Heart_Beat_Interval=6000;
Ring_Counter=0;
First_Connect_Flag=0;
Beat_Test_Fail=0;
Beat_Test_Start=0;
Minute2_Interval=12000;
Minute2_Interval_Flag=0;
Terminal_Request_Flag=0;
nMinute_Beat_Flag=0;
Connect_Counter=0;
Tel_Ring_Counter=0;
Second=0;
Minute=0;
Heart_Flag=0;
No_Carrier_Flag=0;
if((Work_Mode==0x01)&&(Zj_Protocol_Flag==0))
{
_NOP();
Heart_Beat();
Delay(50);
Heart_Beat();
}
if((Work_Mode==0x01)&&(Zj_Protocol_Flag==1) && (Load_Master_Flag==0))//浙江規(guī)約登陸請求
{
Load_Master_Flag=0;
Delay(50);
for(i=0;i<=15;i++)
{
Temp_cArray[i]=Temp_Load[i];
}
/*
for(i=0;i<=3;i++)//終端地址
{
Temp_cArray[i+1]=((Terminal_SIM[i*2+1]-0x30)<<4)+(Terminal_SIM[i*2]-0x30);
}
*/ // hunter term address
for(i=0;i<=13;i++)//校驗(yàn)和
{
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -