gprs.c
资源名称:GPRS_work.rar [点击查看]
上传用户:sdaoma
上传日期:2013-08-07
资源大小:3838k
文件大小:21k
源码类别:
GPS编程
开发平台:
C/C++
- /****************************************Copyright (c)**************************************************
- ** 广州周立功单片机发展有限公司
- ** 研 究 所
- ** 产品一部
- **
- ** http://www.zlgmcu.com
- **
- **--------------文件信息--------------------------------------------------------------------------------
- **文 件 名: uart0.c
- **创 建 人: 陈明计
- **最后修改日期: 2003年7月4日
- **描 述: μCOS-II下LPC2000的Modem底层驱动
- **
- **--------------历史版本信息----------------------------------------------------------------------------
- ** 创建人: 陈明计
- ** 版 本: v1.0
- ** 日 期: 2004年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 = 0x0f; /* 允许接收和发送中断 */
- 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)
- {
- OSSemPend(Uart1Send, 0, &err);
- 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;
- }
- 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
- **
- ** 作 者: 陈明计
- ** 日 期: 2004年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(";rn", 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,
- **
- ** 作 者: 陈明计
- ** 日 期: 2004年2月25日
- **-------------------------------------------------------------------------------------------------------
- ** 修改人:
- ** 日 期:
- **-------------------------------------------------------------------------------------------------------
- ********************************************************************************************************/
- uint8 ModemCommand(char *Command)
- {
- char *cp;
- uint8 i,err;
- uint16 j;
- OSSemPend(ModemSem, 0, &err);
- GetAllChar();
- if (ModemState == MODEM_CLOSE)
- {
- while(1)
- {
- while ((U1LSR & 0x00000001) != 0)
- {
- err = U1RBR;
- }
- ModemWrite("ATrn", 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("rn", 2);
- i = ModemGetch();
- while (1)
- {
- err = i;
- i = ModemGetch();
- if (err == 'O' || err == 'o')
- if (i == 'K' || i == 'k')
- {
- i = ModemGetch();
- i = ModemGetch();
- 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);
- }
- }
- /*********************************************************************************************************
- ** 函数名称: ModemInit
- ** 功能描述: 初始化Modem
- ** 输 入: 波特率
- **
- ** 输 出: modem状态
- **
- ** 全局变量: ModemState
- ** 调用模块: UART1Init,OSTimeDly,ModemCommand,
- **
- ** 作 者: 陈明计
- ** 日 期: 2004年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("ATE0");
- ModemCommand("ATV0");
- ModemCommand("AT&C1");
- ModemCommand("AT&D2");
- ModemCommand("AT&R0");
- ModemCommand("AT&S0");
- ModemCommand("ATS0=2");*/
- 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"rn"};
- 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;
- }
- uint8 GPRSTakeTheCall()
- {
- ModemCommand("ATA");
- return 0;
- }
- uint8 GPRSHangUpTheCall()
- {
- ModemCommand("AT+CHUP");
- return 0;
- }
- const char GPRS_DELMSG_STR[]={"AT+CMGD=%drn"};
- 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=%drn"};
- 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状态变化 中断 */
- if ((U1MSR & 0x80) != 0)
- {
- ModemState = MODEM_CONNECT;
- }
- else
- {
- ModemState = MODEM_CLOSE;
- }
- if ((U1MSR & 0x40) != 0)
- {
- ModemState = MODEM_RING;
- }
- if ((U1MSR & 0x30) != 0x30)
- {
- ModemState = NOT_FIND_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
- ********************************************************************************************************/