📄 gprs.c
字号:
{
status = 1;
break;
}
else if(GPRSCheckQueue("ERROR", &pos)) //拨号命令执行失败
{
GPRSSetQueuePosSta(pos);
status = 2;
}
else if(GPRSCheckQueue("NO DIALTONE", &pos)) //没有拨号音
{
GPRSSetQueuePosSta(pos);
status = 2;
}
else if(GPRSCheckQueue("BUSY", &pos)) //拨号命令执行失败
{
GPRSSetQueuePosSta(pos);
status = 2;
}
}
if(i == 20) status = 2; //拨号无响应
while(status == 1) //ATD已经成功执行,查询电话有无接通
{
GPRSFlushQueueSpec("+CLCC");
if( GPRSSendStr("AT+CLCC\r", "+CLCC", &pos, OS_TICKS_PER_SEC/2) )
{
CLCCPtr = GPRSQueuePosPtr(pos);
if(*(CLCCPtr + 11) == '2') //正在拨号
{
GPRSSetState(GPRS_DIALING);
}
else if(*(CLCCPtr + 11) == '3') //对方正在振铃
{
GPRSSetState(GPRS_RINGING);
}
else if(*(CLCCPtr + 11) == '0') //已经接通电话, 可以开始计费
{
GPRSSetState(GPRS_TALKING);
}
}
else
{
break;
}
OSTimeDly(OS_TICKS_PER_SEC);
if(GPRSCheckQueue("NO CARRIER", &pos)) //判断对方是否挂机
{
GPRSSetQueuePosSta(pos);
status = 3;
break;
}
if(GPRSCheckQueue("NO ANSWER", &pos)) //判断对方是否挂机
{
GPRSSetQueuePosSta(pos);
status = 3;
break;
}
if(1) //判断己方是否挂机
{
//如果有键盘操作,例如挂机等,可以在这里进行操作
// status = 4;
}
}
// if(status==2 || status==3 || status==4) //ATD失败或者对方挂机,需要发送ATH指令
// {
for(i=0; i<10; i++) //最多发送10次挂机指令
{
if(GPRSSendStr("ATH\r", "OK", &pos, OS_TICKS_PER_SEC*2))
{
GPRSSetQueuePosSta(pos);
break;
}
}
OSSemPost(GPRSSem);
GPRSSetState(GPRS_IDLE);
return status; //挂机后返回
// }
}
/*********************************************************************************************************
** 函数名称: GPRSDialDown
** 功能描述: 挂断GPRS
** 输 入: 无
**
** 输 出: GPRS状态
**
** 全局变量: GPRSState
** 调用模块: OSTimeDly
**
** 作 者: 陈明计
** 日 期: 2004年2月25日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
/*
uint8 GPRSDialDown(void)
{
SC16C_Write(CSA|MCR,0x02);
OSTimeDly(OS_TICKS_PER_SEC / 10);
SC16C_Write(CSA|MCR,0x03);
OSTimeDly(OS_TICKS_PER_SEC / 10);
return GPRSState;
}
*/
/*********************************************************************************************************
** 函数名称: GPRSAnswerCall
** 功能描述: 自动接听外面呼叫的电话
** 输 入: 无
**
** 输 出:
**
** 全局变量:
** 调用模块:
**
** 作 者: XieLuWei
** 日 期: 2005年7月1日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 GPRSAnswerCall( void )
{
uint8 err;
char pos;
uint8 status=0;
uint8 i;
char *CLCCPtr; //指向CLCC回复的指针
OSSemPend(GPRSSem, 0, &err);
if(err == OS_NO_ERR)
{
if( GPRSSendStr("ATA\r", "OK", &pos, OS_TICKS_PER_SEC*10) )
{
GPRSSetQueuePosSta(pos);
status = 1; //最多等待10秒钟接通
}
}
while(status == 1) //ATD已经成功执行,查询电话有无接通
{
GPRSFlushQueueSpec("+CLCC");
if( GPRSSendStr("AT+CLCC\r", "+CLCC", &pos, OS_TICKS_PER_SEC/2) )
{
CLCCPtr = GPRSQueuePosPtr(pos);
if(*(CLCCPtr + 11) == '2') //正在拨号
{
GPRSSetState(GPRS_DIALING);
}
else if(*(CLCCPtr + 11) == '3') //对方正在振铃
{
GPRSSetState(GPRS_RINGING);
}
else if(*(CLCCPtr + 11) == '0') //已经接通电话, 可以开始计费
{
GPRSSetState(GPRS_TALKING);
}
}
else
{
break;
}
OSTimeDly(OS_TICKS_PER_SEC);
if(GPRSCheckQueue("NO CARRIER", &pos)) //判断对方是否挂机
{
GPRSSetQueuePosSta(pos);
status = 3;
break;
}
if(GPRSCheckQueue("NO ANSWER", &pos)) //判断对方是否挂机
{
GPRSSetQueuePosSta(pos);
status = 3;
break;
}
if(1) //判断己方是否挂机
{
//如果有键盘操作,例如挂机等,可以在这里进行操作
// status = 4;
}
}
// if(status==2 || status==3 || status==4) //ATD失败或者对方挂机,需要发送ATH指令
// {
for(i=0; i<10; i++) //最多发送10次挂机指令
{
if(GPRSSendStr("ATH\r", "OK", &pos, OS_TICKS_PER_SEC*2))
{
GPRSSetQueuePosSta(pos);
break;
}
}
OSSemPost(GPRSSem);
GPRSSetState(GPRS_IDLE);
return status; //挂机后返回
// }
}
/*********************************************************************************************************
** 函数名称: GPRSHangupCall
** 功能描述: 挂断电话
** 输 入: 无
**
** 输 出: 成功 1 失败 0
**
** 全局变量:
** 调用模块:
**
** 作 者: XieLuWei
** 日 期: 2005年7月1日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 GPRSHangupCall( void )
{
uint8 err;
char pos;
OSSemPend(GPRSSem, 0, &err);
if(err == OS_NO_ERR)
{
if( GPRSSendStr("ATH\r", "OK", &pos, OS_TICKS_PER_SEC*10) )
{
OSSemPost(GPRSSem);
GPRSSetQueuePosSta(pos);
return 1; //最多等待10秒钟接通
}
}
OSSemPost(GPRSSem);
return 0;
}
/*********************************************************************************************************
** 函数名称: GPRSViewMSGCenter
** 功能描述: 查看当前设置的短信中心
** 输 入: 指向短信中心号码的缓存
**
** 输 出: 成功 1 失败0
**
** 全局变量:
** 调用模块:
**
** 作 者: XieLuWei
** 日 期: 2007年6月25日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 GPRSViewMSGCenter(char * number)
{
uint16 delay;
char i;
char pos;
uint8 err;
char *tmptr;
OSSemPend(GPRSSem, 0, &err); //获取对GPRS进行操作的信号量
for(i=0; i<30; i++)
{
GPRSFlushQueueSpec("+CSCA");
GPRSWrite("AT+CSCA?\r");
for(delay=0;delay<OS_TICKS_PER_SEC*4;delay+=4) //等待回复
{
OSTimeDly(4);
if( GPRSCheckQueue("+CSCA", &pos) )
{
tmptr = GPRSQueuePosPtr(pos);
tmptr = strchr(tmptr,'\"')+1;
strncat(number,tmptr,strchr(tmptr,'\"')-tmptr);
OSSemPost(GPRSSem);
GPRSFlushQueueSpec("+CSCA");
return 1;
}
if( GPRSCheckQueue("+CMS ERROR: 517", &pos) )
{
GPRSSetQueuePosSta(pos);
OSTimeDly(OS_TICKS_PER_SEC*4);
break; //跳出最内层循环
}
}
}
OSSemPost(GPRSSem);
return 0; //是否操作成功
}
/*********************************************************************************************************
** 函数名称: GPRSSetMSGCenter
** 功能描述: 设置短信中心
** 输 入: number 短信中心码
**
** 输 出: 成功 1 失败0
**
** 全局变量:
** 调用模块:
**
** 作 者: XieLuWei
** 日 期: 2005年7月1日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 GPRSSetMSGCenter(char * number)
{
char str[30];
char pos,i;
uint16 delay;
uint8 err;
if(strlen(number) < 11)
return 0;
_sprintf(str,"AT+CSCA=\"%s\"\r",number);
OSSemPend(GPRSSem, 0, &err); //获取对GPRS进行操作的信号量
for(i=0; i<30; i++)
{
GPRSFlushQueueSpec("+CSCA");
GPRSWrite(str);
for(delay=0;delay<OS_TICKS_PER_SEC*4;delay+=4)
{
OSTimeDly(4);
if( GPRSCheckQueue("OK", &pos) )
{
OSSemPost(GPRSSem);
GPRSFlushQueueSpec("OK");
return 1; //是否操作成功
}
if( GPRSCheckQueue("+CMS ERROR: 517", &pos) )
{
GPRSSetQueuePosSta(pos);
OSTimeDly(OS_TICKS_PER_SEC*4);
break;
}
}
}
OSSemPost(GPRSSem);
return 0; //是否操作成功
}
/*********************************************************************************************************
** 函数名称: GPRSDelMSG
** 功能描述: 删除短信
** 输 入: num 短信的存储号(1~20)
**
** 输 出: 成功 0 失败1
**
** 全局变量:
** 调用模块:
**
** 作 者: XieLuWei
** 日 期: 2005年7月1日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
char delstr[30];
uint8 GPRSDelMSG(uint8 num)
{
char tmp = 0;
char pos;
uint8 err;
OSSemPend(GPRSSem, 0, &err); //获取对GPRS进行操作的信号量
_sprintf(delstr,"AT+CMGD=%d\r",num);
if( GPRSSendStr(delstr, "OK", &pos, OS_TICKS_PER_SEC*2))
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -