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

📄 check_gsm.c

📁 车载GPS监控终端的完整代码,与监控中心的通讯采用GPRS.
💻 C
📖 第 1 页 / 共 5 页
字号:
					}
					else
					{
						Send_COM1_String((unsigned char *)TCP_TEST,sizeof(TCP_TEST));
						j = gReceive0_GSM_Buffer_Move;
						for(x=0;x<2;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;
						gFF0D_Receive_Timer=0;
						nFlag=1;
					}
					break;
				}
				//判断是否出现TCP掉线信息
				//0D 0A 4F 4B 0D 0A 0D 0A 43 4F 4E 4E 45 43 54 0D 0A 0D 0A 4F
				//4B 0D 0A 0D 0A 4F 4B 0D 0A 0D 0A 4E 4F 20 43 41 52 52 49 45 52 0D 0A
				else if( (gGeneral_Buffer[k]==0x4E)
						 &&(gGeneral_Buffer[k+1]==0x4F)
						 &&(gGeneral_Buffer[k+2]==0x20)
						 &&(gGeneral_Buffer[k+3]==0x43)
						 &&(gGeneral_Buffer[k+4]==0x41)
						 &&(gGeneral_Buffer[k+5]==0x52)
						 &&(gGeneral_Buffer[k+6]==0x52)
						 &&(gGeneral_Buffer[k+7]==0x49)
						 &&(gGeneral_Buffer[k+8]==0x45)
						 &&(gGeneral_Buffer[k+9]==0x52)
						 &&(gGeneral_Buffer[k+10]==0x0D)
						 &&(gGeneral_Buffer[k+11]==0x0A) )
			 	{
			 		//如果满足条件,说明已经TCP断线
			 		Send_COM1_String((unsigned char *)TCP_QUIT,sizeof(TCP_QUIT));
					gGeneral_Flag&=~LAND_TCP_SUCCESS_F_1;
					gGSM_Oper_Type=GSM_PHONE;
					gM22_Status=GSM_WORK;
					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;
					gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;
					gPhone_Step=0;gTimer_GSM_AT=0;
			 		break;
			 	}
			}//for(k=0;k<i;k++)
		}//end while(j!=gReceive0_GSM_Buffer_Point)
	}//end	gM22_GSM_ECHO_Timer>100
	return(0);
}
/********************************************************\
*	函数名:Do_SMS_Receive
	作用域:本文件调用
*	功能:  在G20中用AT+CMGR指令读取出SMS的内容,接收并处理

*	参数:  iLength	 作为接收整个数据的长度,如下的例子此数据为64
        	iRLength 作为AT+CMGR读出返回SMS的长度为32
        	全局变量缓冲gGeneral_Buffer

*	返回值:这个模块是将返回数据区的值变换后存储在全局变量gGeneral_Buffer中,并调用
			Deal_Command()模块处理数据
*	创建人:
*
*	修改历史:(每条详述)
	//////////////////////////////////////////////////////////

	AT+CMGR=1
	+CMGR: 0,,24
	08                   0D
	0891683108705505F004 0D91683176105507F4 0008 40 0111900093000462 C94E01 (0D 0A)
	----------20-------- ---------20--------- ------20------------ -----8-------
	0891683108705505F0 04 0D91683128782840F9 0004 40 01 03 41 34 5400 0C FF4FB00800302E303002C40D

	i=HEX(GSM_Echo_Buffer[0],GSM_Echo_Buffer[1]);	读出值为08
	j=(i+2)*2;  20个  (0D的第一个地址)
	i=HEX(GSM_Echo_Buffer[j],GSM_Echo_Buffer[j+1]);	读出值为0D
	j=j+(i+1)/2*2+22; (02的第一个地址)
	i=HEX(GSM_Echo_Buffer[j],GSM_Echo_Buffer[j+1]); 读出值为0C,后面的为数据包的内容
	j++;
	j++;



	+CMT: ,032
	0891683108705505F0040D91683128782840F90004503011613495000CFF000000000000000000001B
\********************************************************/
void Do_SMS_Receive(unsigned int iLength,unsigned char iRLength)
{
	unsigned int i,j,k;
	unsigned int m,n;
	unsigned char y;
	//判断SMS的长度与接收的数据是否符合,整个数据包是否收全。iLength为收到的数据包长
	//如上例中iRLength=24,iLength=68
	if(ASCIITOHEX(gGeneral_Buffer[0],gGeneral_Buffer[1])+iRLength+2==iLength/2)
	{
		//将内容提取出来仍然存储在General_Buffer[]缓冲中
	    i=ASCIITOHEX(gGeneral_Buffer[0],gGeneral_Buffer[1]);
	    j=(i+2)*2;
	    i=ASCIITOHEX(gGeneral_Buffer[j],gGeneral_Buffer[j+1]);

	    //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	    for(m=0;m<sizeof(gNum_Phone_Temp);m++)	gNum_Phone_Temp[m]=0;
	    m=j;					//20
	    n=m+(i+1)/2*2+3;		//37
	    y=0;
		gNum_Phone_Temp[y]=0;
		y++;
		if(gGeneral_Buffer[2]=='9')
		{
			gNum_Phone_Temp[y]='+';
			y++;
		}
		m=j+4;
		while(1)
		{
			if(m<n)
			{
				gNum_Phone_Temp[y]=gGeneral_Buffer[m+1];
				y++;
				gNum_Phone_Temp[y]=gGeneral_Buffer[m];
				y++;
				m++;m++;
			}
			else if(m==n)
			{
				gNum_Phone_Temp[y]=gGeneral_Buffer[m];
				y++;
				m++;
			}
			else break;
		}
		for(m=2;m<y;m++)
		{
			if( (gNum_Phone_Temp[m]>'9')||(gNum_Phone_Temp[m]<'0') )
			break;
		}
		gNum_Phone_Temp[0]=m-1;
		if(gNum_Phone_Temp[0]>14)	gNum_Phone_Temp[0]=0;
		/*
		//显示出当前的号码存储的是否正确
	    Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
		Send_COM1_Byte(ASCII(gNum_Phone_Temp[0]/10));
		Send_COM1_Byte(ASCII(gNum_Phone_Temp[0]%10));
		Send_COM1_Byte('<');
		for(m=1;m<=gNum_Phone_Temp[0];m++)
		{
			Send_COM1_Byte(gNum_Phone_Temp[m]);
		}
		Send_COM1_Byte('>');
		Send_COM1_Byte(0x0d); Send_COM1_Byte(0x0a);
		*/
		//现在在缓冲gNum_Phone_Temp[]中存储的是这个的信息的来源号码
	    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	    j=j+(i+1)/2*2+22;
	    i=ASCIITOHEX(gGeneral_Buffer[j],gGeneral_Buffer[j+1]);//表示数据区数据的长度
	    //这个时候,j所指向的是数据区的第一个字节,开始转移
	    //存储整个数据区的长度,不包括记录长度的第一个字节
	    gGeneral_Buffer[0]=i;
		for(k=1;k<=i;k++)
		{
			gGeneral_Buffer[k]=ASCIITOHEX(gGeneral_Buffer[j+2*k],gGeneral_Buffer[j+2*k+1]);
		}
		Deal_Command();
	}
}
/********************************************************\
*	函数名:Do_GPRS_Receive
	作用域:本文件调用
*	功能:
*	参数:  全局变量缓冲gGeneral_Buffer

*	返回值:
*	创建人:
*
*	修改历史:(每条详述)
\********************************************************/
void Do_GPRS_Receive(void)
{
	Deal_Command();
}
/********************************************************\
*	函数名:Deal_Command
	作用域:本文件调用
*	功能:	通过掉用Check_Command模块,进行下行协议的分析,根据不同的协议命令,
			在这个模块中进行相应的处理和操作,具体见每个不同命令的详细描述
*	参数:  全局变量缓冲gGeneral_Buffer[]

*	返回值:根据不同,需要对一些全局变量重新进行附值操作(详细见不同命令的处理方式)
*	创建人:
*
*	修改历史:(每条详述)
    详细说明:
	Deal_Command();模块程序说明:已经通过程序知道了命令字,则需要进行针对不
						同的命令字进行相应的操作
	说明:不管是从GSM还是GPRS接收来的数据最后在运行这个子程序的时候,General_Buffer
		缓冲中存储数据包的格式是一样的,举例:
	0891683108705505F004 0D91683176105507F400 0840907271356100 02 00 41 (0x0d 0x0a)
	08                   0D                                    02
	这是从GSM接收到的数据,最后处理完成的结果General_Buffer缓冲中存储的结果为
	gGeneral_Buffer[0]=2   (长度)
	gGeneral_Buffer[1]=0
	gGeneral_Buffer[2]=41
	同样道理GPRS接收的数据
	+MIPRTCP: 1,0,0041
	gGeneral_Buffer[0]=2   (长度)
	gGeneral_Buffer[1]=0
	gGeneral_Buffer[2]=41
\********************************************************/
void Deal_Command(void)
{
	unsigned char nCmd;
	unsigned char nSpeed=0;
//	Send_COM1_Byte('S');
	#ifdef Debug_GSM_COM1
	Send_COM1_Byte(ASCII(gGeneral_Buffer[0]/16));
	Send_COM1_Byte(ASCII(gGeneral_Buffer[0]%16));
	Send_COM1_Byte('[');
	for(nCmd=1;nCmd<=gGeneral_Buffer[0];nCmd++)
	{
		if(nCmd==0)	break;
		Send_COM1_Byte(ASCII(gGeneral_Buffer[nCmd]/16));
		Send_COM1_Byte(ASCII(gGeneral_Buffer[nCmd]%16));
		Clear_Exter_WatchDog();
	}
	Send_COM1_Byte(']');
	Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
	#endif

	nCmd=Check_Command();
	//补充说明:根据以前的兼容,则如果在上行的信息中,如果带有经度,纬度的上行数据,则在后面增加4个状态量的字节
	switch(nCmd)
	{//内容由开发者自己加入
		//1,车辆登陆响应(不加状态位)
		case	VEHICLE_ENTRY_ECHO_DOWN:
		{
			break;
		}
		//2,车辆参数设置(不加状态位)
		case	PARAMETER_SET_DOWN:
		{
			break;
		}
		//3,设置上传位置时间间隔 (不加状态位,从新写)
		case	TIME_INTERVAL_DOWN:
		{
			break;
		}
		//4,设置服务器地址,端口 (不加状态位)
		case	SET_ADDRESS_PORT_DOWN:
		{
		        break;
		}
		//5,车辆定位查询 ( 加状态位 )
		case 	POSITION_ASK_DOWN:
		{
			break;
		}
		//6,报警应答(不加状态位)
		case	ALARM_ECHO_DOWN:
		{
			break;
		}
		//7,车辆监听(不加状态位)
		case	VEHICLE_MONITOR_DOWN:
		{
			break;
		}
		//8,外接部件的相关命令(不加状态位)
		case	EXTER_EQUIPMENT_DOWN:
		{
			break;
		}
		//9-0,和显示终端相关的相关的命令(文字信息的处理)(不加状态位)
		case	WORD_INFORMATION_DOWN:
		{
			break;
		}
		//9-1,下载动态菜单
		case	SET_MENU_DOWN:
		{
			break;
		}
		//9-2,下载设定短消息的下行命令
		case	SET_SMS_COMMAND_DOWN:
		{
			break;
		}
		//10,出城登记响应(不加状态位)
		case	OUTCITY_ECHO_DOWN:
		{
			break;
		}
		//11,历史轨迹查询的下行命令(不加状态位),
		case	TRACK_ASK_DOWN:
		{
			break;
		}
		//12,接收下行的设置终端进入/退出状态的命令	(不加状态位)从新写
		case	SET_TCP_ONOROFF_DOWN:
		{
			break;
		}
		//13,车载终端的版本查询 (不加状态位)
		case	QUERY_VERSION_DOWN:
		{
			break;
		}
		//14,车辆允许退出TCP登陆的响应(不加状态位)
		case	ALLOW_TCP_QUIT_ECHO_DOWN:
		{
			break;
		}
		//15,中心提取解除设防密码的下行命令(不加状态位)
		case	PASSWORD_ASK_DOWN:
		{
			break;
		}
		//16,中心强制设防或者解除设防状态的下行命令(不加状态位)
		case	FORCE_FORTIFY_DOWN:
		{
			break;
		}
		//17,中心强制制动的下行命令(不加状态位)
		case	SET_STOP_COMMAND_DOWN:
		{
			break;
		}
		//18,中心强制解除制动的下行命令(不加状态位)
		case	FREE_STOP_COMMAND_DOWN:
		{
			break;
		}
		//19,收到设置最大时速的下行命令
		case	SET_MAXSPEED_DOWN:
		{
			break;
		}
		//20,设置电话的权限的下行命令
		case	SET_PHONE_LIMIT_DOWN:
		{
			break;
		}
		//21,收到重新设置里程初始值的下行命令
		case	SET_DISTANCE_INIT_DOWN:
		{
			break;
		}
		//22,设置中心服务号码
		case	SET_CENTER_NUM_DOWN:
		{
			break;
		}
		//23,设置区域参数的设置
		case	SET_ALLOW_AREA_DOWM:
		{
			break;
		}
		//24,设置间隔距离的参数
		case	SET_DISTANCE_DATA_DOWN:
		{
			break;
		}
		//25,接收到下行的电话号码本的参数
		case	CARRY_PHONE_NUM_DOWN:
		{
			break;
		}
		//26,接收到重点监控的命令
		case	VEHICLE_WATCH_DOWN:
		{
			break;
		}
		//27,接收到线路偏离数据的命令
		case	LINE_DATA_DOWN:
		{
			break;
		}
		//28,接收到线路偏离数据的距离限制值的设置
		case	LINE_LIMIT_DISTANCE_DOWN:
		{
			break;
		}
		//29,收到测试信息的测试SMS
		case	TEST_SMS_COMMAND_DOWN:
		{
			break;
		}
		default:
		{
			break;
		}
	}
}

⌨️ 快捷键说明

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