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

📄 do_m22.c

📁 车载GPS监控终端的完整代码,与监控中心的通讯采用GPRS.
💻 C
📖 第 1 页 / 共 5 页
字号:
					}
					else
					{
						//3,固定调节AUVOL的接收增益为1
						gTimer=0;
						while(gTimer<200){Check_GSM();}
						Send_COM0_String((unsigned char *)AT_AUVOL,sizeof(AT_AUVOL));
						Send_COM0_Byte('0');Send_COM0_Byte(0x0d);
						gInternal_Flag&=~M22_RETURN_OK_1;
						Wait_OK();
						if( (gInternal_Flag&M22_RETURN_OK_1)==0 )
						{
							gPhone_Step=5;gTimer_GSM_AT=0;
						}
						else
						{
							gPhone_Step=9;gTimer_GSM_AT=0;
						}
					}
				}
			}
			else
			{
				Case1_PHONE_Out();
			}
		}
		else 	Check_GSM();
	}
	else if(gPhone_Step==9)
	{
		if( gTimer_GSM_AT>400 )
		{
			if(gPhone_Status==READY)
			{
				Send_COM0_String((unsigned char *)ATD,sizeof(ATD));
				//电话号码的长度
				k=SRAM_Read(PHONE_AT_2+2);
				for(j=0;j<k;j++)
				{
					Send_COM0_Byte(SRAM_Read(PHONE_AT_2+3+j));
				}
				Send_COM0_Byte(';');
				Send_COM0_Byte(0x0d);
				gInternal_Flag|=GSM_ONEAT_SUCCESS_1;
				gPhone_Step=14;
				gGeneral_Flag|=MONITOR_ON_F_1;
				gGeneral_Flag|=TCP_PHONE_F_1;
				gStatus1_Flag|=PHONE_ONLINE_F_1;
				gHangUp_Timer=0;
				gPhone_Status=DAILING;
				gTimer_GSM_AT=0;
				P6OUT|=SEL_MIC;
			}
			else
			{
				Case1_PHONE_Out();
			}
		}
		else Check_GSM();
	}
	/********************************************************\
	3,手柄接听处理
	\********************************************************/
	else if(gPhone_Step==10)
	{
		if( gTimer_GSM_AT>400  )
		{
			Send_COM0_String((unsigned char *)ATA,sizeof(ATA));
			gInternal_Flag|=GSM_ONEAT_SUCCESS_1;
			gPhone_Step=15;
			gTimer_GSM_AT=0;
			OperateSPIEnd();
		}
		else Check_GSM();
	}
	/********************************************************\
	4,手柄DTMF处理
	\********************************************************/
	else if(gPhone_Step==11)
	{
		OperateSPIEnd();
		if( gTimer_GSM_AT>400  )
		{
			if(gPhone_Status==ACTIVE_HANDLE)
			{
				//检测DTMF中的数据
				#ifdef Debug_GSM_COM1
				Send_COM1_Byte('[');
				Send_COM1_Byte(ASCII(gDTMF_SAVE[0]/10));
				Send_COM1_Byte(ASCII(gDTMF_SAVE[0]%10));
				Send_COM1_Byte(']');
				Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
				#endif
				////////////////////////////////////////////
				Send_COM0_String((unsigned char *)AT_VTS,sizeof(AT_VTS));
				//需要发送的音频数据
				k=SRAM_Read(PHONE_AT_2+3);
				//直接存储的是数字ASCII形式
				Send_COM0_Byte(k);
				Send_COM0_Byte(0x0d);
				gInternal_Flag|=GSM_ONEAT_SUCCESS_1;
				gPhone_Step=15;
				gTimer_GSM_AT=0;
				OperateSPIEnd();
			}
			else	Case1_PHONE_Out();
		}
		else Check_GSM();
	}
	/********************************************************\
	5,手柄音量调节处理
	\********************************************************/
	else if(gPhone_Step==12)
	{
		OperateSPIEnd();
		if( gTimer_GSM_AT>400  )
		{
			if( gM22_Status!=TCP_ONLINE_WORK )
			{
				Send_COM0_String((unsigned char *)AT_AUGAIN,sizeof(AT_AUGAIN));
				k=SRAM_Read(PHONE_AT_2+3);
				//直接存储的是数字ASCII形式
				if( (k<1)||(k>4) )	k=2;
				Send_COM0_Byte('2');Send_COM0_Byte(',');
				Send_COM0_Byte(Handle_VOL[k]);
				Send_COM0_Byte(0x0d);
				gVolume=k;
				gInternal_Flag|=GSM_ONEAT_SUCCESS_1;
				gPhone_Step=15;
				gTimer_GSM_AT=0;
				OperateSPIEnd();
			}
			else	Case1_PHONE_Out();
		}
		else Check_GSM();
	}
	/********************************************************\
	6,手柄挂机处理
	\********************************************************/
	else if(gPhone_Step==13)
	{
		if( gTimer_GSM_AT>400)
		{
			if(	gPhone_Status==ACTIVE_MONITOR)
			{
				Case1_PHONE_Out();
			}
			else
			{
				Send_COM0_String((unsigned char *)ATH,sizeof(ATH));
				gInternal_Flag|=GSM_ONEAT_SUCCESS_1;
				gPhone_Step=16;
				gTimer_GSM_AT=0;
				OperateSPIEnd();
			}
		}
		else Check_GSM();
	}
	/********************************************************\
	手柄拨号,监听拨号的返回状态处理
	\********************************************************/
	else if(gPhone_Step==14)
	{
		if( Check_GSM()!=0 )
		{
			gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;gTimer_GSM_AT=0;
			//接通
			if(Compare_String(gGeneral_Buffer,(unsigned char *)String_COLP,sizeof(String_COLP)))
			{
				if(gGeneral_Flag&DAILING_UP_F_1)
				{
					gGeneral_Flag&=~DAILING_UP_F_1;
					gPhone_Status=ACTIVE_HANDLE;
				    Send_COM3_Load(4,MAIN_TALKING,0);
				    gSys_Handle=MAIN_TALKING;
					//返回手柄一个接通命令
				}
				else if(gGeneral_Flag&MONITOR_ON_F_1)
				{
					gGeneral_Flag&=~MONITOR_ON_F_1;
					gPhone_Status=ACTIVE_MONITOR;
				}
				Case1_PHONE_Out();
			}
			//未接通,则自己主动挂断
			else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_OK,sizeof(String_OK)))
			{

				if(gM22_Status==TCP_HANG_WORK)	gGeneral_Flag|=TCP_STATUS_F_1;
				if(gGeneral_Flag&DAILING_UP_F_1)
				{
					gGeneral_Flag&=~DAILING_UP_F_1;
					gPhone_Status=READY;
					gGeneral_Flag&=~TCP_PHONE_F_1;
					gStatus1_Flag&=~PHONE_ONLINE_F_1;
				}
				else if(gGeneral_Flag&MONITOR_ON_F_1)
				{
					gGeneral_Flag&=~MONITOR_ON_F_1;
					gPhone_Status=READY;
					P6OUT&=~SEL_MIC;
				}
				Case1_PHONE_Out();
			}
			//未接通,返回手柄挂机
			else if( Compare_String(gGeneral_Buffer,(unsigned char *)String_ER,sizeof(String_ER)) )
			{
				if(gM22_Status==TCP_HANG_WORK)	gGeneral_Flag|=TCP_STATUS_F_1;
				if(gGeneral_Flag&DAILING_UP_F_1)
				{
					gGeneral_Flag&=~DAILING_UP_F_1;
					gPhone_Status=READY;
					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;
					//返回手柄挂机命令
				}
				else if(gGeneral_Flag&MONITOR_ON_F_1)
				{
					gGeneral_Flag&=~MONITOR_ON_F_1;
					gPhone_Status=READY;
					gGeneral_Flag&=~TCP_PHONE_F_1;
					gStatus1_Flag&=~PHONE_ONLINE_F_1;
					P6OUT&=~SEL_MIC;
				}
				Case1_PHONE_Out();
			}
			//未接通,对方主动挂机,返回手柄挂机
			else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_BUSY,sizeof(String_BUSY)))
			{
				if(gM22_Status==TCP_HANG_WORK)	gGeneral_Flag|=TCP_STATUS_F_1;
				if(gGeneral_Flag&DAILING_UP_F_1)
				{
					gGeneral_Flag&=~DAILING_UP_F_1;
					gStatus1_Flag&=~PHONE_ONLINE_F_1;
					gPhone_Status=READY;
					gGeneral_Flag&=~TCP_PHONE_F_1;
				    Send_COM3_Load(4,MAIN_HANG_UP,0);
				    gSys_Handle=MAIN_HANG_UP;
					//返回主动挂机命令
				}
				else if(gGeneral_Flag&MONITOR_ON_F_1)
				{
					gGeneral_Flag&=~MONITOR_ON_F_1;
					gPhone_Status=READY;
					gGeneral_Flag&=~TCP_PHONE_F_1;
					gStatus1_Flag&=~PHONE_ONLINE_F_1;
					P6OUT&=~SEL_MIC;
				}
				Case1_PHONE_Out();
			}
			//未接通,对方无应答
			else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_NOANSWER,sizeof(String_NOANSWER)))
			{
				if(gM22_Status==TCP_HANG_WORK)	gGeneral_Flag|=TCP_STATUS_F_1;
				if(gGeneral_Flag&DAILING_UP_F_1)
				{
					gGeneral_Flag&=~DAILING_UP_F_1;
					gPhone_Status=READY;
					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;
					//返回手柄挂机命令
				}
				else if(gGeneral_Flag&MONITOR_ON_F_1)
				{
					gGeneral_Flag&=~MONITOR_ON_F_1;
					gPhone_Status=READY;
					gGeneral_Flag&=~TCP_PHONE_F_1;
					gStatus1_Flag&=~PHONE_ONLINE_F_1;
					P6OUT&=~SEL_MIC;
				}
				Case1_PHONE_Out();
			}
			//未接通,对方占线
			else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_NOCARRIER,sizeof(String_NOCARRIER)) )
			{
				if(gM22_Status==TCP_HANG_WORK)	gGeneral_Flag|=TCP_STATUS_F_1;
				if(gGeneral_Flag&DAILING_UP_F_1)
				{
					gGeneral_Flag&=~DAILING_UP_F_1;
					gPhone_Status=READY;
					gGeneral_Flag&=~TCP_PHONE_F_1;
					gStatus1_Flag&=~PHONE_ONLINE_F_1;
				    Send_COM3_Load(4,MAIN_BUSY,0);
					//返回手柄挂机命令
				}
				else if(gGeneral_Flag&MONITOR_ON_F_1)
				{
					gGeneral_Flag&=~MONITOR_ON_F_1;
					gPhone_Status=READY;
					gGeneral_Flag&=~TCP_PHONE_F_1;
					gStatus1_Flag&=~PHONE_ONLINE_F_1;
					P6OUT&=~SEL_MIC;
				}
				Case1_PHONE_Out();
			}
		}
		else
		{
			if(gGeneral_Flag&DAILING_UP_F_1)
			{
				//手柄未接通主动挂机命令的操作
				SRAM_Init();
				i=SRAM_Read(PHONE_AT_2+1);
				if( i==H_HUNGUP )
				{
					Send_COM0_String((unsigned char *)ATH,sizeof(ATH));
					gGeneral_Flag&=~MONITOR_ON_F_1;
					gPhone_Status=READY;
					gGeneral_Flag&=~TCP_PHONE_F_1;
					gStatus1_Flag&=~PHONE_ONLINE_F_1;
				}
			}
			if(gTimer_GSM_AT>65000)
			{
				gGeneral_Flag&=~MONITOR_ON_F_1;
				gPhone_Status=READY;
				gGeneral_Flag&=~TCP_PHONE_F_1;
				gStatus1_Flag&=~PHONE_ONLINE_F_1;
				Case1_PHONE_Out();
				SRAM_Init();
				SRAM_Write(PHONE_AT_2+0,VAILD_2);
				SRAM_Write(PHONE_AT_2+1,H_HUNGUP);
				SRAM_Write(PHONE_AT_2+2,0);
			}
		}
	}
	/********************************************************\
	手柄接听,DTMF拨号,音量调节的返回状态处理
	\********************************************************/
	else if(gPhone_Step==15)
	{
		if( Check_GSM()!=0 )
		{
			if(Compare_String(gGeneral_Buffer,(unsigned char *)String_OK,sizeof(String_OK)))
			{
				if(gPhone_Status==INCOMING)
				{
					gPhone_Status=ACTIVE_HANDLE;
					gGeneral_Flag&=~RING_F_1;
					gPhone_Step=0;
				    Send_COM3_Load(4,MAIN_TALKING,0);
				    gSys_Handle=MAIN_TALKING;
					Case1_PHONE_Out();
				}
				else
				{
					Case1_PHONE_Out();
				}
			}
			else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_ER,sizeof(String_ER)))
			{
				Case1_PHONE_Out();
			}
		}
		else
		{
			if(gTimer_GSM_AT>10000)		Case1_PHONE_Out();
		}
	}
	/********************************************************\
	手柄挂机的返回状态处理
	\********************************************************/
	else if(gPhone_Step==16)
	{
		if( Check_GSM()!=0 )
		{
			if(Compare_String(gGeneral_Buffer,(unsigned char *)String_OK,sizeof(String_OK)))
			{
				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;
				if(gM22_Status==TCP_HANG_WORK)	gGeneral_Flag|=TCP_STATUS_F_1;
				Case1_PHONE_Out();
			}
		}
		else
		{
			if(gTimer_GSM_AT>6000)		Case_OverTime_Return();
		}
	}
	OperateSPIEnd();
}
/********************************************************\
*	函数名:Case1_PHONE_Out
	作用域:本地文件调用
*	功能:	将CASE1中处理的出口,但这这个出口在下一个程序循环中,仍然会进入这个CASE中

*	参数:
*	返回值:
*	创建人:
*
*	修改历史:(每条详述)
\********************************************************/
void Case1_PHONE_Out(void)
{
	unsigned int i=0;
	gPhone_Step=0;
	gTimer_GSM_AT=0;
	gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;
	SRAM_Init();
	SRAM_Write(PHONE_AT_2+0,NULL_2);
	for(i=PHONE_AT_2+1;i<ECHO_SMS_2;i++)
	{
		SRAM_Write(i,0);
	}
}

/********************************************************\
*	函数名:Case2_GSM_OTHER
	作用域:本地文件调用
*	功能:	主要是处理有电话方面的时候CLCC查询,没电话的时候CSQ的查询,还有如果收到参数设置的话,则
			在需要进行短消息中心号码的设置,GPRS的IP改变,端口改变后的GPRS的重新登陆设置等
*	参数:
*	返回值:
*	创建人:
*
*	修改历史:(每条详述)
	补充说明:因为在这个case中有需要对短消息中心号码的设置,根据通过SMS接收到新的参数设置,需要将
				短消息中心号码存储先存储在buffer1的0x4B----0x5C区域。第一个字节开始就存储短消息中心
				号码的第一个字节,以0x00作为结束符号。在这个case中需要将存储在buffer1中的短消息中心
				号码通过AT+CSCA指令进行SIM设置。
\********************************************************/
void Case2_GSM_OTHER(void)
{
	unsigned int i=0,j=0,k=0;
	static unsigned char CSQ_Single_Error=0;

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

	/********************************************************\
	1,gGSM_OTHER_Step=1的时候,判断是否在这个case中进行处理
		A:如果无电话方面的业务,满足一定时间间隔查询信号,则进行AT+CSQ的指令操作
		B:判断是否有需要进行短消息中心号码的设置,如果判断有gInternal_Flag&SET_CSCA_F_1置位,则进行
			AT+CSCA的指令操作
		C:如果满足需要恢复语音方面的设置(监听后的的模块语音方面的参数设置)
	\********************************************************/
	else if(gGSM_OTHER_Step==1)
	{

⌨️ 快捷键说明

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