?? gprs003.c
字號:
CheckSum+=Temp_cArray[i];
}
Temp_cArray[14]=CheckSum;
Delay(100);
Tx_Head=Temp_cArray[0];
Data_Cmnd_Snd(15,&Temp_cArray[1],1,5);
/*Delay(200);
Tx_Head=Temp_cArray[0];
Data_Cmnd_Snd(15,&Temp_cArray[1],1,5);*/
Beat_Test_Start=1;
Beat_Test_Interval=12000;//20秒鐘自動檢測心跳
Beat_Test_Fail=0;
Beat_Rcved_Flag=0;
_NOP();
}
}
//==============================================
//函數:Inqury_Signal()
//功能:查詢當前GSM信號強度
//輸入:
//輸出:
//==============================================
void Inqury_Signal(void)
{
char *AT_CSQ="AT+CSQ\r";//檢測信號強度。
char i,CheckSum=0;
char Inqury_Counter=3;
char Temp;
Inqury_Again:;
Temp=Signal_Val;
Inqury_Signal_Flag=0;
AT_Set_Ok=0;
Rx1_Pointer=0;
Rx1_TimeOut_Flag=0;
Tx_Head=AT_CSQ[0];
Data_Cmnd_Snd(6,&AT_CSQ[1],1,40); //查尋信號強弱命令
Delay(200);
for(i=0;i<Rx1_Pointer;i++)//檢測信號強弱等級。
{
if((Rx1_Data_Buffer[i]=='+')&&(Rx1_Data_Buffer[i+1]=='C')&&(Rx1_Data_Buffer[i+2]=='S')&&(Rx1_Data_Buffer[i+3]=='Q'))
{
if((Rx1_Data_Buffer[i+4]==':')&&(Rx1_Data_Buffer[i+5]==32)) //冒號 空格
{
if(Rx1_Data_Buffer[i+7]!=',')//信號強度無
{
if(((Rx1_Data_Buffer[i+6]-48)==9)&&((Rx1_Data_Buffer[i+7]-48)==9))//沒有檢測到信號。
{
AT_Set_Ok=1;
P1OUT|=0X90;//LED4、LED5、LED6全黑(=99)
P2OUT|=0X01;
Signal_Val=0;//信號強度為0。
goto Signal000;
}
if(((Rx1_Data_Buffer[i+6]-48)>=2)&&((Rx1_Data_Buffer[i+7]-48)<=9))//信號強度大于20
{
AT_Set_Ok=1;
P1OUT&=0X7F;//LED4亮、強。(>20)
P2OUT|=0X01;
P1OUT|=0X10;
Signal_Val=Rx1_Data_Buffer[i+6]-48;//十位BCD碼
Signal_Val=Signal_Val<<4;//左移8位。
Signal_Val+=Rx1_Data_Buffer[i+7]-48;//個位BCD碼
if(Signal_Val>0x31)
Signal_Val=0x31;
goto Signal000;
}
if(((Rx1_Data_Buffer[i+6]-48)==1)&&((Rx1_Data_Buffer[i+7]-48)<=9))//信號強度
{
AT_Set_Ok=1;
P2OUT&=0XFE;//LED5亮、中。(>10<20)
P1OUT|=0X90;
Signal_Val=Rx1_Data_Buffer[i+6]-48;//十位BCD碼
Signal_Val=Signal_Val<<4;//左移8位。
Signal_Val+=Rx1_Data_Buffer[i+7]-48;//個位BCD碼
if(Signal_Val>0x19)
Signal_Val=0x19;
goto Signal000;
}
}
if(Rx1_Data_Buffer[i+7]==',')//信號強度小于10
{
AT_Set_Ok=1;
P1OUT&=0XEF;//LED6亮、低。(<10)
P2OUT|=0X01;
P1OUT|=0X80;
Signal_Val=Rx1_Data_Buffer[i+6]-48;//BCD碼
if(Signal_Val>9)
Signal_Val=0x09;
goto Signal000;
}
}
}
}
Signal000:
if(AT_Set_Ok==0)
Signal_Val=0x00;
AT_Set_Ok=0;
if(Signal_Val==0x00)
{
if((Inqury_Counter--)!=0)
{
for(i=0;i<20;i++)
{
Rx1_Data_Buffer[i]=0;
}
goto Inqury_Again;
}
}
if(Signal_Val==0x00)
{
if(Temp%2==0)
Temp+=1;
else
Temp-=1;
Signal_Val=Temp;
}
/*
User_Data[0]=User_Data[3]=0x68;//數據頭
User_Data[1]=User_Data[2]=11;//數據長度
User_Data[4]=0x5A; //控制字
User_Data[5]=0x99; //獲取終端地址低位
User_Data[6]=0x99; //獲取終端地址高位
User_Data[7]=0x06; //類型
User_Data[8]=0x82; //可變結構限定詞
User_Data[9]=0x05; //傳送原因
User_Data[10]=0x55; //數據單元標識L
User_Data[11]=0x30; //數據單元標識H
User_Data[12]=0x00; //記錄地址
User_Data[13]=(Signal_Val&0X0F)+0X30; //信號強度
User_Data[14]=((Signal_Val>>4)&0X0F)+0X30;
for(i=0;i<=10;i++)//計算102規約校驗和
{
CheckSum+=User_Data[4+i];
}
User_Data[15]=CheckSum;
User_Data[16]=0x16;
*/
User_Data[0] = 0x68;
User_Data[1] = 0x99;
User_Data[2] = 0x99;
User_Data[3] = 0x99;
User_Data[4] = 0x99;
User_Data[5] = 0x5E;
User_Data[6] = 0x00;
User_Data[7] = 0x68;
User_Data[8] = 0x0F;
User_Data[9] = 0x09; // 自定義數據幀數據區長度
User_Data[10]= 0x00;
User_Data[11] = 0x1A;
User_Data[12] = 0x82;
User_Data[13] = 0x20;
User_Data[14] = 0x99;
User_Data[15] = 0x12;
User_Data[16] = 0x34;
User_Data[17] = 0x56;
User_Data[18] = 0x78;
User_Data[19]=(Signal_Val&0X0F)+0X30; //信號強度
User_Data[20]=((Signal_Val>>4)&0X0F)+0X30;
for(i=0;i<=20;i++)//計算校驗和
{
CheckSum+=User_Data[i];
}
User_Data[21]=CheckSum;
User_Data[22]=0x16;
Data_Cmnd_Snd(22,User_Data,0,5);//向串口0發送信號強度數據,發送長度22
P5OUT|=0x80;//接收指示燈滅。
Rx1_TimeOut_Flag=0;
}
//==============================================
//函數:Rd_Parameter_Initial()
//功能:從EEPROM中讀取工作參數、IP地址、端口、SMS號碼等
// 初始化波特率、定時器等
//輸入參數:
//輸出參數:
//==============================================
char Read_Parameters_Initial(char Address)
{
char i,j;
Uint Temp2;
char *Cgdcont="AT+CGDCONT=1,"; //設置PDP通道
WDTCTL=WDTPW+WDTCNTCL;
Rd_Data(Address,91,Temp_iArray);//讀取0x06通訊口配置參數。
if(Temp_iArray[0]==0x2f)//尋找數據頭
{
if((Temp_iArray[2]==90)&&(Temp_iArray[5]==0xfd))//判斷數據長度、功能碼是否為設置命令。
{
for(i=0;i<=90;i++)
{
Temp_cArray[i]=Temp_iArray[i];
}
Cal_Crc(&Temp_cArray[1],88);//計算CRC
Temp2=Temp_cArray[89];//比較CRC
Temp2=Temp2<<8;
Temp2=Temp2+Temp_cArray[90];
if(CRC==Temp2)//若CRC相等,則讀出的數據正確。
{
Read_Flag=1; //從EEPROM中讀取的數據正確。
Work_Mode=Temp_cArray[6];//工作模式
for(i=0;i<=12;i++)//讀取APN名稱.
{
AT_CGDCONT[i]=*(Cgdcont+i);//="AT+CGDCONT=1,
}
AT_CGDCONT[13]=AT_CGDCONT[16]=0X22;
AT_CGDCONT[14]='I';
AT_CGDCONT[15]='P';
AT_CGDCONT[17]=',';
AT_CGDCONT[18]=0X22;
for(i=0;i<=19;i++)//讀取APN名稱.
{
if(Temp_cArray[7+i]!=0xFF)
AT_CGDCONT[i+19]=Temp_cArray[7+i];
else
break;
}
AT_CGDCONT[i+19]=0x22;
AT_CGDCONT[i+20]=0x0d;
for(j=i+21;j<=39;j++)//后面填零,以便計算長度.
{
AT_CGDCONT[j]=0;
}
WDTCTL=WDTPW+WDTCNTCL;
//============以下裝入IP地址================
for(i=0;i<=10;i++)//IP地址的AT命令。
{
AT_OpenIp0[i]=OpenIp[i];//
}
AT_OpenIp0[11]='"';
AT_OpenIp0[27]='"';
AT_OpenIp0[15]='.';
AT_OpenIp0[19]='.';
AT_OpenIp0[23]='.';
AT_OpenIp0[28]=',';
AT_OpenIp0[34]=0x0d;
for(i=0;i<=2;i++)//***.***.***.***IP地址格式。
{
AT_OpenIp0[12+i]=Temp_cArray[27+i];
}
for(i=0;i<=2;i++)//***.***.***.***IP地址格式。
{
AT_OpenIp0[16+i]=Temp_cArray[30+i];
}
for(i=0;i<=2;i++)//***.***.***.***IP地址格式。
{
AT_OpenIp0[20+i]=Temp_cArray[33+i];
}
for(i=0;i<=2;i++)//***.***.***.***IP地址格式。
{
AT_OpenIp0[24+i]=Temp_cArray[36+i];
}
for(i=0;i<=4;i++)//數據服務中心通信端口號。
{
AT_OpenIp0[29+i]=Temp_cArray[39+i];
}
//====IP地址處理結束======。
TCP_UDP=Temp_cArray[44];//網絡數據傳輸協議。
Heart_Beat_Time=Temp_cArray[56];//心跳周期
for(i=0;i<=5;i++)
{
PassWord[i]=Temp_cArray[57+i];//模塊設置密碼
}
for(i=0;i<=5;i++)
{
Terminal_SIM[i*2+1]=Temp_cArray[45+i*2];//數據終端手機號碼,位置交換。
Terminal_SIM[i*2]=Temp_cArray[45+i*2+1];
Center_SIM[i*2+1]=Temp_cArray[74+i*2]; //短信通信手機號碼。位置交換。
Center_SIM[i*2]=Temp_cArray[74+i*2+1];
Data_Center_Sim[i*2+1]=Temp_cArray[74+i*2];//報警數據中心手機號碼。位置交換。
Data_Center_Sim[i*2]=Temp_cArray[74+i*2+1];
}
Terminal_SIM[10]='F';
Center_SIM[10]='F';
Data_Center_Sim[10]='F';
WDTCTL=WDTPW+WDTCNTCL;
for(i=0;i<=3;i++)//短信服務中心號碼的區號
{
SCA_SIM[i]=Temp_cArray[63+4+i];
}
_NOP();
}
}
}
if(Read_Flag==0)//若未進行初始化過或讀取參數不對,則工作于GSM+SMS模式、9600波特率。
{
Work_Mode=0x02;
}
WDTCTL=WDTPW+WDTCNTCL;
_3NOP();
Timer_Initial(); //初始化TIMERA。
_3NOP();
USART0_Initial();
_3NOP();
USART1_Initial();//串行口1初始化:無校驗,9600、8位數據位、1位停止位。
_3NOP();
_EINT(); //開放全局中斷
_3NOP();
WorkMode_Initial_Log();//初始化GPRS工作方式、登陸CMNET、連接中心IP等。
return Read_Flag;
}
//=============================================
//函數:WorkMode_Initial_Log()
//功能:GPRS工作模式初始化、連接(若工作于GPRS模式)
//輸入參數:
//輸出參數:
//==============================================
void WorkMode_Initial_Log(void)
{
char i;
char *AT_CNMI="AT+CNMI=3,2,0,1\r";//SMS串口接收
char AT_CNMI01[16]={'A','T','+','C','N','M','I','=','3',',','1',',','0',',','0',0x0D};//GPRS+SMS模式
char AT_CBST[15]={'A','T','+','C','B','S','T','=','7',',','0',',','1',',',0X0D};//數據撥號類型。
char AT_CPMS01[23]={'A','T','+','C','P','M','S','=',
'"','S','M','"',',','"','S','M','"',',','"','S','M','"',0X0D};
char *AT_CRC="AT+CRC=1\r";//區分是語音來電、還是數據來電。
char *AT_S00="ATS0=0\r";
char *AT_S02="ATS0=2\r";
char *AT_IpParameters="AT*E2IPS=2,10,1,512\r";//等待2秒,重試10次,100毫秒,緩沖區512字節
char AT_SCA[25]={'A','T','+','C','S','C','A','=',
'"','+','8','6','1','3','8','0','0','5','7','1','5','0','0','"',0x0d};
char *AT_Ring="AT*E2SMSRI=500\r";
//char *AT_PRn="AT*EPNR=2,1,8\r";
WDTCTL=WDTPW+WDTCNTCL;
SMS_Mode=0xFF;
//SMS_Index=0;
Command_Data_Status=0;//在命令行狀態。
AT_Test_Flag=0;
First_Connect_Flag=1;
Read_SMS_Time=60000;//10;
P1OUT|=0X40;
P2OUT|=0X02;
for(i=0;i<=3;i++)
{
AT_SCA[16+i]=SCA_SIM[i];
}
for(i=0;i<=3;i++)
{
Gprs_At_Command(sizeof(AT)+1,AT,30);//AT命令,測試GPRS.
if(AT_Test_Flag==0)//若AT測試命令沒有返回并且GPRS電源打開。
{
P4OUT|=0X02; //回到命令狀態。
Delay(200);
TXBUF1=0X1B;
Delay(10);
Gprs_At_Command(sizeof(AT_3Plus)+1,AT_3Plus,30);
}
else
break;
}
Gprs_At_Command(12,AT_Echo,30);//命令不返回,結果碼格式為字符、DTR控制、DCD指示。
Inqury_Signal();
Gprs_At_Command(10,AT_CMGF,30); //設置短信息的格式為:PDU模式
Gprs_At_Command(15,AT_Ring,30); //短信振鈴指示。
Gprs_At_Command(25,AT_SCA,30);//設置短信服務中心號碼
WDTCTL=WDTPW+WDTCNTCL;
if(Work_Mode==0)//若是GSM工作模式。
{
P2IE=0X00;//禁止P2.2中斷
Gprs_At_Command(9,AT_CloseIp,50); //關閉IP連接
Gprs_At_Command(16,AT_CNMI,30); //設置GSM短信息接收方式:串口直接接收。
Gprs_At_Command(15,AT_CBST,30); //數據撥號類型。
Gprs_At_Command(9,AT_CRC,30); //區分是語音來電、還是數據來電。
Gprs_At_Command(7,AT_S02,30); //設置摘機響鈴次數:2次。
Gprs_At_Command(5,AT_W,30); //保存設置
}
if(Work_Mode==1)//若是GPRS工作模式。
{
P2IFG=0;
P2IE=0X04;//開放P2.2中斷
P2IES=0X00;//上升沿觸發
Gprs_At_Command(9,AT_CloseIp,50); //關閉IP連接
Gprs_At_Command(7,AT_S00,30);//設置摘機響鈴次數:不摘機。
Gprs_At_Command(16,AT_CNMI01,30);//設置GPRS短信息接收方式:存放于SIM中。
Delay(20);
Gprs_At_Command(23,AT_CPMS01,30);//短信保存位置
Delay(20);
Gprs_At_Command(20,AT_IpParameters,30);//設置IP參數:等待時間、重發次數等
Gprs_At_Command(5,AT_W,30); //保存設置
Gprs_At_Command(strlen(AT_CGDCONT),AT_CGDCONT,100);//設置PDP聯系通道:APN默認為CMNET。
Gprs_At_Command(13,AT_ActivateIp,100);//激活IP地址。
Tx_Head=AT_OpenIp0[0];
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -