📄 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 + -