📄 check_gsm.c
字号:
/********************************************************\
* 文件名: Check_GSM.C
* 创建时间:2004年12月7日
* 创建人:
* 版本号: 1.00
* 功能:
* 文件属性:特殊文件
* 修改历史:(每条详述)
\********************************************************/
#include <msp430x14x.h>
#include "Uart01.h"
#include "General.h"
#include "Define_Bit.h"
#include "Sub_C.h"
#include "M22_AT.h"
#include "Check_GSM.h"
#include "W_Protocol.h"
#include "SPI45DB041.h"
#include "D_Buffer.h"
#include "Other_Define.h"
#include "TA_Uart.h"
#include "Handle_Protocol.h"
#include "Disp_Protocol.h"
#include "Do_Handle.h"
#include "Do_SRAM.h"
/*
#include "Main_Init.h"
#include "Do_Reset.h"
#include "Do_GSM.h"
#include "Msp430_Flash.h"
*/
#define Debug_GSM_COM1
void Do_SMS_Receive(unsigned int iLength,unsigned char iRLength);
void Do_GPRS_Receive(void);
void Deal_Command(void);
unsigned char Check_Command(void);
void IP_SOCKET_Switch(void);
void Do_Parameter_Set(void);
void Position_Echo(void);
void Pass_Data_Echo(void);
void Set_Cycle_Timer(void);
void Disp_Dispaly_Info(void);
void Set_TCP_OnOrOff(void);
void Query_SYS_Ver(void);
void Deal_Alarm_Echo(void);
void Deal_Vehicle_Monitor(void);
void Set_Phone_Limit(void);
void Set_Area_Limit(void);
void Send_RecordData(void);
void Set_Distance_Par(void);
void Set_Phone_Num(void);
void Watch_Way(void);
void Line_Data_Deal(void);
//unsigned char Do_Deal_Area(unsigned char Add_Flash,unsigned char Add_Buffer );
/********************************************************\
* 函数名:Check_GSM
作用域:外部文件调用
* 功能: 判断处理GSM接收缓冲gReceive0_GSM_Buffer中的数据,如果判断有0x0d,0x0a表示有
一包GSM数据返回。将这一包数据转移到处理缓冲gGeneral_Buffer中进行处理
* 参数: 全局变量:GSM的接收缓冲gReceive0_GSM_Buffer[],指针gReceive0_GSM_Buffer_Move
gReceive0_GSM_Buffer_Point。
数据处理缓冲gGeneral_Buffer[]
* 返回值:0:表示对GSM数据接收缓冲未做任何处理
1:表示转移一包数据,并处理完成
其中在返回的过程中,有写特殊的出口处理,需要对一些全局变量进行操作。具体见具体详细描叙
* 创建人:
*
* 修改历史:(每条详述)
\********************************************************/
unsigned int Check_GSM(void)
{
unsigned int i,j,k;
for(k=0;k<sizeof(gGeneral_Buffer);k++) gGeneral_Buffer[k]=0;
i = 0;
j = gReceive0_GSM_Buffer_Move;
if( gReceive0_GSM_Buffer_Point == gReceive0_GSM_Buffer_Move ) return(0);
gGeneral_Buffer[i] = gReceive0_GSM_Buffer[j];
i++;j++;
if( j >= sizeof(gReceive0_GSM_Buffer) ) j=0;
while(j!=gReceive0_GSM_Buffer_Point)
{
gGeneral_Buffer[i] = gReceive0_GSM_Buffer[j];
i++;j++;
if( i >= sizeof(gGeneral_Buffer) )
{
// Send_COM1_String((unsigned char *)R_OVERTOP,sizeof(R_OVERTOP));
for(i=0;i<sizeof(gGeneral_Buffer);i++) gGeneral_Buffer[i]=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;
return(0);
}
if( j >= sizeof(gReceive0_GSM_Buffer) ) j=0;
/********************************************************\
\********************************************************/
//判断有发送SMS的符号+++++++++++++++++++++++++++++++++++
if( (gGeneral_Buffer[i-1]==' ')&&(gGeneral_Buffer[i-2]=='>') )
{
#ifdef Debug_GSM_COM1
Send_COM1_String(gGeneral_Buffer,i);
#endif
gReceive0_GSM_Buffer_Move=j; //表示一包有效帧数据处理完
if(j==0) gReceive0_GSM_Buffer_End=sizeof(gReceive0_GSM_Buffer)-1;
else gReceive0_GSM_Buffer_End=j-1;
return(1);
}
//判断有一包有效帧数据++++++++++++++++++++++++++++++++++++
else if( (gGeneral_Buffer[i-1]==0x0a)&&(gGeneral_Buffer[i-2]==0x0d) )
{
#ifdef Debug_GSM_COM1
Send_COM1_String(gGeneral_Buffer,i);
#endif
gReceive0_GSM_Buffer_Move=j; //表示一包有效帧数据处理完
if(j==0) gReceive0_GSM_Buffer_End=sizeof(gReceive0_GSM_Buffer)-1;
else gReceive0_GSM_Buffer_End=j-1;
//*下面则是一个返回数据包在缓冲General_Buffer[]中,数据包的长度为i
/********************************************************\
1,判断是否有电话打入方面的处理:
RING
+CLIP: "13670155704",129,,,,0
+CLIP: "13670155704",129,,,,0
\********************************************************/
//***************************************************************************
if(Compare_String(gGeneral_Buffer,(unsigned char *)String_RING,sizeof(String_RING))!=0)
{
return(0);
}
else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_CLIP,sizeof(String_CLIP))!=0)
{
if( ((gGeneral_Flag&RESET_GSM_ON_F_1)==0 )
&&((gGeneral_Flag&LAND_TCP_F_1)==0)
&&((gInternal_Flag&GSM_ONEAT_SUCCESS_1)==0) )
{
if((gGeneral_Flag&RING_F_1)==0) gHangUp_Timer=0;
gGeneral_Flag|=TCP_PHONE_F_1;
gStatus1_Flag|=PHONE_ONLINE_F_1;
gGeneral_Flag|=RING_F_1;
return(1);
}
else return(0);
}
else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_BUSY,sizeof(String_BUSY))!=0)
{
return(1);
}
/********************************************************\
2,判断是否有AT打头的属于AT指令的返回方面的处理或者空行
比方说AT指令的回显字符,或者0x0d,0x0a
\********************************************************/
if(Compare_String(gGeneral_Buffer,(unsigned char *)String_AT,sizeof(String_AT))!=0)
{
return(0);
}
else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_END,sizeof(String_END))!=0)
{
return(0);
}
/********************************************************\
3,判断是否有NO CARRIER 返回的处理
\********************************************************/
else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_NOCARRIER,sizeof(String_NOCARRIER))!=0)
{
if( (gM22_Status==TCP_HANG_WORK) )
{
if( (gGeneral_Flag&TCP_PHONE_F_1)==0 )
{
gM22_Status=GSM_WORK;
gGSM_Oper_Type=GSM_PHONE;
gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;
gPhone_Step=0;gTimer_GSM_AT=0;
}
else
{
if(gPhone_Status==ACTIVE_MONITOR)
{
//监听结束
gPhone_Status=READY;
gGeneral_Flag&=~TCP_PHONE_F_1;
gStatus1_Flag&=~PHONE_ONLINE_F_1;
gGeneral_Flag|=MONITOR_RESUME_F_1;
P6OUT&=~SEL_MIC;
gGeneral_Flag|=TCP_STATUS_F_1;
}
else if( (gPhone_Status==ACTIVE_HANDLE)||(gGeneral_Flag&RING_F_1) )
{
//手柄通话结束
gPhone_Status=READY;
gGeneral_Flag&=~RING_F_1;
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;
gGeneral_Flag|=TCP_STATUS_F_1;
}
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;
gGeneral_Flag|=TCP_STATUS_F_1;
gCommon_Flag&=~CHECK_RINGPHONE_F_1;
}
}
else if(gM22_Status==GSM_WORK)
{
if(gPhone_Status==ACTIVE_MONITOR)
{
//监听结束
gPhone_Status=READY;
gGeneral_Flag&=~TCP_PHONE_F_1;
gStatus1_Flag&=~PHONE_ONLINE_F_1;
}
else if( (gPhone_Status==ACTIVE_HANDLE)||(gGeneral_Flag&RING_F_1) )
{
//手柄通话结束
gPhone_Status=READY;
gGeneral_Flag&=~RING_F_1;
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;
//发送一个挂机信号给手柄
}
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;
gGeneral_Flag|=MONITOR_RESUME_F_1;
gCommon_Flag&=~CHECK_RINGPHONE_F_1;
}
return(1);
}
/********************************************************\
4,判断是否有+CMT: 返回的处理(属于中断接收SMS的信息处理)
+CMT: ,032
0891683108705505F0040D91683128782840F90004503011613495000CFF000000000000000000001B
\********************************************************/
else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_CMT,sizeof(String_CMT))!=0)
{
gSMS_In_Lenth=0;
j=4;k=0;
while(1)
{
if(gGeneral_Buffer[j]==',') {k=1;break;}
j++;
if(j>i) break;
}
if(k==1)
{
for(k=0;k<3;k++)
{
gSMS_In_Lenth*=10;
gSMS_In_Lenth=gSMS_In_Lenth+(gGeneral_Buffer[k+j+1]-0x30);
}
gInternal_Flag|=RECEIVE_SMS_F_1;
}
return(0);
}
else if(gInternal_Flag&RECEIVE_SMS_F_1)
{
gInternal_Flag&=~RECEIVE_SMS_F_1;
Do_SMS_Receive(i,gSMS_In_Lenth);
return(0);
}
/********************************************************\
5,其他
\********************************************************/
return(1);
}//end else if( (gGeneral_Buffer[i-1]==0x0a)&&(gGeneral_Buffer[i-2]==0x0d) )
}//end while
return(0);
}
/********************************************************\
* 函数名:Check_TCP
作用域:外部文件调用
* 功能:
* 参数: 全局变量:GSM的接收缓冲gReceive0_GSM_Buffer[],指针gReceive0_GSM_Buffer_Move
gReceive0_GSM_Buffer_Point。
数据处理缓冲gGeneral_Buffer[]
* 返回值:0:表示对GSM数据接收缓冲未做任何处理
1:表示转移一包数据,并处理完成
其中在返回的过程中,有写特殊的出口处理,需要对一些全局变量进行操作。具体见具体详细描叙
* 创建人:
*
* 修改历史:(每条详述)
补充说明:
\********************************************************/
unsigned int Check_TCP(void)
{
unsigned int i,j,k,x;
unsigned char nLength;
unsigned char nFlag;
nLength=0;
//已经100ms,未接收到M22的数据,则可以判断接收缓冲区中的数据
if(gM22_TCP_ECHO_Timer>60)
{
nFlag=0;
for(k=0;k<sizeof(gGeneral_Buffer);k++) gGeneral_Buffer[k]=0;
i = 0;
j = gReceive0_GSM_Buffer_Move;
if( gReceive0_GSM_Buffer_Point == gReceive0_GSM_Buffer_Move ) return(0);
gGeneral_Buffer[i] = gReceive0_GSM_Buffer[j];
i++;j++;
if( j >= sizeof(gReceive0_GSM_Buffer) ) j=0;
while(j!=gReceive0_GSM_Buffer_Point)
{
gGeneral_Buffer[i] = gReceive0_GSM_Buffer[j];
i++;j++;
if( i >= sizeof(gGeneral_Buffer) )
{
// Send_COM1_String((unsigned char *)R_OVERTOP,sizeof(R_OVERTOP));
for(i=0;i<sizeof(gGeneral_Buffer);i++) gGeneral_Buffer[i]=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;
return(0);
}
if( j >= sizeof(gReceive0_GSM_Buffer) ) j=0;
//如果能执行到这里,则已经将接收缓冲的数据转移到gGeneral_Buffer缓冲中。
for(k=0;k<i;k++)
{
//判断是否为下行的命令数据包
//例:FF 4F 0B 08 00 01 01 00 08 02 10 0D
if( (gGeneral_Buffer[k]==SOH) //判断包头
&&(gGeneral_Buffer[gGeneral_Buffer[k+3]+3]==EOT) //判断包尾
&&(gGeneral_Buffer[k+1]==(char)(~gGeneral_Buffer[k+2])) ) //判断命令字是否取反
{
// Send_COM1_String((unsigned char *)TCP_COMMAAND,sizeof(TCP_COMMAAND));
nLength=gGeneral_Buffer[k+3]+3+1; //分析有效数据包长度
j = gReceive0_GSM_Buffer_Move;
for(x=0;x<nLength+k;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;
//处理适合Do_GPRS_Receive()处理的gGeneral_Buffer缓冲数据安排
if(k==0)
{
for(x=nLength;x>=1;x--)
{
gGeneral_Buffer[x]=gGeneral_Buffer[x-1];
}
gGeneral_Buffer[0]=nLength;
}
else if(k>0)
{
gGeneral_Buffer[k-1]=nLength;
for(x=0;x<=nLength;x++)
{
gGeneral_Buffer[x]=gGeneral_Buffer[k-1+x];
}
}
gGeneral_Flag|=LAND_TCP_SUCCESS_F_1;
Do_GPRS_Receive();
nFlag=1;
break;
}
//判断是否为FF 0D的握手数据
else if( (gGeneral_Buffer[0]==0xFF)&&(gGeneral_Buffer[0+1]==0x0D) )
{
gGeneral_Flag|=LAND_TCP_SUCCESS_F_1;
gLand_Interval_Timer=0;
if(gFF0D_Receive_Timer<=2)
{
for(i=0;i<sizeof(gGeneral_Buffer);i++) gGeneral_Buffer[i]=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;
return(0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -