📄 gr47.c
字号:
cmd[i]=cmd1[i];
}
else
{
for(i=0;i<24;i++)
cmd[i]=cmd0[i];
}
cmd[8] = '"';
cmd[11] = '"';
cmd[13] = '"';
cmd[16] = '"';
cmd[18] = '"';
cmd[21] = '"';
get_string_clear1( ); //清空接收缓冲区
put_string1(cmd, 24); //串口接收回复,关
os_wait(K_TMO,10,0);
get_string_clear1( ); //清空接收缓冲区
gsm_busy = 0;
}
/******************************************************************************
// 读取电话本
// 用CPBR
//一次读出一条电话号码
// pDrc 返回字符串指针
// index 电话号码序号
//返回:字符串长度
UCHAR read_phonebook(UCHAR xdata *pDrc,UCHAR index)
{
UCHAR m,i;
UCHAR r_len; // 串口收到的数据长度
UCHAR code cmd0[]={"AT+CPBR="}; // 命令串
UCHAR code cmd1[]={"AT+CPBS=ME\r\n"}; // 命令串
UCHAR xdata cmd[16]; // 命令串
UCHAR xdata buf[128]; // 接受缓冲
UCHAR xdata *ptr;
while(gsm_busy)
os_wait(K_TMO,1,0);
gsm_busy = 1;
for(i=0;i<12;i++)
cmd[i]=cmd1[i];
get_string1(buf); //清空发送缓冲区和接收缓冲区
put_string1(cmd, 12);
os_wait(K_TMO,10,0);
for(i=0;i<8;i++)
cmd[i]=cmd0[i];
get_string1(buf); //清空发送缓冲区和接收缓冲区
put_string1(cmd, 8);
m = index/10;
if(m != 0)
put_char1(m +0x30);
put_char1((index%10)+0x30);
put_char1(0x0d);
put_char1(0x0a);
for(i = 2; i>0; i--)
{
r_len = get_string1(buf); // 读应答数据
if(r_len >15)
break;
}
if(r_len <15)
{
gsm_busy = 0;
return(0);
}
buf[127] = '\0';
if((ptr = strchr(buf,'"')) != NULL)
{
ptr++;
r_len = 0;
m = *ptr;
while(m != '"')
{
m = *ptr++;
*pDrc++ = m;
r_len++;
}
gsm_busy = 0;
return(r_len-1);
}
gsm_busy = 0;
return (0);
}
/******************************************************************************
// 写电话本
// 用CPBW
//一次写一条电话号码
//pSrc: 源字符串指针
//index 电话号码序号 turn(TRUE); return(FALSE);
//len 电话号码长度
//返回:成功/失败 AT+CPBW=4,13459553766,129,CENTER
bit write_phonebook(UCHAR xdata *pSrc,UCHAR len,UCHAR index)
{
UCHAR m,i,j;
UCHAR r_len; // 串口收到的数据长度
UCHAR code cmd0[]={"AT+CPBW="}; // 命令串
UCHAR code cmd0_[]={",129,strong\r\n"}; // 命令串
UCHAR code cmd1[]={"AT+CPBS=ME\r\n"}; // 命令串
UCHAR xdata cmd[16]; // 命令串
UCHAR xdata buf[128]; // 接受缓冲
UCHAR xdata *ptr;
while(gsm_busy)
os_wait(K_TMO,1,0);
gsm_busy = 1;
for(i=0;i<12;i++)
cmd[i]=cmd1[i];
get_string1(buf); //清空发送缓冲区和接收缓冲区
put_string1(cmd, 12);
os_wait(K_TMO,10,0);
for(i=0;i<8;i++)
cmd[i]=cmd0[i];
get_string1(buf); //清空发送缓冲区和接收缓冲区
put_string1(cmd, 8);
m = index/10;
if(m != 0)
put_char1(m +0x30);
put_char1((index%10)+0x30);
put_char1(',');
put_string1(pSrc, len);
for(i=0;i<13;i++)
cmd[i]=cmd0_[i];
put_string1(cmd, 13);
os_wait(K_TMO,1,0);
for(j = 2; j>0; j--)
{
for(i = 2; i>0; i--)
{
r_len = get_string1(buf); // 读应答数据
if(r_len > 0)
break;
}
if(r_len == 0)
{
gsm_busy = 0;
return(FALSE);
}
buf[127] = '\0';
if((ptr = strstr(buf,"OK")) != NULL)
{
gsm_busy = 0;
return(TRUE);
}
}
gsm_busy = 0;
return (FALSE);
}
/******************************************************************************/
bit ReadTime(void)
{
UINT xdata r_len; // 收到的数据长度
UCHAR i;
UCHAR code cmd0[ ]={"AT+CCLK?\r\n"}; // 命令串
UCHAR xdata cmd[11]; // 命令串
UCHAR xdata buf[50]; // 接受缓冲
UCHAR xdata *ptr;
UCHAR xdata *pDrc;
while(gsm_busy)
os_wait(K_TMO,1,0);
ptr = buf;
pDrc = time;
gsm_busy = 1;
for(i=0;i<10;i++)
cmd[i]=cmd0[i];
get_string_clear1( ); //清空缓冲区
put_string1(cmd, 10);
for(i = 2; i>0; i--)
{
r_len = get_string1(buf); // 读应答数据
if(r_len > 12)
break;
}
if(r_len < 12)
{
gsm_busy = 0;
return(FALSE);
}
buf[127] = '\0';
if((ptr = strstr(buf, "CCLK:")) != NULL)
{
ptr += 7; // 跳过(+CCLK: ")
for(i=0;i<6;i++)
{
*pDrc = ((*ptr&0x0f)<<4) + (*(ptr+1)&0x0f);
pDrc++;
ptr +=3;
}
gsm_busy = 0;
return(TRUE);
}
gsm_busy = 0;
return(FALSE);
}
/******************************************************************************/
bit TimeCompare_(UCHAR xdata *sp1,UCHAR xdata *sp2)
{
if(*sp1>*sp2) return(1);
if(*sp1<*sp2) return(0);
sp1++; sp2++;
if(*sp1>*sp2) return(1);
if(*sp1<*sp2) return(0);
sp1++; sp2++;
if(*sp1>*sp2) return(1);
if(*sp1<*sp2) return(0);
sp1++; sp2++;
if(*sp1>*sp2) return(1);
if(*sp1<*sp2) return(0);
sp1++; sp2++;
if(*sp1>*sp2) return(1);
if(*sp1<*sp2) return(0);
sp1++; sp2++;
if(*sp1>*sp2) return(1);
if(*sp1<*sp2) return(0);
return(0);
}
/******************************************************************************/
void SetupTime(UCHAR xdata *pSrc)
{
UCHAR xdata buf1[33];
UCHAR code cmd[ ]={"AT+CCLK= 00/00/00,00:00:00+00 \r\n"}; // 命令串
UCHAR xdata *sp;
if((sp = strchr(pSrc,',')) != NULL)
{
sp++;
buf1[0] = (((*sp) & 0x0f)<<4) + (*(sp+1) & 0x0f);
sp += 2;
buf1[1] = (((*sp) & 0x0f)<<4) + (*(sp+1) & 0x0f);
sp += 2;
buf1[2] = (((*sp) & 0x0f)<<4) + (*(sp+1) & 0x0f);
sp += 2;
buf1[3] = (((*sp) & 0x0f)<<4) + (*(sp+1) & 0x0f);
sp += 2;
buf1[4] = (((*sp) & 0x0f)<<4) + (*(sp+1) & 0x0f);
sp += 2;
buf1[5] = (((*sp) & 0x0f)<<4) + (*(sp+1) & 0x0f);
if((TimeCompare_(buf1,time) == 1)||((memcmp(time,buf1,4) == 0)&&((time[4]-buf1[4]) == 1)))
{
memcpy(buf1,cmd,32);
sp = strchr(pSrc,',') + 1;
buf1[8] = '"';
buf1[9] = *sp++;
buf1[10] = *sp++;
buf1[12] = *sp++;
buf1[13] = *sp++;
buf1[15] = *sp++;
buf1[16] = *sp++;
buf1[18] = *sp++;
buf1[19] = *sp++;
buf1[21] = *sp++;
buf1[22] = *sp++;
buf1[24] = *sp++;
buf1[25] = *sp++;
buf1[29] = '"';
while(gsm_busy)
os_wait(K_TMO,1,0);
gsm_busy = 1;
get_string1(buf1);
put_string1(buf1, 32);
get_string1(buf1); //清空接收缓冲区
gsm_busy = 0;
}
}
}
/******************************************************************************/
void gsm_status_init(void)
{
UCHAR i;
UCHAR code cmd0[ ]={"AT+CMGF=0\r\n"}; // 命令串 :
UCHAR code cmd1[ ]={"ATE0\r\n"}; // 命令串 : 串口接收回复,关
UCHAR code cmd2[ ]={"AT+CNMI=3,1,0,2,0\r\n"}; // 命令串 : 短信提示,开
UCHAR xdata cmd[20]; // 命令串
while(gsm_busy)
os_wait(K_TMO,1,0);
gsm_busy = 1;
for(i=0;i<11;i++)
cmd[i]=cmd0[i];
get_string_clear1( ); //清空接收缓冲区
put_string1(cmd, 11); //
os_wait(K_TMO,100,0);
for(i=0;i<6;i++)
cmd[i]=cmd1[i];
get_string_clear1( ); //清空接收缓冲区
put_string1(cmd, 6); //串口接收回复,关
os_wait(K_TMO,100,0);
for(i=0;i<19;i++)
cmd[i]=cmd2[i];
get_string_clear1( ); //清空接收缓冲区
put_string1(cmd, 19); //短信提示,开
os_wait(K_TMO,10,0);
get_string_clear1( ); //清空接收缓冲区
gsm_busy = 0;
}
/******************************************************************************/
void gsm_init(void)
{
gsm_igt_0( );
os_wait( K_TMO, 250, 0);
gsm_igt_1( );
TP_DCS = GSM_8BIT;
}
/******************************************************************************/
void gsm_power_down(void)
{
UCHAR i;
UCHAR code cmd0[ ]={"AT+CFUN=0\r\n"}; // 命令串 : power down
UCHAR xdata cmd[11]; // 命令串
while(gsm_busy)
os_wait(K_TMO,1,0);
gsm_busy = 1;
for(i=0;i<11;i++)
cmd[i]=cmd0[i];
put_string1(cmd,11); // power down
os_wait(K_TMO,250,0);
os_wait(K_TMO,250,0);
os_wait(K_TMO,250,0);
os_wait(K_TMO,250,0);
get_string_clear1( ); //清空接收缓冲区
gsm_busy = 0;
}
/******************************************************************************/
bit gprs_init(void)
{
UCHAR i,r_len;
UCHAR xdata buf[30];
get_string_clear1( ); //清空接收缓冲区
put_string1("at*e2ipa=1,1\r\n",14); // 激活GR47 PDP连接
for(i = 50; i>0; i--) //10s
{
r_len = get_string1(buf); // 读应答数据
buf[r_len] = '\0';
if(r_len > 2)
break;
}
if(strstr(buf,"OK") != NULL)
{
return(TRUE);
}
return(FALSE);
}
/******************************************************************************/
void cmd_deal_gprs(UCHAR xdata *);
/******************************************************************************/
bit gprs_connect(void)
{
UCHAR i,r_len;
UCHAR xdata buf[400];
get_string_clear1( ); //清空接收缓冲区
put_string1("at*e2ipo?\r\n",11); // 连接?
for(i = 10; i>0; i--) //2s
{
r_len = get_string1(buf); // 读应答数据
buf[r_len] = '\0';
if(r_len > 6)
break;
}
if(strchr(buf,'1') != NULL) //已经连接
{
get_string_clear1( ); //清空接收缓冲区
put_string1("ATO\r\n",5);
for(i = 10; i>0; i--) //2s
{
r_len = get_string1(buf); // 读应答数据
buf[r_len] = '\0';
if(r_len > 6)
break;
}
cmd_deal_gprs(buf);
return(TRUE);
}
put_string1("at*e2ipo=1,",11); // 连接
put_char1('"');
put_string1(gprs_ip,strlen(gprs_ip)); // ip
put_char1('"');
put_char1(',');
put_string1(gprs_port,strlen(gprs_port)); //port
put_string1("\r\n",2);
for(i = 50; i>0; i--) //10s
{
r_len = get_string1(buf); // 读应答数据
buf[r_len] = '\0';
if(r_len > 6)
break;
}
if(strstr(buf,"CONNECT") != NULL) //成功
{
return(TRUE);
}
return(FALSE);
}
/******************************************************************************/
void gprs_close(void)
{
gprs_dtr = 0;
os_wait(K_TMO,30,0);
gprs_dtr = 1;
}
/******************************************************************************/
bit gprs_send(UCHAR xdata *sp)
{
UCHAR m,r_len;
UCHAR xdata buf[400];
while(gsm_busy)
os_wait(K_TMO,1,0);
gsm_busy = 1;
m = 5;
while( gprs_init( )==FALSE )
{
gprs_close( );
m--;
if(m == 0)
{
gsm_busy = 0;
return(FALSE);
}
}
m = 5;
while( gprs_connect( )==FALSE )
{
gprs_close( );
m--;
if(m == 0)
{
gsm_busy = 0;
return(FALSE);
}
}
put_string1(sp,strlen(sp));
for(m = 150; m>0; m--) //30s
{
r_len = get_string1(buf); // 读应答数据
buf[r_len] = '\0';
if(r_len > 1)
break;
}
if(strstr(buf,"OK") != NULL) //成功
{
gprs_close( );
gsm_busy = 0;
return(TRUE);
}
gprs_close( );
gsm_busy = 0;
return(FALSE);
}
/******************************************************************************/
void gprs_rcv(void)
{
UCHAR i,r_len;
UCHAR xdata buf[400];
while(gsm_busy)
os_wait(K_TMO,1,0);
gsm_busy = 1;
get_string_clear1( ); //清空接收缓冲区
put_string1("at*e2ipo?\r\n",11); // 连接?
for(i = 10; i>0; i--) //2s
{
r_len = get_string1(buf); // 读应答数据
buf[r_len] = '\0';
if(r_len > 6)
break;
}
if(strchr(buf,'1') != NULL) //已经连接
{
get_string_clear1( ); //清空接收缓冲区
put_string1("ATO\r\n",5);
for(i = 10; i>0; i--) //2s
{
r_len = get_string1(buf); // 读应答数据
buf[r_len] = '\0';
if(r_len > 6)
break;
}
cmd_deal_gprs(buf);
os_wait(K_TMO,50,0);
gprs_close( );
}
gsm_busy = 0;
}
/******************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -