?? do_m22.c
字號:
/********************************************************\
* 文件名: Do_GSM.C
* 創建時間:2004年12月7日
* 創建人:
* 版本號: 1.00
* 功能: 針對GSM模塊進行的一些操作,包括發送數據和接收數據
* 文件屬性:公共文件
* 修改歷史:(每條詳述)
\********************************************************/
#include <msp430x14x.h>
#include "Other_Define.h"
#include "General.h"
#include "SPI45DB041.h"
#include "Define_Bit.h"
#include "D_Buffer.h"
#include "Uart01.h"
#include "M22_AT.h"
#include "Check_GSM.h"
#include "Sub_C.h"
#include "Do_Reset.h"
#include "W_Protocol.h"
#include "TA_Uart.h"
#include "Handle_Protocol.h"
#include "Do_Handle.h"
#include "Do_SRAM.h"
#include "Do_M22.h"
/*
#include "Do_Record.h"
#include "Record_Protocol.h"
#include "Main_Init.h"
#include "Disp_Protocol.h"
*/
#define Debug_GSM_COM1
void Case1_GSM_PHONE(void);
void Case1_PHONE_Out(void);
void Case2_GSM_OTHER(void);
void Case2_OTHER_Out(void);
void Case3_GSM_SMS_IN(void);
void Case3_SMSIN_Out(void);
void Case4_GSM_SMS_OUT(void);
void Case4_SMSOUT_Out(void);
void Case4_OverTime_Out(unsigned char Clear_Flag);
void Case5_LAND_GPRS_OPER(void);
void Case6_GPRS_DATA_OPER(void);
void Send_Type1_GSM_Data_One(unsigned char S_Address);
void Send_Type1_GSM_Data_Two(unsigned char S_Address);
void Send_Circle_GSM_TypeD(void);
void Send_Circle_TCP_TypeD(void);
void Send_Circle_GSM_TypeE(void);
void Send_Circle_TCP_TypeE(void);
void Case_OverTime_Return(void);
//作為音量四個檔位(起作用的也就是后面的四個數,前一個數的存在是為了使數組的下標和音量值想對應上)
/********************************************************\
* 函數名:Do_G20_Out
作用域:外部文件調用
* 功能:
* 參數:
* 返回值:
* 創建人:
*
* 修改歷史:(每條詳述)
A,表示GSM工作方式
B,表示TCP掛起的工作方式
C,表示TCP在線的工作方式
補充說明:因為根據M22模塊的特性:幾個CASE的功能
1,處理與電話相關的業務(AB),
2,處理與CSQ方面的查詢(AB)
3,SMS的接收(中斷方式接收處理)(AB)
4,SMS的發送操作(A)
5,處理需要TCP登陸,TCP退出,TCP在線。
6,TCP在線狀態下進行TCP的數據業務
根據M22的相關特性:則可以分為如下幾種操作方式
正常的工作流程:
設備啟動后:如果根據條件需要進行TCP登陸的話
1-2-3-4-5(登陸)--6(發送登陸信息)---等待登陸響應----(A)接收到響應(A01)6(循環處理)(A02)CSQ查詢時間到(A03)+++掛起(A03)2---(A04)6(循環處理)
---
---(A011)判斷有電話相關的業務(撥出號碼和電話打入)--(A012)+++掛起---1()
----(B)未接收到響應(B01)6(發送登陸信息)--等待登陸響應
具體的的工作方式:
1,設備上電,啟動M22,進入GSM的工作方式:
2,如果判斷設備判斷有報警信息(報警信息默認為30秒的周期發送),
同時IP地址有效,TCP處于開啟狀態,則需要在啟動M22工作后,
進行TCP登陸操作,此時需要TCP一直在線,進行發送報警信息
3,如果判斷設備有需要發送行車軌跡數據,同時IP地址有效,TCP處于開啟狀態,
則也需要在啟動M22工作后,進行TCP登陸操作,此時又分兩重情況
如果發送軌跡數據的周期如果小于3分鐘,則屬于一直在線狀態),而如何
發送行車軌跡數據的周期大于等于3分鐘,則在需要發送軌跡數據的時刻
才進行登陸操作,然后進行發送數據。發送完數據后,則立即退出TCP在線。
4,如果屬于TCP一直在線的狀態,則每間隔一定時間將TCP掛起,進行CSQ的查詢
登陸TCP的工作流程:如果登陸上TCP,并且通過TCP發送登陸信息后,等待返回登陸響應
如果超過一定時間未返回登陸響應,則繼續發送登陸信息。如果連續5次均為發送登陸信息后
仍無登陸響應,則退出TCPZ狀態,重新進行TCP登陸
\********************************************************/
void Do_G20_Out(void)
{
switch(gGSM_Oper_Type)
{
/*
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1,GSM_PHONE:主要是針對電話語音方面的處理,撥號,接聽,掛機,DTMF,音量調節。根據M22的特殊性,如果TCP
在線的狀態下,必須要先退出TCP在線,然后才能進行相關電話業務的處理
只有在GSM的工作方式下執行這個指令
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
*/
case GSM_PHONE:
{
Case1_GSM_PHONE();
break;
}
/*
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2,GSM_OTHER:沒電話的時候CSQ的查詢,根據M22的方式,則可以不通過查詢CLCC來確定電話業務的狀態
在GSM和TCP掛起的狀態下執行
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
*/
case GSM_OTHER:
{
Case2_GSM_OTHER();
break;
}
/*
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3,GSM_SMS_IN:因為M22的接收SMS的方式采用的是中斷方式,則直接在中斷處理中處理,則可以不處理這個模塊
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
*/
case GSM_SMS_IN:
{
Case3_GSM_SMS_IN();
break;
}
/*
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4,GSM_SMS_OUT:主要處理M22通過GSM方式發送數據包,只有在GSM工作方式下
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
*/
case GSM_SMS_OUT:
{
Case4_GSM_SMS_OUT();
break;
}
/*
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5,CHECK_GPRS_LINK:專門用于進行退出TCP和登陸TCP的操作流程,或者重新執行進入TCP的操作
在GSM工作方式和TCP掛起的方式下
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
*/
case LAND_TCP_OPER:
{
Case5_LAND_GPRS_OPER();
break;
}
/*
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
6,GPRS_DATA_OPER:M22的TCP方式發送和接收數據(),如果需要退出的時候進行AT指令的其他操作的時候,則需要
先將TCP掛起,可以進行接收SMS,或者發送SMS。如果是電話業務,則需要掛起后,然后退出TCP登陸,才可以進行
電話方面的相關業務
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
*/
case GPRS_DATA_OPER:
{
Case6_GPRS_DATA_OPER();
break;
}
default:
break;
}
}
/********************************************************\
* 函數名:Case1_GSM_PHONE
作用域:本地文件調用
* 功能:Do_G20_Out模塊中的一個case執行模塊,主要是針對電話語音方面的處理,撥號,接聽,掛機,DTMF,音量調節方面的處理。
*
參數: 只有在滿足能進入這個case的條件時候,才能進入執行這個模塊,
* 返回值:不同的情形是需要對不同的全局變量進行重新附值
* 創建人:
*
* 修改歷史:(每條詳述)
補充說明: 手柄相關的AT指令存儲在buffer1中的0x5D----0x7A區域。第一個字節0x5D存儲0或者1,為0則表示
后面的數據已經處理,為1則表示后面的數據未處理。0x5E存儲相關的AT指令的類型,如掛機,撥號等
后面如果還有數據(電話號碼等)最后數據結束以0X00作為結束標志處理。
改為M22模塊后,因為其特性,在這個CASE中需要增加一些處理:
1,如果有手柄或者監聽對外撥號的信令,同時如果M22處于TCP在線且被掛起的狀態,則需要先執行ATH指令,退出TCP
狀態,然后才能進行撥號處理
\********************************************************/
void Case1_GSM_PHONE(void)
{
unsigned int i=0,j=0,k=0,n=0;
unsigned char Phone_s=0;
unsigned char Phone_e=0;
OperateSPIEnd();
//判斷監聽完后,是否需要恢復語音通道的處理
if( ( (gGeneral_Flag&TCP_PHONE_F_1)==0)&&(gGeneral_Flag&MONITOR_RESUME_F_1) )
{
gTimer=0;
while(gTimer<200){Check_GSM();}
Send_COM0_String((unsigned char *)AT_AUGAIN,sizeof(AT_AUGAIN));
Send_COM0_Byte('1');Send_COM0_Byte(',');
Send_COM0_Byte('5');Send_COM0_Byte(0x0d);
gInternal_Flag&=~M22_RETURN_OK_1;
Wait_OK();
if( (gInternal_Flag&M22_RETURN_OK_1)==0 );
else
{
//2,固定調節SPEKER的接收增益
gTimer=0;
while(gTimer<200){Check_GSM();}
Send_COM0_String((unsigned char *)AT_AUGAIN,sizeof(AT_AUGAIN));
Send_COM0_Byte('2');Send_COM0_Byte(',');Send_COM0_Byte(Handle_VOL[TWO]);Send_COM0_Byte(0x0d);
gInternal_Flag&=~M22_RETURN_OK_1;
Wait_OK();
if( (gInternal_Flag&M22_RETURN_OK_1)==0 );
else
{
//3,調節AT$AUVOL的接收增益
gTimer=0;
while(gTimer<200){Check_GSM();}
Send_COM0_String((unsigned char *)AT_AUVOL,sizeof(AT_AUVOL));
Send_COM0_Byte('5');Send_COM0_Byte(0x0d);
gInternal_Flag&=~M22_RETURN_OK_1;
Wait_OK();
if( (gInternal_Flag&M22_RETURN_OK_1)==0 );
else
{
gGeneral_Flag&=~MONITOR_RESUME_F_1;
P6OUT&=~SEL_MIC;
Send_COM3_Load(4,MAIN_HANG_UP,0);
gSys_Handle=MAIN_HANG_UP;
}
}
}
}
OperateSPIEnd();
//返回退出電話相關業務的CASE結構的滿足條件:唯一正常的跳出此
if( (SRAM_Read(PHONE_AT_2)!=VAILD_2)
&&( (gPhone_Status==ACTIVE_HANDLE)||(gPhone_Status==ACTIVE_MONITOR)||(gPhone_Status==READY) ) )
{
if( (gGeneral_Flag&RING_F_1)==0 )
{
gGSM_Oper_Type=GSM_OTHER;
gGSM_OTHER_Step=0;gPhone_Step=0;
gTimer_GSM_AT=0;
Check_GSM();
gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;
OperateSPIEnd();
return;
}
}
//如果buffer1中有相應的處理數據
if( (gInternal_Flag&GSM_ONEAT_SUCCESS_1)==0 )
{
if( gTimer_GSM_AT>600)
{
gTimer_GSM_AT=0;
SRAM_Init();
j=SRAM_Read(PHONE_AT_2);
if(j==VAILD_2)
{
i=SRAM_Read(PHONE_AT_2+1);
if (i==H_DIAL) gPhone_Step=1; //手柄撥號
else if(i==M_DIAL) gPhone_Step=5; //監聽撥號
else if(i==H_ANSWER) gPhone_Step=10; //手柄接聽
else if(i==H_DTMF) gPhone_Step=11; //手柄DTMF撥號
else if(i==H_VOLADJ) gPhone_Step=12; //手柄調節音量
else if(i==H_HUNGUP) gPhone_Step=13; //手柄掛機
else
{
Check_GSM();
SRAM_Init();
SRAM_Write(PHONE_AT_2,NULL_2);
SRAM_Write(PHONE_AT_2+1,0);
}
}
}
else if(gGeneral_Flag&RING_F_1)
{
//判斷是否有來電顯示
//+CLIP: "13670155704",129,,,,0
if( Check_GSM()!=0 )
{
if(Compare_String(gGeneral_Buffer,(unsigned char *)String_CLIP,sizeof(String_CLIP))!=0)
{
gStatus1_Flag|=PHONE_ONLINE_F_1;
j=SRAM_Read(PHONE_AT_2+0);
i=SRAM_Read(PHONE_AT_2+1);
if((i==H_HUNGUP)&&(j==VAILD_2));
else
{
i=5;
gPublic_Flag&=~ALLOW_PHONE_IN_F_1;
while(1)
{
if(gGeneral_Buffer[i]=='"') break;
i++;if(i>15) return;
}
i++;
Phone_s=i; //第一個號碼的位置序號
SRAM_Init();
SRAM_Write(SHANDLE_DATA_VAILD+0,VAILD_2);
SRAM_Write(SHANDLE_DATA_VAILD+1,0x24);
SRAM_Write(SHANDLE_DATA_VAILD+2,0x14);
SRAM_Write(SHANDLE_DATA_VAILD+3,MAIN_PHONE_IN);
j=i+16;
k=0;
while(1)
{
if(gGeneral_Buffer[i]!='"')
{
SRAM_Write(SHANDLE_DATA_VAILD+4+k,gGeneral_Buffer[i]);
i++;k++;
if(i>j)
{
n=0;
break;
}
}
else
{
n=k;
break;
}
}
Phone_e=i-1; //號碼最后一個位的序號
for(k=i;k<j;k++)
{
SRAM_Write(SHANDLE_DATA_VAILD+4+n+(k-i),0x20);
}
SRAM_Write(SHANDLE_DATA_VAILD+4+n+j-i,0x0d);
gPhone_Status=INCOMING;
//判斷比較是否與Flash中存儲的中心服務號碼相同
if( ((gON_OFF_Temp0&PHONE_IN_ON)==0)
&&((gCommon_Flag&CHECK_RINGPHONE_F_1)==0 ) )
{
for(i=0;i<Phone_e-Phone_s;i++)
{
gGeneral_Buffer[i]=gGeneral_Buffer[Phone_s+i];
}
i=1;
i=Check_Allow_Phone(Phone_e-Phone_s);
//與匹配的號碼不一樣
if(i==1) gPublic_Flag&=~ALLOW_PHONE_IN_F_1;
//與匹配的號碼一樣
else gPublic_Flag|=ALLOW_PHONE_IN_F_1;
gCommon_Flag|=CHECK_RINGPHONE_F_1;
}
}
gPhone_Status=INCOMING;
}
}
}
}
/********************************************************\
\********************************************************/
//1,手柄撥號處理
if(gPhone_Step==1)
{
gPhone_Step=4;gTimer_GSM_AT=0;
}
else if(gPhone_Step==4)
{
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));
}
OperateSPIEnd();
Send_COM0_Byte(';');
Send_COM0_Byte(0x0d);
gInternal_Flag|=GSM_ONEAT_SUCCESS_1;
gPhone_Step=14;
gTimer_GSM_AT=0;
gGeneral_Flag|=DAILING_UP_F_1;
gGeneral_Flag|=TCP_PHONE_F_1;
gHangUp_Timer=0;
gPhone_Status=DAILING;
SRAM_Init();
SRAM_Write(PHONE_AT_2+0,NULL_2);
SRAM_Write(PHONE_AT_2+1,0);
for(i=PHONE_AT_2+1;i<ECHO_SMS_2;i++)
{
SRAM_Write(i,0);
}
gStatus1_Flag|=PHONE_ONLINE_F_1;
}
else Case1_PHONE_Out();
}
else Check_GSM();
}
/********************************************************\
2,監聽撥號處理()如果屬于是監聽處理,則先處理將麥克的增益調節最大
將,然后將SPEAKER的接收增益調節為關閉狀態,然后控制模擬開關的通道轉換
\********************************************************/
else if(gPhone_Step==5)
{
if( gTimer_GSM_AT>400 )
{
if(gPhone_Status==READY)
{
gTimer=0;
while(gTimer<200){Check_GSM();}
Send_COM0_String((unsigned char *)AT_AUGAIN,sizeof(AT_AUGAIN));
Send_COM0_Byte('1');Send_COM0_Byte(',');
Send_COM0_Byte('9');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
{
//2,固定調節SPEKER的接收增益為1
gTimer=0;
while(gTimer<200){Check_GSM();}
Send_COM0_String((unsigned char *)AT_AUGAIN,sizeof(AT_AUGAIN));
Send_COM0_Byte('2');Send_COM0_Byte(',');Send_COM0_Byte('1');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;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -