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