📄 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 + -