⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gprs.c

📁 SmartARM2400系列开发板全套资料
💻 C
📖 第 1 页 / 共 4 页
字号:
		{
			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 + -