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

📄 gprs.c

📁 周立功SMART ARM2200上GPRS源码,快下吧,好东西
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************Copyright (c)**************************************************
**                               广州周立功单片机发展有限公司
**                                     研    究    所
**                                        产品一部 
**
**                                 http://www.zlgmcu.com
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: GPRS.c
**创   建   人: 叶皓贲
**最后修改日期: 2005年7月4日
**描        述: μCOS-II下LPC2000的GPRS底层驱动 
**              
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: Yehaoben
** 版  本: v1.0
** 日 期: 2007年2月25日
** 描 述: 原始版本
**
**------------------------------------------------------------------------------------------------------
** 修改人:
** 版  本:
** 日 期:
** 描 述:
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
** 描 述: 
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/

#define 	IN_MODEM
#include 	"config.h"

#define  	GPRS_TASK_STK_SIZE                  128
OS_STK      GPRSTaskStartStk[GPRS_TASK_STK_SIZE];

static 		OS_EVENT *ModemSem, *Uart1Send, *Uart1Get,*HaveCall;
static 		uint8 ModemState;

/*********************************************************************************************************
** 函数名称: UART1Init
** 功能描述: 初始化UART0 
** 输 入: bps:波特率
**
** 输 出:TRUE  :成功
**        FALSE:失败
** 全局变量: Uart0Sem
** 调用模块: OSSemCreate
**
** 作 者: 陈明计
** 日 期: 2004年2月25日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**-------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        void UART1Init(uint32 bps)
{
    uint16 Fdiv;
    
    PINSEL0 = (PINSEL0 & 0x0000ffff) | 0x55550000;  /* 选择管脚为UART0 */

    U1LCR = 0x80;                                   /* 允许访问分频因子寄存器 */
    Fdiv = (Fpclk / 16) / bps;                      /* 设置波特率 */
    U1DLM = Fdiv / 256;							
	U1DLL = Fdiv % 256;						
    U1LCR = 0x03;                                   /* 禁止访问分频因子寄存器 */
                                                    /* 且设置为8,1,n */
	U1IER = 0x01;                                   /* 允许接收和发送中断 */
    U1FCR = 0x87;                                   /* 初始化FIFO */
    U1MCR = 0x03;
    Uart1Send = OSSemCreate(1);
    Uart1Get = OSSemCreate(0);

}
/*********************************************************************************************************
** 函数名称: GetModemState
** 功能描述: 获取MODEM状态
** 输 入: 无
**        
** 输 出: MODEM状态
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2004年2月25日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        uint8 GetModemState(void)
{
    return ModemState;
} 

/*********************************************************************************************************
** 函数名称: ModemWrite
** 功能描述: 发送多个字节数据
** 输 入: Data:发送数据存储位置
**        NByte:发送数据个数
** 输 出:无
** 全局变量: 无
** 调用模块: UART0Putch
**
** 作 者: 陈明计
** 日 期: 2004年2月25日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        uint8 ModemWrite(char *Data, uint16 NByte)
{
    uint8 err,i;
    
    while (NByte > 0)
    {
        while((U1LSR&0X40) == 0);
        for (i = 0; i < 8; i++)
        {
            U1THR = *Data++;
            NByte--;
            if (NByte == 0)
            {
                break;
            }
        }
    }

    return ModemState;
} 

/*********************************************************************************************************
** 函数名称: UART0Getch
** 功能描述: 接收一个字节
** 输 入: 无
** 输 出: 接收到的数据
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2004年2月25日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        uint8 ModemGetch(void)
{
    uint8 rt;

    OS_ENTER_CRITICAL();
    while ((U1LSR & 0x00000001) == 0)
    {                                           /* 没有收到数据 */
        U1IER = U1IER | 0x01;                   /* 允许接收中断 */
        OSSemPend(Uart1Get,OS_TICKS_PER_SEC/2, &rt);
        
        break;
    }
    if(rt == OS_TIMEOUT)
    	rt = 0;
    else
    	rt = U1RBR;                                 /* 读取收到的数据 */
    OS_EXIT_CRITICAL();

    return rt;
} 
/*********************************************************************************************************
** 函数名称: GetAllChar
** 功能描述: 接收当前的所有字节
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: Yehaoben
** 日 期: 2005年2月25日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void GetAllChar()
{
	uint8 i,j;
	OS_ENTER_CRITICAL();
	U1IER = U1IER | 0x01;                   /* 允许接收中断 */
	OS_EXIT_CRITICAL();
	for (i = 0; i < 120; i++)
    {
    	j = ModemGetch();
    	if (j == 0)
    		break;
        
    }
}
/*********************************************************************************************************
** 函数名称: ModemDialUp
** 功能描述: 通过modem拨号 
** 输 入: 电话号码
**
** 输 出: modem状态
**
** 全局变量: ModemState
** 调用模块: ModemWrite,OSTimeDly
**
** 作 者: Yehaoben
** 日 期: 2005年2月25日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        uint8 ModemDialUp(char Number[])
{
    char *cp;
    uint8 i;
    uint8 err;
    OSSemPend(ModemSem, 0, &err);
    if (ModemState == MODEM_CLOSE)
    {
        while ((U1LSR & 0x00000001) != 0)
        {
            err = U1RBR;
        }
        ModemWrite("ATD", 3);
        i = 0;
        cp = Number;
        while (*cp++ != 0)
        {
            i++;
        }
        ModemWrite(Number, i);
        ModemWrite(";\r\n", 3);
        GetAllChar();
    }
    OSSemPost(ModemSem);
    return ModemState;
}
/*********************************************************************************************************
** 函数名称: ModemDialDown
** 功能描述: 挂断modem 
** 输 入: 无
**
** 输 出: modem状态
**
** 全局变量: ModemState
** 调用模块: OSTimeDly
**
** 作 者: 陈明计
** 日 期: 2004年2月25日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        uint8 ModemDialDown(void)
{
    U1MCR = 0x02;
    OSTimeDly(OS_TICKS_PER_SEC / 10);
    U1MCR = 0x03;
    OSTimeDly(OS_TICKS_PER_SEC / 10);
    return ModemState;
}
/*********************************************************************************************************
** 函数名称: ModemCommand
** 功能描述: 向modem发送命令 
** 输 入: 命令字符串
**
** 输 出: modem状态
**
** 全局变量: ModemState
** 调用模块: ModemWrite,ModemGetch,
**
** 作 者: yehaoben
** 日 期: 2005年2月25日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        uint8 ModemCommand(char *Command)
{
    uint8 i,err;
    uint16 j;
    OSSemPend(ModemSem, 0, &err);
    GetAllChar();
    if (ModemState == MODEM_CLOSE)
    {
        while(1)
        {
	        while ((U1LSR & 0x00000001) != 0)
	        {
	            err = U1RBR;
	        }
	        ModemWrite("AT\r\n", 4);
	        i = ModemGetch();
	        j = 0;
	        while ( j <= 20 )
	        {
	            err = i;
	            i = ModemGetch();
	            if (err == 'O' || err == 'o')
	            if (i == 'K' || i == 'k')
	            {
	                i = ModemGetch();
	                i = ModemGetch();
	                break;
	            }
	            if( (i == 0) && (j == 3) )
	            {
	            	j=20;
	            }
	            j++;
	        }
	        if(j >=20 )
        	{
        		continue;
        	}
        	else
        		break;
        }
       
        ModemWrite(Command, strlen(Command));
        ModemWrite("\r\n", 2);
        i = ModemGetch();
        j=0;
        while (1)
        {
            err = i;
            i = ModemGetch();
            if (err == 'O' || err == 'o')
            if (i == 'K' || i == 'k')
            {
                i = ModemGetch();
                i = ModemGetch();
                break;
            }
            if(i == 0)
            	j++;
            if(j >= 3 )
            	break;
            	
        }
        GetAllChar();
        
    }
    OSSemPost(ModemSem);
    return ModemState;
}
/*********************************************************************************************************
** 函数名称: GPRSCheckTask
** 功能描述: GPRS检查是否有电话来和检查是否有新的短信。
** 输 入: 无
**
** 输 出: 无
**
** 全局变量: ModemState
** 调用模块: UART1Init,OSTimeDly,ModemCommand,
**
** 作 者: Yehaoben
** 日 期: 2005年7月2日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        void  GPRSCheckTask(void *pdata)
{
	uint8 i,err,temp[3];
	while(1)
	{
		OSTimeDly(OS_TICKS_PER_SEC*2);
		OSSemPend(ModemSem, 0, &err);
		do
		{
			i = ModemGetch();
			if( i == 'R' )
			{
				temp[0] = ModemGetch(); 
				temp[1] = ModemGetch(); 
				temp[2] = ModemGetch(); 
				if( temp[0] == 'I' )
				if( temp[1] == 'N' )
				if( temp[2] == 'G' )
					OSSemPost(HaveCall);
			}
		}while( i != 0 );
		OSSemPost(ModemSem);

⌨️ 快捷键说明

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