📄 check_gsm.c
字号:
}
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 + -