⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 check_gsm.c

📁 车载GPS监控终端的完整代码,与监控中心的通讯采用GPRS.
💻 C
📖 第 1 页 / 共 5 页
字号:

/********************************************************\
*	文件名:  Check_GSM.C
*	创建时间:2004年12月7日
*	创建人:  
*	版本号:  1.00
*	功能:
*	文件属性:特殊文件
*	修改历史:(每条详述)
\********************************************************/
#include <msp430x14x.h>
#include "Uart01.h"
#include "General.h"
#include "Define_Bit.h"
#include "Sub_C.h"
#include "M22_AT.h"
#include "Check_GSM.h"
#include "W_Protocol.h"
#include "SPI45DB041.h"
#include "D_Buffer.h"
#include "Other_Define.h"
#include "TA_Uart.h"
#include "Handle_Protocol.h"
#include "Disp_Protocol.h"
#include "Do_Handle.h"
#include "Do_SRAM.h"
/*
#include "Main_Init.h"
#include "Do_Reset.h"
#include "Do_GSM.h"
#include "Msp430_Flash.h"
*/
#define Debug_GSM_COM1
void Do_SMS_Receive(unsigned int iLength,unsigned char iRLength);
void Do_GPRS_Receive(void);
void Deal_Command(void);
unsigned char Check_Command(void);
void IP_SOCKET_Switch(void);
void Do_Parameter_Set(void);
void Position_Echo(void);
void Pass_Data_Echo(void);
void Set_Cycle_Timer(void);
void Disp_Dispaly_Info(void);
void Set_TCP_OnOrOff(void);
void Query_SYS_Ver(void);
void Deal_Alarm_Echo(void);
void Deal_Vehicle_Monitor(void);

void Set_Phone_Limit(void);

void Set_Area_Limit(void);
void Send_RecordData(void);
void Set_Distance_Par(void);
void Set_Phone_Num(void);
void Watch_Way(void);
void Line_Data_Deal(void);
//unsigned char Do_Deal_Area(unsigned char Add_Flash,unsigned char Add_Buffer );

/********************************************************\
*	函数名:Check_GSM
	作用域:外部文件调用
*	功能:	判断处理GSM接收缓冲gReceive0_GSM_Buffer中的数据,如果判断有0x0d,0x0a表示有
			一包GSM数据返回。将这一包数据转移到处理缓冲gGeneral_Buffer中进行处理

*	参数:  全局变量:GSM的接收缓冲gReceive0_GSM_Buffer[],指针gReceive0_GSM_Buffer_Move
					  gReceive0_GSM_Buffer_Point。
					  数据处理缓冲gGeneral_Buffer[]

*	返回值:0:表示对GSM数据接收缓冲未做任何处理
			1:表示转移一包数据,并处理完成
			其中在返回的过程中,有写特殊的出口处理,需要对一些全局变量进行操作。具体见具体详细描叙

*	创建人:
*
*	修改历史:(每条详述)
\********************************************************/
unsigned int Check_GSM(void)
{
	unsigned int i,j,k;
	for(k=0;k<sizeof(gGeneral_Buffer);k++)	gGeneral_Buffer[k]=0;
	i = 0;
	j = gReceive0_GSM_Buffer_Move;
	if( gReceive0_GSM_Buffer_Point == gReceive0_GSM_Buffer_Move ) return(0);
	gGeneral_Buffer[i] = gReceive0_GSM_Buffer[j];
	i++;j++;
	if( j >= sizeof(gReceive0_GSM_Buffer) ) j=0;
	while(j!=gReceive0_GSM_Buffer_Point)
	{
		gGeneral_Buffer[i] = gReceive0_GSM_Buffer[j];
		i++;j++;
		if( i >= sizeof(gGeneral_Buffer) )
		{
//			Send_COM1_String((unsigned char *)R_OVERTOP,sizeof(R_OVERTOP));
			for(i=0;i<sizeof(gGeneral_Buffer);i++) 	 	gGeneral_Buffer[i]=0;
			for(i=0;i<sizeof(gReceive0_GSM_Buffer);i++)	gReceive0_GSM_Buffer[i]=0;
			gReceive0_GSM_Buffer_End=sizeof(gReceive0_GSM_Buffer)-1;
			gReceive0_GSM_Buffer_Point=0;
			gReceive0_GSM_Buffer_Move=0;
			return(0);
		}
		if( j >= sizeof(gReceive0_GSM_Buffer) )  	j=0;

		/********************************************************\
		\********************************************************/
		//判断有发送SMS的符号+++++++++++++++++++++++++++++++++++
		if( (gGeneral_Buffer[i-1]==' ')&&(gGeneral_Buffer[i-2]=='>') )
		{
			#ifdef Debug_GSM_COM1
			Send_COM1_String(gGeneral_Buffer,i);
			#endif
			gReceive0_GSM_Buffer_Move=j;				//表示一包有效帧数据处理完
			if(j==0) gReceive0_GSM_Buffer_End=sizeof(gReceive0_GSM_Buffer)-1;
			else     gReceive0_GSM_Buffer_End=j-1;
			return(1);
		}
		//判断有一包有效帧数据++++++++++++++++++++++++++++++++++++
		else if( (gGeneral_Buffer[i-1]==0x0a)&&(gGeneral_Buffer[i-2]==0x0d) )
		{
			#ifdef Debug_GSM_COM1
			Send_COM1_String(gGeneral_Buffer,i);
			#endif
			gReceive0_GSM_Buffer_Move=j;				//表示一包有效帧数据处理完
			if(j==0) gReceive0_GSM_Buffer_End=sizeof(gReceive0_GSM_Buffer)-1;
			else     gReceive0_GSM_Buffer_End=j-1;

			//*下面则是一个返回数据包在缓冲General_Buffer[]中,数据包的长度为i
			/********************************************************\
			1,判断是否有电话打入方面的处理:
			RING

			+CLIP: "13670155704",129,,,,0

			+CLIP: "13670155704",129,,,,0
			\********************************************************/
			//***************************************************************************
			if(Compare_String(gGeneral_Buffer,(unsigned char *)String_RING,sizeof(String_RING))!=0)
			{
				return(0);
			}
			else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_CLIP,sizeof(String_CLIP))!=0)
			{
				if(   ((gGeneral_Flag&RESET_GSM_ON_F_1)==0 )
					&&((gGeneral_Flag&LAND_TCP_F_1)==0)
					&&((gInternal_Flag&GSM_ONEAT_SUCCESS_1)==0)   )
				{
					if((gGeneral_Flag&RING_F_1)==0)			gHangUp_Timer=0;
					gGeneral_Flag|=TCP_PHONE_F_1;
					gStatus1_Flag|=PHONE_ONLINE_F_1;
					gGeneral_Flag|=RING_F_1;
					return(1);
				}
				else return(0);
			}
			else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_BUSY,sizeof(String_BUSY))!=0)
			{
				return(1);
			}
			/********************************************************\
			2,判断是否有AT打头的属于AT指令的返回方面的处理或者空行
			  比方说AT指令的回显字符,或者0x0d,0x0a
			\********************************************************/
			if(Compare_String(gGeneral_Buffer,(unsigned char *)String_AT,sizeof(String_AT))!=0)
			{
				return(0);
			}
			else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_END,sizeof(String_END))!=0)
			{
				return(0);
			}
			/********************************************************\
			3,判断是否有NO CARRIER 返回的处理
			\********************************************************/
			else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_NOCARRIER,sizeof(String_NOCARRIER))!=0)
			{
				if( (gM22_Status==TCP_HANG_WORK) )
				{
					if( (gGeneral_Flag&TCP_PHONE_F_1)==0 )
					{
						gM22_Status=GSM_WORK;
						gGSM_Oper_Type=GSM_PHONE;
						gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;
						gPhone_Step=0;gTimer_GSM_AT=0;
					}
					else
					{
						if(gPhone_Status==ACTIVE_MONITOR)
						{
							//监听结束
							gPhone_Status=READY;
							gGeneral_Flag&=~TCP_PHONE_F_1;
							gStatus1_Flag&=~PHONE_ONLINE_F_1;
							gGeneral_Flag|=MONITOR_RESUME_F_1;
							P6OUT&=~SEL_MIC;
							gGeneral_Flag|=TCP_STATUS_F_1;
						}
						else if( (gPhone_Status==ACTIVE_HANDLE)||(gGeneral_Flag&RING_F_1) )
 						{
							//手柄通话结束
							gPhone_Status=READY;
							gGeneral_Flag&=~RING_F_1;
							gGeneral_Flag&=~TCP_PHONE_F_1;
							gStatus1_Flag&=~PHONE_ONLINE_F_1;
							//发送一个挂机信号给手柄
						    Send_COM3_Load(4,MAIN_HANG_UP,0);
							gSys_Handle=MAIN_HANG_UP;
							gGeneral_Flag|=TCP_STATUS_F_1;
						}
						gGeneral_Flag&=~DAILING_UP_F_1;
						gGeneral_Flag&=~MONITOR_ON_F_1;
						gPhone_Status=READY;
						gGeneral_Flag&=~TCP_PHONE_F_1;
						gStatus1_Flag&=~PHONE_ONLINE_F_1;
						gGeneral_Flag&=~RING_F_1;
						gGeneral_Flag|=TCP_STATUS_F_1;
						gCommon_Flag&=~CHECK_RINGPHONE_F_1;
					}
				}
				else if(gM22_Status==GSM_WORK)
				{
					if(gPhone_Status==ACTIVE_MONITOR)
					{
						//监听结束
						gPhone_Status=READY;
						gGeneral_Flag&=~TCP_PHONE_F_1;
						gStatus1_Flag&=~PHONE_ONLINE_F_1;
					}
					else if( (gPhone_Status==ACTIVE_HANDLE)||(gGeneral_Flag&RING_F_1) )
					{
						//手柄通话结束
						gPhone_Status=READY;
						gGeneral_Flag&=~RING_F_1;
						gGeneral_Flag&=~TCP_PHONE_F_1;
						gStatus1_Flag&=~PHONE_ONLINE_F_1;
				        Send_COM3_Load(4,MAIN_HANG_UP,0);
				        gSys_Handle=MAIN_HANG_UP;

						//发送一个挂机信号给手柄
					}
					gGeneral_Flag&=~DAILING_UP_F_1;
					gGeneral_Flag&=~MONITOR_ON_F_1;
					gPhone_Status=READY;
					gGeneral_Flag&=~TCP_PHONE_F_1;
					gStatus1_Flag&=~PHONE_ONLINE_F_1;
					gGeneral_Flag&=~RING_F_1;
					gGeneral_Flag|=MONITOR_RESUME_F_1;
					gCommon_Flag&=~CHECK_RINGPHONE_F_1;
				}
				return(1);
			}
			/********************************************************\
			4,判断是否有+CMT: 返回的处理(属于中断接收SMS的信息处理)
			+CMT: ,032
			0891683108705505F0040D91683128782840F90004503011613495000CFF000000000000000000001B
			\********************************************************/
			else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_CMT,sizeof(String_CMT))!=0)
			{
		        gSMS_In_Lenth=0;
		        j=4;k=0;
		        while(1)
		        {
		        	if(gGeneral_Buffer[j]==',')	{k=1;break;}
		        	j++;
		        	if(j>i) break;
		        }
		        if(k==1)
		        {
		        	for(k=0;k<3;k++)
		        	{
						gSMS_In_Lenth*=10;
						gSMS_In_Lenth=gSMS_In_Lenth+(gGeneral_Buffer[k+j+1]-0x30);
		        	}
					gInternal_Flag|=RECEIVE_SMS_F_1;
		        }
				return(0);
			}
			else if(gInternal_Flag&RECEIVE_SMS_F_1)
			{
				gInternal_Flag&=~RECEIVE_SMS_F_1;
				Do_SMS_Receive(i,gSMS_In_Lenth);
				return(0);
			}
			/********************************************************\
			5,其他
			\********************************************************/
			return(1);
		}//end else if( (gGeneral_Buffer[i-1]==0x0a)&&(gGeneral_Buffer[i-2]==0x0d) )
	}//end while
	return(0);
}
/********************************************************\
*	函数名:Check_TCP
	作用域:外部文件调用
*	功能:

*	参数:  全局变量:GSM的接收缓冲gReceive0_GSM_Buffer[],指针gReceive0_GSM_Buffer_Move
					  gReceive0_GSM_Buffer_Point。
					  数据处理缓冲gGeneral_Buffer[]

*	返回值:0:表示对GSM数据接收缓冲未做任何处理
			1:表示转移一包数据,并处理完成
			其中在返回的过程中,有写特殊的出口处理,需要对一些全局变量进行操作。具体见具体详细描叙

*	创建人:
*
*	修改历史:(每条详述)
	补充说明:
\********************************************************/
unsigned int Check_TCP(void)
{
	unsigned int i,j,k,x;
	unsigned char nLength;
	unsigned char nFlag;
	nLength=0;
	//已经100ms,未接收到M22的数据,则可以判断接收缓冲区中的数据
	if(gM22_TCP_ECHO_Timer>60)
	{
		nFlag=0;
		for(k=0;k<sizeof(gGeneral_Buffer);k++)	gGeneral_Buffer[k]=0;
		i = 0;
		j = gReceive0_GSM_Buffer_Move;
		if( gReceive0_GSM_Buffer_Point == gReceive0_GSM_Buffer_Move ) return(0);
		gGeneral_Buffer[i] = gReceive0_GSM_Buffer[j];
		i++;j++;
		if( j >= sizeof(gReceive0_GSM_Buffer) ) j=0;
		while(j!=gReceive0_GSM_Buffer_Point)
		{
			gGeneral_Buffer[i] = gReceive0_GSM_Buffer[j];
			i++;j++;
			if( i >= sizeof(gGeneral_Buffer) )
			{
//				Send_COM1_String((unsigned char *)R_OVERTOP,sizeof(R_OVERTOP));
				for(i=0;i<sizeof(gGeneral_Buffer);i++) 	 	gGeneral_Buffer[i]=0;
				for(i=0;i<sizeof(gReceive0_GSM_Buffer);i++)	gReceive0_GSM_Buffer[i]=0;
				gReceive0_GSM_Buffer_End=sizeof(gReceive0_GSM_Buffer)-1;
				gReceive0_GSM_Buffer_Point=0;
				gReceive0_GSM_Buffer_Move=0;
				return(0);
			}
			if( j >= sizeof(gReceive0_GSM_Buffer) )  	j=0;
			//如果能执行到这里,则已经将接收缓冲的数据转移到gGeneral_Buffer缓冲中。
			for(k=0;k<i;k++)
			{
				//判断是否为下行的命令数据包
				//例:FF 4F 0B 08 00 01 01 00 08 02 10 0D
				if( (gGeneral_Buffer[k]==SOH)									//判断包头
					&&(gGeneral_Buffer[gGeneral_Buffer[k+3]+3]==EOT)			//判断包尾
					&&(gGeneral_Buffer[k+1]==(char)(~gGeneral_Buffer[k+2])) )	//判断命令字是否取反
				{
//					Send_COM1_String((unsigned char *)TCP_COMMAAND,sizeof(TCP_COMMAAND));
					nLength=gGeneral_Buffer[k+3]+3+1;	//分析有效数据包长度
					j = gReceive0_GSM_Buffer_Move;
					for(x=0;x<nLength+k;x++)
					{
						j++;
						if( j >= sizeof(gReceive0_GSM_Buffer) ) j=0;
					}
					gReceive0_GSM_Buffer_Move=j;		//移动处理处理缓冲区指针
					if(j==0) gReceive0_GSM_Buffer_End=sizeof(gReceive0_GSM_Buffer)-1;
					else     gReceive0_GSM_Buffer_End=j-1;
					//处理适合Do_GPRS_Receive()处理的gGeneral_Buffer缓冲数据安排
					if(k==0)
					{
						for(x=nLength;x>=1;x--)
						{
							gGeneral_Buffer[x]=gGeneral_Buffer[x-1];
						}
						gGeneral_Buffer[0]=nLength;
					}
					else if(k>0)
					{
						gGeneral_Buffer[k-1]=nLength;
						for(x=0;x<=nLength;x++)
						{
							gGeneral_Buffer[x]=gGeneral_Buffer[k-1+x];
						}
					}
					gGeneral_Flag|=LAND_TCP_SUCCESS_F_1;
					Do_GPRS_Receive();
					nFlag=1;
					break;
				}
				//判断是否为FF 0D的握手数据
				else if( (gGeneral_Buffer[0]==0xFF)&&(gGeneral_Buffer[0+1]==0x0D) )
				{
					gGeneral_Flag|=LAND_TCP_SUCCESS_F_1;
					gLand_Interval_Timer=0;
					if(gFF0D_Receive_Timer<=2)
					{
						for(i=0;i<sizeof(gGeneral_Buffer);i++) 	 	gGeneral_Buffer[i]=0;
						for(i=0;i<sizeof(gReceive0_GSM_Buffer);i++)	gReceive0_GSM_Buffer[i]=0;
						gReceive0_GSM_Buffer_End=sizeof(gReceive0_GSM_Buffer)-1;
						gReceive0_GSM_Buffer_Point=0;
						gReceive0_GSM_Buffer_Move=0;
						return(0);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -