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

📄 do_m22.c

📁 车载GPS监控终端的完整代码,与监控中心的通讯采用GPRS.
💻 C
📖 第 1 页 / 共 5 页
字号:
	1-2:
		0xB1	存储表示这个区域的SMS是否处理,为1则表示后面还有未处理的SMS,为0则表示已经处理完了SMS
		0xB2	存储数据包的命令字在这里则为nCommand
		0xB3	存储数据包的ACK的值ACK
		0xB4	存储后面数据包的长度(但注意没有存储CHK(MSB),CHK(LSB),EOT,这三个字节)
		0xB5  	从这开始存储数据包
	\********************************************************/
	else if(gSMS_OUT_Step==7)
	{
		if(gTimer_GSM_AT>300)
		{
			if(gSend_Type1==1)			Send_Type1_GSM_Data_One(ECHO_SMS_2);
			else if(gSend_Type1==2)		Send_Type1_GSM_Data_One(OTHER_SMS_2);
			gInternal_Flag|=GSM_ONEAT_SUCCESS_1;
			gSMS_OUT_Step=8;
			gTimer_GSM_AT=0;
		}
		else Check_GSM();
	}
	else if(gSMS_OUT_Step==8)
	{
		if(Check_GSM()!=0)
		{
			gTimer_GSM_AT=0;
			if(Compare_String(gGeneral_Buffer,(unsigned char *)String_Input_Label,sizeof(String_Input_Label)))
			{
				gSMS_OUT_Step=9;
			}
		    else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_ER,sizeof(String_ER))!=0)
		    {
		    	Case4_OverTime_Out(gSend_Type1);
				Case4_SMSOUT_Out();
		    }
		}
		else
		{
			if(gTimer_GSM_AT>10000)	Case_OverTime_Return();
		}
	}
	else if(gSMS_OUT_Step==9)
	{
		if(gTimer_GSM_AT>200)
		{
			if(gSend_Type1==1)			Send_Type1_GSM_Data_Two(ECHO_SMS_2);
			else if(gSend_Type1==2)		Send_Type1_GSM_Data_Two(OTHER_SMS_2);
			gSMS_OUT_Step=10;
			gTimer_GSM_AT=0;
		}
		else Check_GSM();
	}
	else if(gSMS_OUT_Step==10)
	{
		if(Check_GSM()!=0)
		{
			gTimer_GSM_AT=0;
	    	Case4_OverTime_Out(gSend_Type1);
			Case4_SMSOUT_Out();
		}
		else
		{
			if(gTimer_GSM_AT>60000)
			{
				Case4_OverTime_Out(gSend_Type1);
				Case4_SMSOUT_Out();
			}
		}
	}
 	/********************************************************\
	二,第二类GSM数据的发送
		存储在区域的数据Circle_Buffer[]
		1,行车轨迹数据	;3,报警数据;4,监控数据,5,历史轨迹数据
		这类周期发送的数据因为不能同时存在发送的情形,则可以均用Circle_Buffer[]作为
		存储周期数据发送。
		gCycle_Send_Status=0		表示无任何周期性的数据发送
		gCycle_Send_Status=1		表示属于行车轨迹的周期数据正在发送
		gCycle_Send_Status=2		表示报警的周期数据正在发送
		gCycle_Send_Status=3		表示监控数据正在发送(另外还有标志位表示属于那一类型的监控数据)
		gCycle_Send_Status=4		表示历史轨迹数据正在发送(另外还有标志位表示属于那一类型的历史轨迹数据)
		gCycle_Send_Status=5		表示是盲区点补偿发送的数据

	AT+CMGS=27
	>
	0891683108705505F011000D91683167108230F70004000CFF4FB008000101000102090D
	27的长度为11000D91683167108230F70004000CFF4FB008000101000102090D

	\********************************************************/
	else if(gSMS_OUT_Step==17)
	{
		if( gTimer_GSM_AT>200)
		{
			nTemp_Length=SRAM_Read(TARGET_NUMBER1_2);			//目标电话号码的长度
			nTemp_Length=(nTemp_Length+1)/2+7+1+gCircle_Buffer_Point;	//要发送的数据长度
			Ask_SMS_Send(nTemp_Length);									//发送AT指令AT+CMGS=(SMS长度)
			gInternal_Flag|=GSM_ONEAT_SUCCESS_1;						//发送AT指令的标志置1
			gSMS_OUT_Step=18;
			gTimer_GSM_AT=0;
		}
		else Check_GSM();
	}
	else if(gSMS_OUT_Step==18)
	{
		if(Check_GSM()!=0)
		{
			gTimer_GSM_AT=0;
			if(Compare_String(gGeneral_Buffer,(unsigned char *)String_Input_Label,sizeof(String_Input_Label)))
			{
				gSMS_OUT_Step=19;
			}
		    else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_ER,sizeof(String_ER))!=0)
		    {
				OperateSPIEnd();
				for(i=0;i<sizeof(gCircle_Buffer);i++) gCircle_Buffer[i]=0;
				gCircle_Buffer_Point=0;
				Case4_SMSOUT_Out();
		    }
		}
		else
		{
			if(gTimer_GSM_AT>10000)	Case_OverTime_Return();
		}
	}
	else if(gSMS_OUT_Step==19)
	{
		if(gTimer_GSM_AT>200)
		{
			//这个操作发送完000400
			Send_SMS_Head();
			OperateSPIEnd();
			//发送gCircle_Buffer[]周期数据中的数据
			Send_Circle_GSM_TypeD();
			Send_COM0_Byte(0x1A);
			gSMS_OUT_Step=20;
			gTimer_GSM_AT=0;
		}
	}
	else if(gSMS_OUT_Step==20)
	{
		if(Check_GSM()!=0)
		{
			gTimer_GSM_AT=0;
			OperateSPIEnd();
			for(i=0;i<sizeof(gCircle_Buffer);i++) gCircle_Buffer[i]=0;
			gCircle_Buffer_Point=0;
			Case4_SMSOUT_Out();
		}
		else
		{
			if(gTimer_GSM_AT>60000)
			{
				gTimer_GSM_AT=0;
				for(i=0;i<sizeof(gCircle_Buffer);i++) gCircle_Buffer[i]=0;
				gCircle_Buffer_Point=0;
				Case4_SMSOUT_Out();
			}
		}
	}
	/********************************************************\
	四,第四类GSM数据的发送,外部记录仪的数据发送。注意只能发送
	外部数据的长度有限制
	\********************************************************/
	else if( gSMS_OUT_Step==22 )
	{
		if( gTimer_GSM_AT>200)
		{
			SRAM_Init();
			iLength = SRAM_Read(SRAM_SEND_LENGTH_H);
			iLength <<= 8;
			iLength += SRAM_Read(SRAM_SEND_LENGTH_L);
			nTemp_Length=SRAM_Read(TARGET_NUMBER1_2);			//目标电话号码的长度
			nTemp_Length=(nTemp_Length+1)/2+7+1+(char)iLength+13;		//要发送的数据长度
			Ask_SMS_Send(nTemp_Length);									//发送AT指令AT+CMGS=(SMS长度)
			gInternal_Flag|=GSM_ONEAT_SUCCESS_1;						//发送AT指令的标志置1
			gSMS_OUT_Step=23;
			gTimer_GSM_AT=0;
		}
		else Check_GSM();
	}
	else if( gSMS_OUT_Step==23 )
	{
		if(Check_GSM()!=0)
		{
			gTimer_GSM_AT=0;
			if(Compare_String(gGeneral_Buffer,(unsigned char *)String_Input_Label,sizeof(String_Input_Label)))
			{
				gSMS_OUT_Step=24;
			}
		    else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_ER,sizeof(String_ER))!=0)
		    {
				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);
				Case4_SMSOUT_Out();
		    }
		}
		else
		{
			if(gTimer_GSM_AT>10000)	Case_OverTime_Return();
		}
	}
	else if( gSMS_OUT_Step==24 )
	{
		if(gTimer_GSM_AT>200)
		{
			//这个操作发送完000400
			Send_SMS_Head();
			OperateSPIEnd();
			Send_Circle_GSM_TypeE();
			Send_COM0_Byte(0x1A);
			gSMS_OUT_Step=25;
			gTimer_GSM_AT=0;
		}
	}
	else if(gSMS_OUT_Step==25)
	{
		if(Check_GSM()!=0)
		{
			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);
			Case4_SMSOUT_Out();
		}
		else
		{
			if(gTimer_GSM_AT>60000)
			{
				gTimer_GSM_AT=0;
				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);
				Case4_SMSOUT_Out();
			}
		}
	}
}
/********************************************************\
*	函数名:Case4_SMSOUT_Out
	作用域:本地文件调用
*	功能:	将CASE3中处理的出口
*	参数:
*	返回值:
*	创建人:
*
*	修改历史:(每条详述)
\********************************************************/
void Case4_SMSOUT_Out(void)
{
	gGSM_Oper_Type=LAND_TCP_OPER;
	gLand_GPRS_Step=0;
	gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;
	gSMS_OUT_Step=0;gTimer_GSM_AT=0;
	OperateSPIEnd();
}
/********************************************************\
*	函数名:Case4_OverTime_Out
	作用域:本地文件调用
*	功能:
*	参数:
*	返回值:
*	创建人:
*
*	修改历史:(每条详述)
\********************************************************/
void Case4_OverTime_Out(unsigned char Clear_Flag)
{
	unsigned int i=0;
	OperateSPIEnd();
	SRAM_Init();
	if(Clear_Flag==1)
	{
		SRAM_Write(ECHO_SMS_2+0,NULL_2);
		for(i=ECHO_SMS_2+1;i<OTHER_SMS_2;i++)
		{
			SRAM_Write(i,0);
		}
	}
	else if(Clear_Flag==2)
	{
		SRAM_Write(OTHER_SMS_2+0,NULL_2);
		for(i=OTHER_SMS_2+1;i<END_SRAM_2;i++)
		{
			SRAM_Write(i,0);
		}
	}
	gSend_Type1=0;
}
/********************************************************\
*	函数名:Case5_CHECK_GPRS_LINK
	作用域:本地文件调用
*	功能:1,进行TCP登陆 2,退出TCP
*	参数:
*	返回值:
*	创建人:
*
*	修改历史:(每条详述)
\********************************************************/
void Case5_LAND_GPRS_OPER(void)
{
	unsigned int i=0,j=0,k=0;

	if(gLand_GPRS_Step==0)	{gLand_GPRS_Step=1;gTimer_GSM_AT=0;Check_GSM();}

	else if(gLand_GPRS_Step==1)
	{
		/********************************************************\
		A 1,如果处于GSM的工作方式下,2,有需要进行TCP登陆的标志
			首先执行一个ATH指令
		\********************************************************/
		if( (gM22_Status==GSM_WORK)&&(gGeneral_Flag&LAND_TCP_F_1)
			&&((gGeneral_Flag&LAND_TCP_ERROR_F_1)==0)
			&&((gGeneral_Flag&TCP_PHONE_F_1)==0) )
		{
			if( gTimer_GSM_AT>500 )
			{
				Send_COM0_String((unsigned char *)ATH,sizeof(ATH));
				gInternal_Flag|=GSM_ONEAT_SUCCESS_1;
				gTimer_GSM_AT=0;
				gLand_GPRS_Step=2;
			}
			else	Check_GSM();
		}
		/********************************************************\
		B 1,如果处于TCP在线挂起状态下,2,有需要进行TCP准备好退出登陆的标志||
		\********************************************************/
		else if( (gM22_Status==TCP_HANG_WORK)&&(gOther_Flag&QUIT_TCP_F_1) )
		{
			if( gTimer_GSM_AT>500 )
			{
				Send_COM0_String((unsigned char *)ATH,sizeof(ATH));
				gInternal_Flag|=GSM_ONEAT_SUCCESS_1;
				gTimer_GSM_AT=0;
				gLand_GPRS_Step=12;
			}
			else	Check_GSM();
		}
		/********************************************************\
		C 1,TCP在线挂起状态 ,2,判断有需要需要发送ATO操作的标志
		\********************************************************/
		else if( (gM22_Status==TCP_HANG_WORK)
				&&(gGeneral_Flag&TCP_STATUS_F_1)
				&&((gGeneral_Flag&TCP_PHONE_F_1)==0)  )
		{
			if( gTimer_GSM_AT>500 )
			{
				Send_COM0_String((unsigned char *)ATO,sizeof(ATO));
				gInternal_Flag|=GSM_ONEAT_SUCCESS_1;
				gTimer_GSM_AT=0;
				gLand_GPRS_Step=14;
			}
			else	Check_GSM();
		}
		/********************************************************\
		如果上面条件均不满足,则退出这个CASE
		\********************************************************/
		else
		{
			if(gM22_Status==GSM_WORK) gOther_Flag&=~QUIT_TCP_F_1;
			/********************************************************\
			判断在GSM的状态下是否需要进行TCP登陆的操作
			1,IP地址有效,2,TCP开关量开启状态,3,GSM的工作方式,4,允许进行TCP登陆的操作
			\********************************************************/
			if(   (gGeneral_Flag&TCP_IP_VALID_1)
				&&((gON_OFF_Temp0&TCP_LAND_ON_OFF_1)==0)
				&&(gM22_Status==GSM_WORK)
				&&((gGeneral_Flag&LAND_TCP_ERROR_F_1)==0) )
			{
				//1,如果有报警信息
				if(   (gCycle_Send_Status==ALARM_DATA)
					&&(gCycle_Alarm>0) )
				{
					gGeneral_Flag|=LAND_TCP_F_1;
					gGSM_Oper_Type=LAND_TCP_OPER;
					gLand_GPRS_Step=0;
					gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;
				}
				//2,如果有行车轨迹,且行车轨迹的周期小于20分钟,则允许长期在线,则进行登陆TCP的操作
				else if(   (gCycle_Send_Status==TRACK_DATA_TIME)
						 &&(gCycle_TCP<TCP_TRACK_MINTIME)
						 &&(gCycle_TCP>0) )
				{
					gGeneral_Flag|=LAND_TCP_F_1;
					gGSM_Oper_Type=LAND_TCP_OPER;
					gLand_GPRS_Step=0;
					gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;
				}
				//3,如果是行车轨迹周期大于20分钟,且已经到有需要发送的数据包,则需要进行登陆
				else if(  (gCycle_Send_Status==TRACK_DATA_TIME)
						&&(gCycle_TCP>=TCP_TRACK_MINTIME)
						&&(gInternal_Flag&SEND_CIRCLE_F_1) )
				{
					gGeneral_Flag|=LAND_TCP_F_1;
					gGSM_Oper_Type=LAND_TCP_OPER;
					gLand_GPRS_Step=0;
					gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;
				}
				//4,如果属于历史轨迹查询或者重点监控状态
				else if(   (gCycle_Send_Status==PASS_DATA)
						 ||(gCycle_Send_Status==WATCH_DATA)  )
				{
					gGeneral_Flag|=LAND_TCP_F_1;
					gGSM_Oper_Type=LAND_TCP_OPER;
					gLand_GPRS_Step=0;
					gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;
				}
				//5,如果属于间隔距离传输数据点,并且TCP属于常开状态,则需要登陆TCP
				else if(   (gCycle_Send_Status==TRACK_DATA_DISTANCE)
						 &&((gON_OFF_Temp1&DISTANCE_TCP_ON_1)==0) )
				{
					gGeneral_Flag|=LAND_TCP_F_1;
					gGSM_Oper_Type=LAND_TCP_OPER;
					gLand_GPRS_Step=0;
					gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;
				}
				//6,如果属于间隔距离传输数据点,并且TCP属于不常在线状态,但有数据点需要发送,则需要进行登陆
				else if(   (gCycle_Send_Status==TRACK_DATA_DISTANCE)
						 &&(gON_OFF_Temp1&DISTANCE_TCP_ON_1)
						 &&(gInternal_Flag&SEND_CIRCLE_F_1) )
				{
					gGeneral_Flag|=LAND_TCP_F_1;
					gGSM_Oper_Type=LAND_TCP_OPER;
					gLand_GPRS_Step=0;
					gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;
				}
				//7, 如果有记录仪的数据需要上行给数据中心的,则先进行登陆TCP的操作
				else if( gOther_Flag&RECORD_DATA_F_1)
				{
					gGeneral_Flag|=LAND_TCP_F_1;
					gGSM_Oper_Type=LAND_TCP_OPER;
					gLand_GPRS_Step=0;
					gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;
				}
				//8,如果其他要发送的数据,则需要先登陆TCP
				else if( gOther_Flag&NEED_LADN_TCP_F_1 )
				{
					gOther_Flag&=~NEED_LADN_TCP_F_1;
					gGeneral_Flag|=LAND_TCP_F_1;
					gGSM_Oper_Type=LAND_TCP_OPER;

⌨️ 快捷键说明

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