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

📄 gprs.c

📁 周立功SMART ARM2200上GPRS源码,快下吧,好东西
💻 C
📖 第 1 页 / 共 2 页
字号:
	}
}
/*********************************************************************************************************
** 函数名称: ModemInit
** 功能描述: 初始化Modem 
** 输 入: 波特率
**
** 输 出: modem状态
**
** 全局变量: ModemState
** 调用模块: UART1Init,OSTimeDly,ModemCommand,
**
** 作 者: Yehaoben
** 日 期: 2005年2月25日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        uint8 ModemInit(uint32 bps)
{
    ModemState = MODEM_CLOSE;
    UART1Init(bps);
    ModemSem = OSSemCreate(1);
    HaveCall = OSSemCreate(0);
    if (ModemSem != NULL)
    {
        if ((U1MSR & 0x30) != 0x30)
        {
            OSTimeDly(OS_TICKS_PER_SEC);
            if ((U1MSR & 0x30) != 0x30)
            {
                ModemState = NOT_FIND_MODEM;
            }
        }
        if (ModemState == MODEM_CLOSE)
        {
            ModemCommand("AT$NOSLEEP=1");
            ModemCommand("AT+CREG=1");
        }
        //OSTaskCreate(GPRSCheckTask, (void *)0, &GPRSTaskStartStk[GPRS_TASK_STK_SIZE - 1], 7);
    }
    else
    {
        ModemState = NOT_INIT_MODEM;
    }
    return ModemState;
}
/*********************************************************************************************************
** 函数名称: GPRSSendMSG
** 功能描述: 发短信
** 输 入: 短信地址,短信信息
**
** 输 出: 成功 0 失败1
**
** 全局变量: 
** 调用模块: 
**
** 作 者: Yehaoben
** 日 期: 2005年7月1日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
const char GPRS_MSG_STR[]={"AT+CMGS=\"%s\"\r\n"};
uint8 GPRSSendMSG(char * num, char * MSG)
{	
	uint8 i,j,err;
	char sendchar[30];
	char temp[2];
	ModemCommand("AT+CMGF=1");
	
	OSSemPend(ModemSem, 0, &err);
	GetAllChar();
	_sprintf(sendchar,GPRS_MSG_STR,num);
	ModemWrite(sendchar,strlen(sendchar));
	i = ModemGetch();
    j = 0;
    while ( j <= 30 )
    {
        if (i == '>')
        {
            break;
        }
        i = ModemGetch();
        j++;
    }
	if(j >=30 )
	{
		OSSemPost(ModemSem);
		return 1;
	}
	ModemWrite(MSG,strlen(MSG));
	temp[1]=0;
	temp[0]=0x1a;
	ModemWrite(temp,1);
	i = ModemGetch();
    j = 0;
    OSTimeDly(OS_TICKS_PER_SEC*3);
    GetAllChar();
	GetAllChar();
	OSSemPost(ModemSem);
	return 0;
}
/*********************************************************************************************************
** 函数名称: GPRSAutoTakeTheCall
** 功能描述: 接电话
** 输 入: 无
**
** 输 出: 成功 0 失败1
**
** 全局变量: 
** 调用模块: 
**
** 作 者: Yehaoben
** 日 期: 2005年7月1日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 GPRSAutoTakeTheCall()
{	
	uint8 err;
	OSSemPend(HaveCall, OS_TICKS_PER_SEC*2, &err);
	if(err == OS_NO_ERR)
	{
		ModemCommand("ATA");
		return 0;
	}
	else
		return 1;
}
/*********************************************************************************************************
** 函数名称: GPRSSetMSGCenter
** 功能描述: 设置短信中心
** 输 入: number 短信中心码
**
** 输 出: 成功 0 失败1
**
** 全局变量: 
** 调用模块: 
**
** 作 者: Yehaoben
** 日 期: 2005年7月1日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
const char GPRS_SETMSGCRT_STR[]={"AT+CSCA=\"%s\"\r\n"};
uint8 GPRSSetMSGCenter(char * number)
{	
	char sendchar[30];
	GetAllChar();
	_sprintf(sendchar,GPRS_SETMSGCRT_STR,number);
	ModemCommand(sendchar);
	return 0;
}
/*********************************************************************************************************
** 函数名称: GPRSTakeTheCall
** 功能描述: 接电话
** 输 入: 无
**
** 输 出: 成功 0 失败1
**
** 全局变量: 
** 调用模块: 
**
** 作 者: Yehaoben
** 日 期: 2005年7月1日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 GPRSTakeTheCall()
{	
	ModemCommand("ATA");
	return 0;
}
/*********************************************************************************************************
** 函数名称: GPRSHangUpTheCall
** 功能描述: 挂电话
** 输 入: 无
**
** 输 出: 成功 0 失败1
**
** 全局变量: 
** 调用模块: 
**
** 作 者: Yehaoben
** 日 期: 2005年7月1日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 GPRSHangUpTheCall()
{	
	ModemCommand("AT+CHUP");
	return 0;
}
/*********************************************************************************************************
** 函数名称: GPRSDelMSG
** 功能描述: 删除短信
** 输 入: num 短信的存储号(1~20)
**
** 输 出: 成功 0 失败1
**
** 全局变量: 
** 调用模块: 
**
** 作 者: Yehaoben
** 日 期: 2005年7月1日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
const char GPRS_DELMSG_STR[]={"AT+CMGD=%d\r\n"};
uint8 GPRSDelMSG(uint8 num)
{	
	char sendchar[15];
	
	GetAllChar();
	_sprintf(sendchar,GPRS_DELMSG_STR,num);
	ModemCommand(sendchar);
	return 0;
}
/*********************************************************************************************************
** 函数名称: GPRSReadMSG
** 功能描述: 读短信
** 输 入: 短信号码,对发号码,短信内容
**
** 输 出: 成功 0 失败1
**
** 全局变量: 
** 调用模块: 
**
** 作 者: Yehaoben
** 日 期: 2005年7月1日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
const char GPRS_RCVMSG_STR[]={"AT+CMGR=%d\r\n"};
uint8 GPRSReadMSG(uint8 num,char * number,char * MSG )
{	
	char sendchar[15];
	char i,j;
	uint8 err;
	
	GetAllChar();
	ModemCommand("AT+CMGF=1");
	
	OSSemPend(ModemSem, 0, &err);
	_sprintf(sendchar,GPRS_RCVMSG_STR,num);
	ModemWrite(sendchar,strlen(sendchar));
	i = ModemGetch();
	j = 0;
    while ( j <= 5  )
    {
        if (i == 0x2c)
        {
            break;
        }
        i = ModemGetch();
        if(i == 0)
        	j++;
    }
    if( j >=5 )
    {
    	OSSemPost(ModemSem);
    	return 1;
    }
	i = ModemGetch();//for "
	i=0;
	do//save number
	{
		number[i] = ModemGetch();
		i++;
	}while(number[i-1] != 0x22);
	number[i-1] = 0;
	
	err = 0;
	i = ModemGetch();
	while ( err <= 5 )//find the MSG
    {
    	j = i;
        i = ModemGetch();
        if (j == 0x0d)
        if (i == 0x0a)
        {
            break;
        }
        if(i ==  0)
        	err++;
    }
    
    j = 0;
    err = 0;
    MSG[0] = ModemGetch();
    MSG[0] = ModemGetch();
    while ( err <= 5 )//Save the MSG
    {
        MSG[j+1] = ModemGetch();
        //if ( (i == 'O') || (i == 'o') )
        //if ( (MSG[j] == 'K') || (MSG[j] == 'k') )
		if ( (MSG[j] == 0x4f) || (MSG[j] == 0x6f) )
        if ( (MSG[j+1] == 0x4b) || (MSG[j+1] == 0x6b) )
        {
            i = ModemGetch();
            i = ModemGetch();
            break;
        }
        if(MSG[j+1] ==  0)
        	err++;
        else
        	j++;
    }
    if( j > 0 )
    {
    	for(i = 0; i < j ; i++ )
    	{
    		if(MSG[i] == 0x0d )
    		if(MSG[i+1] == 0x0a )
    		if((MSG[i+2] == 0x4f) || (MSG[i+2] == 0x6f) )
        	if((MSG[i+3] == 0x4b) || (MSG[i+3] == 0x6b) )
        	{
        		MSG[i] = 0;
        		break;
        	}
    	}
    	OSSemPost(ModemSem);
    	return 0;
    }
    OSSemPost(ModemSem);
	return 1;
}
/*********************************************************************************************************
** 函数名称: UART1_Exception
** 功能描述: UART1中断服务程序
** 输 入: 无
**
** 输 出: 无
**         
** 全局变量: ModemState
** 调用模块: OSSemPost
**
** 作 者: 陈明计
** 日 期: 2004年2月25日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        void UART1_Exception(void)
{
    uint8 IIR, temp;
    
    OS_ENTER_CRITICAL();
    while(((IIR = U1IIR) & 0x01) == 0)
    {                                                   /* 有中断未处理完 */
        switch (IIR & 0x0e)
        {
            case 0x00:                                  /* Modem状态变化 中断    */
                break;
            case 0x02:                                  /* THRE中断    */
                //OSSemPost(Uart1Send);
                break;
            case 0x04:                                  /* 接收数据可用 */
                OSSemPost(Uart1Get);
                U1IER &= (~0x01);                       /* 禁止接收及字符超时中断 */
                break;
            case 0x06:                                  /* 接收线状态   */
                temp = U1LSR;
                break;
            case 0x0c:                                  /* 字符超时指示 */
                OSSemPost(Uart1Get);
                U1IER &= (~0x01);                       /* 禁止接收及字符超时中断 */
                break;
            default :
                break;
        }
    } 
    VICVectAddr = 0;            // 通知中断控制器中断结束
    OS_EXIT_CRITICAL();
}

/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -