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

📄 do_m22.c

📁 车载GPS监控终端的完整代码,与监控中心的通讯采用GPRS.
💻 C
📖 第 1 页 / 共 5 页
字号:
					gLand_GPRS_Step=0;
					gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;
				}
				//如果其他
				else
				{
					gGSM_Oper_Type=GSM_PHONE;gPhone_Step=0;
					gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;
					gLand_GPRS_Step=0;
				}
			}
			else
			{
				gGSM_Oper_Type=GSM_PHONE;gPhone_Step=0;
				gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;
				gLand_GPRS_Step=0;
			}
			gTimer_GSM_AT=0;
			OperateSPIEnd();
		}
	}
	else if(gLand_GPRS_Step==2)
	{
		if( Check_GSM()!=0 )
		{
			gLand_GPRS_Step=3;
		}
		else
		{
			if(gTimer_GSM_AT>10000)	Case_OverTime_Return();
		}
	}
	else if(gLand_GPRS_Step==3)
	{
		if( gTimer_GSM_AT>500 )
		{
			Send_COM0_String((unsigned char *)AT_CGDCONT,sizeof(AT_CGDCONT));
			j=SRAM_Read(GPRS_APN_ADDRESS2_2);
			for(i=0;i<j;i++)
			{
				Send_COM0_Byte(SRAM_Read(GPRS_APN_ADDRESS2_2+1+i));
			}
			Send_COM0_Byte(0x0d);
			gInternal_Flag|=GSM_ONEAT_SUCCESS_1;
			gTimer_GSM_AT=0;
			gLand_GPRS_Step=4;
		}
		else	Check_GSM();
	}
	//A-1
	else if(gLand_GPRS_Step==4)
	{
		if( Check_GSM()!=0 )
		{
			gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;gTimer_GSM_AT=0;
			if(Compare_String(gGeneral_Buffer,(unsigned char *)String_OK,sizeof(String_OK)))
			{
				gLand_GPRS_Step=5;
			}
		}
		else
		{
			if(gTimer_GSM_AT>10000)
			{
				TCP_Land_Error_Return();
			}
		}
	}
	//A-2
	else if(gLand_GPRS_Step==5)
	{
		if( gTimer_GSM_AT>500 )
		{
			Send_COM0_String((unsigned char *)AT_CGPCO,sizeof(AT_CGPCO));
			gInternal_Flag|=GSM_ONEAT_SUCCESS_1;
			gTimer_GSM_AT=0;
			gLand_GPRS_Step=6;
		}
		else	Check_GSM();
	}
	//A-3
	else if(gLand_GPRS_Step==6)
	{
		if( Check_GSM()!=0 )
		{
			gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;gTimer_GSM_AT=0;
			if(Compare_String(gGeneral_Buffer,(unsigned char *)String_OK,sizeof(String_OK)))
			{
				gLand_GPRS_Step=7;
			}
		}
		else
		{
			if(gTimer_GSM_AT>10000)
			{
				//表示登陆TCP失败的处理
				TCP_Land_Error_Return();
			}
		}
	}
	//A-4
	else if(gLand_GPRS_Step==7)
	{
		if( gTimer_GSM_AT>500 )
		{
			Send_COM0_String((unsigned char *)AT_DESTINFO,sizeof(AT_DESTINFO));
			//1,从buffer1中取出IP地址
			Send_COM0_Byte('"');
			j=SRAM_Read(GPRS_IP_ADDRESS1_2);
			for(i=0;i<j;i++)
			{
				Send_COM0_Byte(SRAM_Read(GPRS_IP_ADDRESS1_2+1+i));
			}
			Send_COM0_Byte('"');
			Send_COM0_Byte(',');
			Send_COM0_Byte('1');
			Send_COM0_Byte(',');
			//2,从buffer中取出端口号,在buffer1中端口号是以5位ASCII形式存储的,如果实际有效数据不够5位,则以前面填0
			//例如:端口号为9988,在buffer1中相应的区域存储为30 39 39 38 38
			gGeneral_Buffer[0]=SRAM_Read(GPRS_SOCKET1_2);
			gGeneral_Buffer[1]=SRAM_Read(GPRS_SOCKET1_2+1);
			gGeneral_Buffer[2]=SRAM_Read(GPRS_SOCKET1_2+2);
			gGeneral_Buffer[3]=SRAM_Read(GPRS_SOCKET1_2+3);
			gGeneral_Buffer[4]=SRAM_Read(GPRS_SOCKET1_2+4);
			OperateSPIEnd();
			i=0;
			while(1)
			{
				//从最高位开始判断,如果不为0,则后面的均为有效数据
				if(gGeneral_Buffer[i]!=0x30) break;
				i++;
				if(i==5) break;
			}
			if(i<5)
			{
				for(j=i;j<5;j++)
				{
					Send_COM0_Byte(gGeneral_Buffer[j]);
				}
			}
			else
			{
				gLand_GPRS_Step=0;
				return;
			}
			Send_COM0_Byte(0x0d);
			gInternal_Flag|=GSM_ONEAT_SUCCESS_1;
			gLand_GPRS_Step=8;
			gTimer_GSM_AT=0;
		}
		else 		Check_GSM();
	}
	//A-5
	else if(gLand_GPRS_Step==8)
	{
		if( Check_GSM()!=0 )
		{
			gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;gTimer_GSM_AT=0;
			if(Compare_String(gGeneral_Buffer,(unsigned char *)String_DESTINFO,sizeof(String_DESTINFO)))
			{
				gLand_GPRS_Step=9;
			}
			else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_ER,sizeof(String_ER)))
			{
				TCP_Land_Error_Return();
			}
		}
		else
		{
			if(gTimer_GSM_AT>10000)
			{
				//表示登陆TCP失败的处理
				TCP_Land_Error_Return();
			}
		}
	}
	//A-6
	else if(gLand_GPRS_Step==9)
	{
		if(gTimer_GSM_AT>1500)
		{
			Send_COM0_String((unsigned char *)ATD_97,sizeof(ATD_97));
			gInternal_Flag|=GSM_ONEAT_SUCCESS_1;
			gLand_GPRS_Step=10;
			gTimer_GSM_AT=0;
		}
		else	Check_GSM();
	}
	//A-7
	else if(gLand_GPRS_Step==10)
	{
		if( Check_GSM()!=0 )
		{
			gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;gTimer_GSM_AT=0;
			if(Compare_String(gGeneral_Buffer,(unsigned char *)String_L_TCP,sizeof(String_L_TCP)))
			{
				gLand_GPRS_Step=11;
			}
			//返回ERROR,说明SIM卡不支持TCP的工作方式或者说任何场强信号很弱的时候
			else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_ER,sizeof(String_ER)))
			{
				TCP_Land_Error_Return();
			}
		}
		else
		{
			if(gTimer_GSM_AT>65000)
			{
				TCP_Land_Error_Return();
			}
		}
	}
	//A-8
	else if(gLand_GPRS_Step==11)
	{
		if( Check_GSM()!=0 )
		{
			gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;gTimer_GSM_AT=0;
			if(Compare_String(gGeneral_Buffer,(unsigned char *)String_OK,sizeof(String_OK)))
			{
				//说明登陆成功,此时不能进行AT指令的任何操作,直接进入CASE6中
				gGeneral_Flag&=~LAND_TCP_F_1;
				gLand_TCP_ERROR_Count=0;
				gGSM_Oper_Type=GPRS_DATA_OPER;
				gM22_Status=TCP_ONLINE_WORK;
				gLand_GPRS_Step=0;
				gTimer_CSQ=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;
				gGSM_Work_Count=0;gCheck_Data=0;
				gInternal_Flag&=~ALLOW_DATA_F_1;
				//发送登陆TCP的数据
				gOther_Flag|=ALLOW_SENDLAND_F_1;
				gGeneral_Flag&=~LAND_TCP_SUCCESS_F_1;
			}
			else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_ER,sizeof(String_ER)))
			{
				gLand_GPRS_Step=111;
			}
		}
		else
		{
			if(gTimer_GSM_AT>65000)
			{
				TCP_Land_Error_Return();
			}
		}
	}
	else if(gLand_GPRS_Step==111)
	{
		if( Check_GSM()!=0 )
		{
			TCP_Land_Error_Return();
		}
		else
		{
			if(gTimer_GSM_AT>40000)
			{
				TCP_Land_Error_Return();
			}
		}
	}
	//B-1
	else if(gLand_GPRS_Step==12)
	{
		if( Check_GSM()!=0 )
		{
			gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;gTimer_GSM_AT=0;
			if(Compare_String(gGeneral_Buffer,(unsigned char *)String_OK,sizeof(String_OK)))
			{
				gLand_GPRS_Step=13;
				gOther_Flag&=~QUIT_TCP_F_1;
			}
		}
		else
		{
			if(gTimer_GSM_AT>20000)
			{
				Case_OverTime_Return();
			}
		}
	}
	//B-2
	else if(gLand_GPRS_Step==13)
	{
		if( Check_GSM()!=0 )
		{
			gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;gTimer_GSM_AT=0;
			if(Compare_String(gGeneral_Buffer,(unsigned char *)String_NOCARRIER,sizeof(String_NOCARRIER)))
			{
				gM22_Status=GSM_WORK;
				gGeneral_Flag&=~LAND_TCP_SUCCESS_F_1;
				gGSM_Oper_Type=GSM_PHONE;
				gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;
				gPhone_Step=0;gTimer_GSM_AT=0;
				gOther_Flag&=~QUIT_TCP_F_1;
			}
		}
		else
		{
			if(gTimer_GSM_AT>20000)
			{
				Case_OverTime_Return();
			}
		}
	}
	//C-1
	else if(gLand_GPRS_Step==14)
	{
		if( Check_GSM()!=0 )
		{
			gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;gTimer_GSM_AT=0;
			if(Compare_String(gGeneral_Buffer,(unsigned char *)String_CONNECT,sizeof(String_CONNECT)))
			{
				//进入TCP在线状态
				gM22_Status=TCP_ONLINE_WORK;
				gLand_GPRS_Step=0;
				gGeneral_Flag&=~TCP_STATUS_F_1;
				gReceive0_GSM_Buffer_Move=gReceive0_GSM_Buffer_Point;
				if(gReceive0_GSM_Buffer_Point==0) 	gReceive0_GSM_Buffer_End=sizeof(gReceive0_GSM_Buffer)-1;
				else     							gReceive0_GSM_Buffer_End=gReceive0_GSM_Buffer_Point-1;
				gGSM_Oper_Type=GPRS_DATA_OPER;
				gGPRS_Data_Step=0;
				gTimer_CSQ=0;
				//登陆成功,如果有报警,
				if(gCycle_Send_Status==ALARM_DATA)
				{
					gCycle_Alarm=ALARM_CIRCLE_TIME;
					gAlarm_Count=0;
				}
			}
			else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_ER,sizeof(String_ER)))
			{
				//进入GSM的工作方式下
				gReset_M22_On_Setp=0;
				gGeneral_Flag&=~RESET_GSM_ON_F_1;
				gM22_Status=GSM_WORK;
				gGeneral_Flag&=~LAND_TCP_SUCCESS_F_1;
				gGSM_Oper_Type=GSM_PHONE;
				gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;
				gPhone_Step=0;gTimer_GSM_AT=0;
			}
		}
		else
		{
			if(gTimer_GSM_AT>65000)	Case_OverTime_Return();
		}
	}
}
/********************************************************\
*	函数名:TCP_Land_Error_Return
	作用域:本地文件调用
*	功能:
*	参数:
*	返回值:
*	创建人:
*
*	修改历史:(每条详述)
	现在如果TCP登陆失败,则重新初始化M22模块,不采用掉电的方式,,如果连续登陆失败5次,则需要进行
	模块掉电处理。
\********************************************************/
void TCP_Land_Error_Return(void)
{
	Send_COM1_String((unsigned char *)TCP_LAND_ERROR,sizeof(TCP_LAND_ERROR));
	gGeneral_Flag|=RESET_GSM_ON_F_1;
	gReset_M22_On_Setp=1;
	gM22_Status=GSM_WORK;
	gM22_GSM_ECHO_Timer=0;
	gLand_Interval_Timer=0;
	gTCP_FF0D_Send_Timer=0;
	gGPS_No_Output_Timer=0;
	gTimer_GSM_AT=0;
	gTimer_CSQ=0;
	gGPS_Receive_Over=0;

    gPhone_Status=READY;
	gStatus1_Flag&=~PHONE_ONLINE_F_1;
	gGeneral_Flag&=~DAILING_UP_F_1;
	gGeneral_Flag&=~MONITOR_ON_F_1;
	gGeneral_Flag&=~TCP_PHONE_F_1;
	gGeneral_Flag&=~RING_F_1;
	gGSM_Oper_Type=0;
	gSMS_IN_Step=0;
	gSMS_OUT_Step=0;
	gLand_GPRS_Step=0;
	gGPRS_Data_Step=0;
	gGSM_OTHER_Step=0;

	gGeneral_Flag|=LAND_TCP_ERROR_F_1;
	gLand_TCP_ERROR_Count++;
	if(gLand_TCP_ERROR_Count>5)
	{
		gLand_TCP_ERROR_Count=0;
		gGeneral_Flag|=OFF_M22_F_1;
		gOFF_Power_S=1;
		gPhone_Status=READY;
		gStatus1_Flag&=~PHONE_ONLINE_F_1;
	}

	//如果属于周期数据的发送
	if(gInternal_Flag&SEND_CIRCLE_F_1)
	{
		//1,按时间间隔上报数据,且间隔大于分界值
		if( (gCycle_Send_Status==TRACK_DATA_TIME)&&(gCycle_TCP>TCP_TRACK_MINTIME) )
		{
			gInternal_Flag|=ALLOW_DATA_F_1;
		}
		else
		{
			gInternal_Flag&=~ALLOW_DATA_F_1;
			gInternal_Flag&=~SEND_CIRCLE_F_1;
		}
	}
	//如果属于外部行使记录仪数据的发送,
	else if(gOther_Flag&RECORD_DATA_F_1)
	{
		gOther_Flag&=~RECORD_DATA_F_1;
		gOther_Flag&=~ALLOW_SEND_RECORD_F_1;
		SRAM_Init();
		SRAM_Write(SRAM_SEND_VAILD,NULL_2);
		SRAM_Write(SRAM_SEND_LENGTH_H,0);
		SRAM_Write(SRAM_SEND_LENGTH_L,0);
		gInternal_Flag&=~ALLOW_DATA_F_1;
	}
	else
	{
		gInternal_Flag|=ALLOW_DATA_F_1;
	}
}
/********************************************************\
*	函数名:Case6_GPRS_DATA_OPER
	作用域:本地文件调用
*	功能:	进行与GPRS相关的数据操作,以发送为主,接收数据则在Check_GSM()中直接处理
*	参数:
*	返回值:
*	创建人:
*
*	修改历史:(每条详述)
	2004年12月15日
	补充说明:
	1,如果在这个CASE外判断有数据要发送,同时TCP处于被挂起状态,则首先执行ATO指令后,然后进入这个
	CASE中进行通过TCP方式发送数据:一旦数据发送完成,则执行+++,将TCP的状态挂起,但如果发送的数据
	属于握手信号FF 0D,则需要发送完数据后,执行一个等待的时

⌨️ 快捷键说明

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