?? 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 工作模式設置:1字節
#define MAPN_Addr Work_Mode_Addr+1 //7 移動網關接入點名稱:20字節ASCII
#define DSC_Ip_Addr MAPN_Addr+20 //27 數據服務中心IP地址:12字節ASCII
#define DSC_Port_Addr DSC_Ip_Addr+12 //39 數據中心端口:5字節ASCII
#define Net_Protocol_Addr DSC_Port_Addr+5 //44 網絡數據傳輸協議
#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 設置密碼
#define SCA_SIM_Addr PassWord_Addr+6 //63 短信服務中心號碼
#define DSC_SIM_Addr SCA_SIM_Addr+11 //74 數據中心號碼
#define BackUp_Addr DSC_SIM_Addr+11 //85 備用
#define Set_Crc BackUp_Addr+4 //89 CRC校驗碼
#define Estart2_Addr Estart_Addr+100
//******************************************************************
//函數:main()
//功能:主函數
//輸入參數:
//輸出參數:
//===================================================================================================================
//常量定義
//===================================================================================================================
char *AT="AT\r";//AT命令用于檢測GPRS是否存在或開機。
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";//從命令狀態返回到數據狀態。
char *AT_3Plus="+++AT\r";
char *AT_W="AT&W\r"; //保存設置。
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";//關閉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};//設置正確信號
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};
//=================================================================================================================
//函數定義
//=================================================================================================================
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);//計算返回CRC值。
char Read_Parameters_Initial(char);//從EEPROM中讀取工作參數、初始化。
void WorkMode_Initial_Log(void);
extern void Construct_PDU_SMS(char UDL,char *User_Data);//構造SMS內容。
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; //發送長度、發送指針、接收指針
Uint Tx0_Snd_Lenth,Tx0_Pointer,Rx0_Pointer; //發送長度、發送指針、接收
char *Pointer0,*Pointer1;
char Command_Data_Status;
char Rx1_Start_Flag; //串口接收開始標志
Uint Rx1_Time_Counter;//串口接收時間長度
char Rx1_TimeOut_Flag;//接收超時標志
char Rx0_Start_Flag; //串口接收開始標志
char Rx0_Time_Counter;//串口接收時間長度
char Rx0_TimeOut_Flag;//接收超時標志
Uint Wait_Result_Time;
char Wait_Result_TimeOut;
char Flash_Timer_Len; //CPU正常運行指示燈。
char Led1_Flash;
Uint Heart_Beat_Interval;//自動檢測IP連接的間隔時間
char Heart_Beat_Flag; //自動檢測標志
char nMinute_Beat_Flag;
char Heart_Beat_Time;
char AT_OpenIp0[35];
char Rx1_Data_Buffer[360];//GPRS串口數據緩沖區
char Rx0_Data_Buffer[256];//終端數據緩沖區
char Terminal_SIM[12];//終端手機號碼。
char Center_SIM[12]; //短信通信手機號碼。
char Data_Center_Sim[12];//數據中心手機號碼。
char SCA_SIM[4]; //短信服務中心號碼
Uint Temp_iArray[100];//臨時緩沖區:整數
char Temp_cArray[200];//臨時緩沖區:字符
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收發指示燈
Uint CRC;//CRC校驗值。
char Signal_Val;//信號強度
Uint Beat_Rcv_Fail;//心跳未接收到次數(若連續發送三次未收到,則重新連接)
Uint Read_SMS_Time;
char Work_Mode;//模塊工作模式
char TCP_UDP; //網絡數據傳輸協議。
char Msg_Snd_Flag;
char Tx_Head; //發送引導頭
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;//連接失敗次數。
char Read_Flag;
char Ring_Counter;
char Beat_Rcved_Flag;//心跳接收到標志。
char Beat_Test_Start;//心跳測試標志。
char Beat_Test_Fail;
Uint Beat_Test_Interval;
char First_Connect_Flag;//上電第一次連接標志。
Uint Minute2_Interval;
char Minute2_Interval_Flag;
char Inqury_Signal_Flag;
char Terminal_Request_Flag;
char ii;//清緩沖區指針。
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; //啟動LFTX1 4M高速晶振,關閉XT2晶振
BCSCTL2|=SELM1+SELM0; //LFTTX1CLK:4M-->MCLK
do
{
IFG1&=~OFIFG;
for(i=0xFF;i>0;i--);
}while((IFG1&OFIFG)!=0);//等待時鐘源轉換完。
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尚未開機,則打開GPRS電源
{
Turn_On_Gprs();
VIO=P5IN&0X10; //VIO=P5.4
_3NOP();
}
Variable_Initial();//變量初始化。
Delay(10);
//EWEN_93lc66();//EEPROM擦、寫使能
Rd_Data(254,1,Temp_iArray);//檢測是否為第一次運行程序
if(Temp_iArray[0]!=0X555C)
First_Wr_EEprom();//寫入出廠默認數據
Read_Parameters_Initial(Estart_Addr);
if(Read_Flag==0)//從EEPROM中讀取工作參數、初始化CPU。
Read_Parameters_Initial(Estart2_Addr);//初始化時,若原始數據不對,則從備分區讀取。
_3NOP();
Read_Delete_SMS();//上電時,讀取刪除短信息。
for(;;)//***主循環*****
{
_3NOP();
VIO=P5IN&0X10; //VIO=P5.4
WDTCTL=WDTPW+WDTCNTCL;
DSR=P3IN&0X08; //P3.3:顯示系統命令狀態/數據狀態。
if(DSR!=0) //
{
P1OUT|=0X40;//P1.6: 命令狀態。
//Load_Master_Flag=0;
}
else
P1OUT&=~0X40;//數據狀態。
if(Rx1_TimeOut_Flag==1)//RX1若接收超時,進行判斷。
{
Rx1_TimeOut_Flag=0;
Rx1_Start_Flag=0;
Rx1_Time_Counter=0;
Rx1Data_Judge_Trasmit();//串口1數據判斷轉發給終端。
}
if(Rx0_TimeOut_Flag==1)//RX0若接收超時,進行判斷。
{
Rx0_TimeOut_Flag=0;
Rx0_Start_Flag=0;
Rx0_Time_Counter=0;
Rx0Data_Judge_Trasmit();//串口0數據轉發給主站。
}
if(Command_Data_Status==1)//GPRS連接上,則發2個心跳,有關變量復位。
{
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秒鐘自動檢測心跳
Beat_Test_Fail=0;
Beat_Rcved_Flag=0;
}
if((Work_Mode==1)&&(nMinute_Beat_Flag==1)&&(Heart_Beat_Time!=0)) //每隔?分鐘心跳周期發送心跳信號。
{
nMinute_Beat_Flag=0;
Heart_Beat();
Beat_Test_Start=1;
Beat_Test_Interval=2000;//20秒鐘自動檢測心跳
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();//復位GPRS
}
}
if(VIO==0)//判斷是否有異常關機。
{
_5NOP();_5NOP();
VIO=P5IN&0X10; //確認 VIO=P5.4
_5NOP();_5NOP();
if(VIO==0)
Turn_On_Gprs();
}
}
}
//=============================================
//函數:Variable_Initial(void)
//功能:有關變量初始化
//輸入:
//輸出:
//==============================================
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;//第一次連接標志
Inqury_Signal_Flag=0;
Terminal_Request_Flag=0;
Beat_Test_Fail=0;
Beat_Test_Start=0;
Beat_Test_Interval=2000;//心跳等待時間間隔。
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;//浙江規約
SMS_Counter=0;
Load_Master_Flag=0;
Heart_Flag=0;
No_Carrier_Flag=0;
Signal_Val=13;
}
//==============================================
//函數:Data_Status(void)
//功能:數據狀態時有關變量狀態。
//輸入:
//輸出:
//==============================================
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))//浙江規約登陸請求
{
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++)//校驗和
{
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -