📄 gprs003.c
字号:
Data_Cmnd_Snd(34,&AT_OpenIp0[1],1,5);//连接中心IP
}
if(Work_Mode==2)//若是SMS工作模式。
{
P2IE=0X00;//禁止P2.2中断
Gprs_At_Command(9,AT_CloseIp,50); //关闭IP连接
Gprs_At_Command(7,AT_S00,30);//设置摘机响铃次数:不摘机。
Gprs_At_Command(16,AT_CNMI,30);//设置短信息接收方式:串口直接接收。
Gprs_At_Command(5,AT_W,30); //保存设置
}
_5NOP();
Delay(10);
P4OUT&=~0X02;
}
//================================
//函数:Connect_Master_Station()
//功能:连接主站
//输入:
//输出:
//================================
void Connect_Master_Station(void)
{
AT_Test_Flag=0;
if(Tel_Ring_Counter==1)
Delay(200);
Gprs_At_Command(3,AT,30);//测试是否有AT应答。
if(AT_Test_Flag==0)
{
P4OUT|=0X02; //回到命令状态。
Delay(250);
TXBUF1=0X1B;
TXBUF1=0X0d;
Delay(10);
Gprs_At_Command(6,AT_3Plus,30);
Delay(10);
}
Gprs_At_Command(9,AT_CloseIp,50); //关闭IP连接
Delay(100);
if(Tel_Ring_Counter>=1)
{
Delay(1000);
Read_Delete_SMS();//检测短信息
}
if(Work_Mode!=0x01)//已被重新初始化
return;
Inqury_Signal();
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];
Data_Cmnd_Snd(34,&AT_OpenIp0[1],1,10);//连接中心IP
Delay(10);
P4OUT&=~0X02; //DTR拉低:TE 进入READY状态。
}
//================================
//函数:Heart_Beat()
//功能:心跳
//输入参数
//输出参数
//===============================
void Heart_Beat(void)
{
char i;
char Heart_Beat_Head[]={0x2f,0x00,0x13,0xFF,0xFF,0xFA};//心跳信号头6字节。
char Zj_Heart_Beat[13]={0x68,0x91,0x01,0x07,0x1A,0x00,0x00,0x68,
0xA4,0x00,0x00,0xff,0x16};
char CheckSum=0;
Tx1_Pointer=0;
P2OUT|=0X02;//发送心跳时:暗。
if(Zj_Protocol_Flag==0)//华立规约的心跳
{
for(i=0;i<=5;i++)
{
Temp_cArray[i]=Heart_Beat_Head[i];
}
Temp_cArray[3]=Heart_Beat_Time;
for(i=0;i<=5;i++)
{
Temp_cArray[6+i*2]=Terminal_SIM[i*2+1];
Temp_cArray[6+i*2+1]=Terminal_SIM[i*2];
}
Temp_cArray[16]=Terminal_SIM[11];
Temp_cArray[17]=Signal_Val;
WDTCTL=WDTPW+WDTCNTCL;
Cal_Crc(&Temp_cArray[1],17);//计算CRC
Temp_cArray[18]=CRC>>8;
Temp_cArray[19]=CRC;
Tx_Head=Temp_cArray[0];
Data_Cmnd_Snd(19,&Temp_cArray[1],1,5);//心跳信号发送 。
return;
}
if((Zj_Protocol_Flag==1)&&(Load_Master_Flag==1)) //浙江规约心跳
{
for(i=0;i<=12;i++)
{
Temp_cArray[i]=Zj_Heart_Beat[i];
}
/*
for(i=0;i<=3;i++)//终端识别号
{
Temp_cArray[i+1]=((Terminal_SIM[i*2+1]-0x30)<<4)+(Terminal_SIM[i*2]-0x30);
}
*/ // hunter term address
Temp_cArray[5]=0x1E;
Temp_cArray[6]=0x00;
for(i=0;i<=10;i++)//校验和
{
CheckSum+=Temp_cArray[i];
}
Temp_cArray[11]=CheckSum;
while(Tx1_Snd_Lenth);
Tx_Head=Temp_cArray[0];
Data_Cmnd_Snd(12,&Temp_cArray[1],1,5);
_NOP();
}
}
//--------------------------------
//函数 Data_Cmnd_Snd(char,char)
//功能:发送AT命令或数据
//输入参数:命令长度、发送地址、串口号
//返回参数:
//=================================
void Data_Cmnd_Snd(Uint L,char *Temp_Pointer,char Sport,Uint Waiting_Time)
{
Wait_Result_Time=Waiting_Time;
if(Sport==1)
{
Tx1_Pointer=0;
Rx1_Time_Counter=0;
Rx1_TimeOut_Flag=0;
Tx1_Snd_Lenth=L;
Pointer1=Temp_Pointer;
TXBUF1=Tx_Head;
}
if(Sport==0)
{
Tx0_Pointer=0;
Rx0_Time_Counter=0;
Rx0_TimeOut_Flag=0;
Tx0_Snd_Lenth=L;
Pointer0=Temp_Pointer;
TXBUF0=0XFE;
}
}
//================================
//函数:Rx1Data_Judge_Trasmit();
//功能:判断串口1接收到的数据转发给串口0。
//输入参数:发送长度、发送缓冲区。
//输出参数:
//=================================
void Rx1Data_Judge_Trasmit(void)
{
Uint i,j;
Uint Temp2;
Uint Rx1_Lenth;
char Temp_Sim[12];
Rx1_Lenth=Rx1_Pointer;
Rx1_TimeOut_Flag=0;
Rx1_Start_Flag=0;
Rx1_Time_Counter=0;
P5OUT|=0x80;//接收指示灯灭。
DSR=P3IN&0X08; //P3.3:显示系统命令状态/数据状态。
for(i=0;i<Rx1_Pointer;i++)
{
Feed_WatchDog();
if((Rx1_Data_Buffer[i]==0x0D)&&(Rx1_Data_Buffer[i+1]==0x0A)) //***判断是否为结果码返回****
{
if((Rx1_Data_Buffer[i+4]==0x0D)&&(Rx1_Data_Buffer[i+5]==0x0A))
{
if((Rx1_Data_Buffer[i+2]=='O')&&(Rx1_Data_Buffer[i+3]=='K'))//返回OK
{
AT_Set_Ok=1;
if(AT_Test_Flag==0)
AT_Test_Flag=1;//第一次AT命令有返回。
}
}
//检测是否在线
if((Rx1_Data_Buffer[i+2]==42)&&(Rx1_Data_Buffer[i+5]==73)&&(Rx1_Data_Buffer[i+6]==80)&&(Rx1_Data_Buffer[i+7]==79))
{
if((Rx1_Data_Buffer[i+8]==58)&&(Rx1_Data_Buffer[i+9]==32))
{
if(Rx1_Data_Buffer[i+10]==48)
IpConnect_Flag=0;//未连接上
else
{
IpConnect_Flag=1;//已连接上
AT_Set_Ok=1;
return;
}
}
}
if((Rx1_Data_Buffer[i+2]==0x3e)&&(Rx1_Data_Buffer[i+3]==0x20))//返回">和空格”
{
AT_Set_Ok=1;
Msg_Snd_Flag=1;//可以发送短信标志置位。
return;
}
if((Rx1_Data_Buffer[i+2]=='+')&&(Rx1_Data_Buffer[i+3]=='C')&&(Rx1_Data_Buffer[i+4]=='M')&&(Rx1_Data_Buffer[i+5]=='G')&&(Rx1_Data_Buffer[i+6]=='R')) //+CMGR
{//+CMGR读取短信
// AT_Set_Ok=1;
if(Rx1_Data_Buffer[i+9]-0x30!=0)
_NOP();
//Received_Read_Msg_Flag=1;//表示该信息不是未读数据。
}
if((Rx1_Data_Buffer[i+2]=='+')&&(Rx1_Data_Buffer[i+3]=='C')&&(Rx1_Data_Buffer[i+4]=='P')&&(Rx1_Data_Buffer[i+5]=='M')&&(Rx1_Data_Buffer[i+6]=='S')) //+CMGR
{//+CPMS查询SIM中短信息数量。
AT_Set_Ok=1;
if(Rx1_Data_Buffer[i+13]==',')
SMS_Index=Rx1_Data_Buffer[i+14]-0x30;//SIM中的短信数目:<10。
if((Rx1_Data_Buffer[i+15]!=',')&&(Rx1_Data_Buffer[i+16]==','))
{
SMS_Index=10*(Rx1_Data_Buffer[i+14]-0x30)+(Rx1_Data_Buffer[i+15]-0x30);//>10
}
return;
}
if((Rx1_Data_Buffer[i+2]=='+')&&(Rx1_Data_Buffer[i+3]=='C')&&(Rx1_Data_Buffer[i+4]=='M')&&(Rx1_Data_Buffer[i+5]=='S')&&(Rx1_Data_Buffer[i+6]==' '))
{//指示返回错误代码
AT_Set_Ok=1;//是SIM卡中有未读取读取的短信。
}
}
if((Rx1_Data_Buffer[i]=='R')&&(Rx1_Data_Buffer[i+1]=='I')&&(Rx1_Data_Buffer[i+2]=='N')&&(Rx1_Data_Buffer[i+3]=='G'))
{
Ring_Counter++;
if(Ring_Counter>=3)
{
Heart_Beat_Flag=1;
Heart_Beat_Interval=6000;
//Heart_Beat_Interval=Heart_Beat_Time*100;//自动检测一次GPRS连接
}
_NOP();
}
//检测CONNECT返回码,判断是否连接上。
if((Rx1_Data_Buffer[i]=='C')&&(Rx1_Data_Buffer[i+1]=='O')&&(Rx1_Data_Buffer[i+2]=='N')&&(Rx1_Data_Buffer[i+3]=='N')) //返回CONNECT
{
if((Rx1_Data_Buffer[i+4]=='E')&&(Rx1_Data_Buffer[i+5]=='C')&&(Rx1_Data_Buffer[i+6]=='T'))
{
AT_Set_Ok=1;
Command_Data_Status=1;//进入数据模式状态。
P1OUT&=0XBF;//显示已连接
Beat_Rcv_Fail=0;
Heart_Beat_Interval=600;//自动检测一次GPRS连接
Heart_Beat_Flag=0;
return;
}
}
//检测是否有短信接收到
if((Rx1_Data_Buffer[i]=='+')&&(Rx1_Data_Buffer[i+1]=='C')&&(Rx1_Data_Buffer[i+2]=='M')&&(Rx1_Data_Buffer[i+3]=='T')&&(Rx1_Data_Buffer[i+4]=='I')) //+CMTI:指示SIM中接收到短信息。
{//+CMTI:指示收到新的短信。
AT_Set_Ok=1;
//SIM_SMS_Flag=1;//是SIM卡中有未读取的短信。
}
//检测是否
if((Rx1_Data_Buffer[i]=='N')&&(Rx1_Data_Buffer[i+3]=='C')&&(Rx1_Data_Buffer[i+4]=='A')&&(Rx1_Data_Buffer[i+5]=='R')&&(Rx1_Data_Buffer[i+7]=='I')) //+CMTI:指示SIM中接收到短信息。
{//接收到NO CARRIER
AT_Set_Ok=1;
if(Work_Mode==1)
{
No_Carrier_Flag=1;//是SIM卡中有未读取的短信。
Heart_Beat_Flag=1;
}
}
//***判断返回结果码结束****
//***********心跳信号*************
if((Rx1_Data_Buffer[i]==0x2f)&&(Rx1_Data_Buffer[i+2]==0x07)&&(Rx1_Data_Buffer[i+5]==0xfa))
{
//判断功能码
Cal_Crc(&Rx1_Data_Buffer[i+1],5);//计算CRC
Temp2=Rx1_Data_Buffer[i+6];
Temp2=(Temp2<<8)+Rx1_Data_Buffer[i+7];
if(CRC==Temp2)//若CRC相等,则为心跳信号。
{
P2OUT&=~0X02;//接收心跳时:灯亮。
Beat_Rcv_Fail=0;//心跳接收失败次数
Heart_Beat_Interval=600;
Beat_Rcved_Flag=1;
Beat_Test_Start=0;
Minute2_Interval=12000;//2分钟通信间隔检测。
Minute2_Interval_Flag=0;
Second=0;
Minute=0;
if(Rx1_Data_Buffer[i+3]!=Heart_Beat_Time)
{
if(Rx1_Data_Buffer[i+3]==255)
return;
Heart_Beat_Time=Rx1_Data_Buffer[i+3];
Temp_iArray[0]=Heart_Beat_Time;
Wr_Data(Beat_Addr,1,Temp_iArray);//保存数据为16进制
Feed_WatchDog();
Wr_Data(Beat_Addr+100,1,Temp_iArray);
Rd_Data(0,91,Temp_iArray);//读取数据,重新计算CRC,然后保存。
for(j=0;j<=90;j++)
{
Temp_cArray[j]=Temp_iArray[j];
}
Feed_WatchDog();
Cal_Crc(&Temp_cArray[1],88);
Temp_iArray[1]=CRC&0x00FF; //CRC低位
Temp_iArray[0]=(CRC>>8)&0x00FF; //CRC高位
Wr_Data(89,2,Temp_iArray); //读取数据,重新计算CRC,然后保存。
Feed_WatchDog();
Wr_Data(189,2,Temp_iArray);
}
return;
}
}
//检测浙江GPRS心跳信号
if((Rx1_Data_Buffer[i]==0x68)&&(Rx1_Data_Buffer[i+7]==0x68)&&(Rx1_Data_Buffer[i+8]==0x24)&&(Rx1_Data_Buffer[i+12]==0x16))
{
P2OUT&=~0X02;//接收心跳时:灯亮。
Beat_Rcv_Fail=0;//心跳接收失败次数
Heart_Beat_Interval=600;
Beat_Rcved_Flag=1;
Beat_Test_Start=0;
Minute2_Interval=12000;//2分钟通信间隔检测。
Minute2_Interval_Flag=0;
Second=0;
Minute=0;
Heart_Flag=0;
}
//检测浙江正常登陆
if((Rx1_Data_Buffer[i]==0x68)&&(Rx1_Data_Buffer[i+7]==0x68)&&(Rx1_Data_Buffer[i+8]==0x21)&&(Rx1_Data_Buffer[i+12]==0x16))
{
P2OUT&=~0X02;//接收心跳时:灯亮。
Beat_Rcv_Fail=0;//心跳接收失败次数
Heart_Beat_Interval=600;
Beat_Rcved_Flag=1;
Beat_Test_Start=0;
Minute2_Interval=12000;//2分钟通信间隔检测。
Minute2_Interval_Flag=0;
Second=0;
Minute=0;
Load_Master_Flag=1;//登陆主站成功
}
//******以下为短信设置处理程序******。
if((Rx1_Data_Buffer[i]=='0')&&(Rx1_Data_Buffer[i+1]=='8')&&(Rx1_Data_Buffer[i+2]=='9')&&(Rx1_Data_Buffer[i+3]=='1')&&(Rx1_Data_Buffer[i+4]=='6')&&(Rx1_Data_Buffer[i+5]=='8'))//接收到短信内容:089168的数据头
{
Feed_WatchDog();
for(j=0;j<=11;j++)
{
// Center_SIM[j]=Rx1_Data_Buffer[26+i+j];//将发送手机号码的提取。
Temp_Sim[j]=Rx1_Data_Buffer[26+i+j];
}
Asci_To_Hex(&Rx1_Data_Buffer[i],Rx1_Pointer-i+1);//CHANGED 11.5 +1将收到的短信ASCII转化成16进制数。
_NOP();
if((Temp_cArray[29]==0x2F)&&(Temp_cArray[31]==90)&&(Temp_cArray[34]==0xFD))//判断数据头、长度、功能码
{ //通过主站设置的命令处理
Cal_Crc(&Temp_cArray[1],88);//计算CRC
Temp2=Temp_cArray[89];//比较CRC
Temp2=Temp2<<8;
Temp2=Temp2+Temp_cArray[90];
if(CRC==Temp2)//若CRC相等,则为设置命令
{ //检验密码
if((Temp_cArray[57]==PassWord[0])&&(Temp_cArray[58]==PassWord[1])&&(Temp_cArray[59]==PassWord[2])&&(Temp_cArray[60]==PassWord[3])&&(Temp_cArray[61]==PassWord[4])&&(Temp_cArray[62]==PassWord[5]))
goto Pass0;
if((Temp_cArray[57]=='H')&&(Temp_cArray[58]=='O')&&(Temp_cArray[59]=='L')&&(Temp_cArray[60]=='L')&&(Temp_cArray[61]=='E')&&(Temp_cArray[62]=='Y'))
{//超级密码
Pass0:;
for(i=0;i<=90;i++)
{
Temp_iArray[i]=Temp_cArray[i+29];
}
Wr_Data(Estart_Addr,91,&Temp_iArray[29]);//将设置数据写到EEPROM中:0~90
_NOP();
Wr_Data(Estart2_Addr,91,&Temp_iArray[29]);//将数据备份。100~190
SMS_Mode=1;
Echo_SMS_Master(7);//返回短信正确设置命令。
SMS_Mode=0xff;
}
return;
}
}
if(Temp_cArray[20]==0X00)//短信是7bit编码
{ //通过手机设置的命令处理。
SMS_Mode=0;
Decode8Bit(Temp_cArray[28]);//数据解码后,放到User_Data[]中
_NOP();
goto Cotinue0;
}
if(Temp_cArray[20]==0X04)//短信是8BIT编码
{
SMS_Mode=1;
for(j=0;j<Temp_cArray[28];j++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -