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

📄 gprs.c

📁 SmartARM2400系列开发板全套资料
💻 C
📖 第 1 页 / 共 4 页
字号:
/****************************************Copyright (c)**************************************************
**                               广州周立功单片机发展有限公司
**                                     研    究    所
**                                        产品一部 
**
**                                 http://www.zlgmcu.com
**
**--------------文件信息--------------------------------------------------------------------------------
** 创建人: XieLuWei
** 版  本: v1.0
** 日 期: 2007年2月25日
** 描 述: 原始版本
**
**------------------------------------------------------------------------------------------------------
** 修改人:
** 版  本:
** 日 期:
** 描 述:
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
** 描 述: 
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include 	"config.h"
#include	"GPS.h"
#include	"GPRS.h"

OS_EVENT	*DuartRcv;	//信号量,用于中断接收到有效Dual uart数据中断后通知任务
OS_EVENT	*GPRSSem;	//信号量,对GPRS modem进行写访问

/*****************************************************************************************
**	RcvGprsData[][]: GPRS接收数据的缓冲区
**	itemNum,wordNum 缓冲区的内部指针
*****************************************************************************************/
#define RCV_MAX 20
typedef struct
{
	char RcvBuf[160];
	char Status;	//当前字符串的状态:0,空闲;  1,正在接收数据;  2,接收到完整的一帧数据;
}RcvData;

static RcvData GprsRcvQueue[RCV_MAX];
static char itemNum=0;
static char wordNum=0;

static uint8 GPRSState;	//局部静态变量,记录当前GPRS的状态

char ShortMsg[141+1];	//按照规定一个短消息内容的最大长度+0x1A


/*****************************************************************************************************
** 函数名称: GPRS_RVC_HANDLE
** 功能说明: 存放字符ch到接收缓存GprsRcvQueue中
** 输 入: ch 接收到的字符
**        
** 输 出: 无
** 全局变量: 接收缓存GprsRcvQueue
** 调用模块: 无
**
** 作 者: 谢陆伟
** 日 期: 2007年6月13日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
*****************************************************************************************************/
static void GPRS_RVC_HANDLE(char ch)
{
	uint32 i;
	
	if( !isprint(ch) )	//收到的字符不是可打印字符
	{	
		if(wordNum != 0)	//如果收到不可打印字符的时候wordnum不为0,则说明到了字符串的结束
		{
			GprsRcvQueue[itemNum].RcvBuf[wordNum] = '\0';
			OS_ENTER_CRITICAL();
			GprsRcvQueue[itemNum].Status = 2;
			for(i=0; i<RCV_MAX; i++)
			{
				if(GprsRcvQueue[i].Status == 0)
				{
					itemNum = i;
					break;
				}
			}
			wordNum = 0;
			OS_EXIT_CRITICAL();
		}
	}
	else 	//收到的字符是可打印字符
	{
		GprsRcvQueue[itemNum].RcvBuf[wordNum++] = ch;
		if(wordNum==1) 
		{
			OS_ENTER_CRITICAL();
			GprsRcvQueue[itemNum].Status = 1;	//正在接收数据
			OS_EXIT_CRITICAL();
		}
		if(wordNum==2 && GprsRcvQueue[itemNum].RcvBuf[0]=='>' 
					  && GprsRcvQueue[itemNum].RcvBuf[1]==' ')	//发送短信息的时候出现这种情况
		{
			OS_ENTER_CRITICAL();
			GprsRcvQueue[itemNum].RcvBuf[wordNum] = '\0';
			GprsRcvQueue[itemNum].Status = 2;
			if(++itemNum >= RCV_MAX) itemNum = 0;
			wordNum = 0;
			OS_EXIT_CRITICAL();
		}
	}
}

/*********************************************************************************************************
** 函数名称: GprsGpsRead
** 功能描述: 将GPRS和GPS发送给MCU的数据保存到各自的接收缓存中
** 输 入: 无
**        
** 输 出: 无
** 全局变量: 无
** 调用模块: GPRS_RVC_HANDLE SC16C_Read GPS_RVC_HANDLE
**
** 作 者: 谢陆伟
** 日 期: 2007年6月25日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void GprsGpsRead( void )
{
//	while ((SC16C_Read(CSA|SC_ISR)&0x3F) != 0x01) /* 检查是否有中断发生 */
//	{
		while(SC16C_Read(CSA|SC_LSR)&0x01)
		{
			GPRS_RVC_HANDLE(SC16C_Read(CSA|SC_RHR));
		}
//	}
	while(SC16C_Read(CSB|SC_LSR)&0x01)	//GPS的接收通道没有打开中断
	{
		GPS_RVC_HANDLE(SC16C_Read(CSB|SC_RHR));
	}
}


/*********************************************************************************************************
** 函数名称: AddItem
** 功能描述: 将标志接收缓存位置的变量加1
** 函数编写说明: 在读取SMS的时候,SMS的附加信息和SMS的内容是用"\r\n"分开的,在接收
				 缓存中是分开两条保存的,为了得到SMS的内容,可以先得到指向SMS的附加
				 信息的指针,然后向下移动一位,就得到了SMS的内容的位置
** 输 入: 改变前的位置编号
** 输 出: 改变后的位置编号
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 谢陆伟
** 日 期: 2007年6月25日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 AddItem(uint8 pos)
{
	pos++;
	if(pos >= RCV_MAX) pos = 0;
	
	return pos;
}


/*********************************************************************************************************
** 函数名称: SubItem
** 功能描述: 将标志接收缓存位置的变量减1
** 输 入: 改变前的位置编号
** 输 出: 改变后的位置编号
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 谢陆伟
** 日 期: 2007年6月25日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 SubItem(uint8 pos)
{
	if(pos == 0) pos = RCV_MAX;
	else pos--;
	
	return pos;
}


/*********************************************************************************************************
** 函数名称: GPRSGetState
** 功能描述: 获取GPRS模块的状态
** 输 入: 无
**        
** 输 出: GPRS状态
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 谢陆伟
** 日 期: 2007年6月25日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 GPRSGetState(void)
{
	uint8 tmp;

	OS_ENTER_CRITICAL();
	tmp = GPRSState;
	OS_EXIT_CRITICAL();

    return tmp;
} 

/*********************************************************************************************************
** 函数名称: GPRSSetState
** 功能描述: 设置GPRS状态
** 输 入: 无
**        
** 输 出:   无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 谢陆伟
** 日 期: 2007年6月25日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void GPRSSetState(uint8 state)
{
	OS_ENTER_CRITICAL();
	GPRSState = state;
	OS_EXIT_CRITICAL();
} 


/*********************************************************************************************************
** 函数名称: GPRSWrite
** 功能描述: 发送多个字节数据
** 输 入: Data:发送数据存储位置
** 输 出:无
** 全局变量: 无
** 调用模块: 
**
** 作 者: 谢陆伟
** 日 期: 2007年6月16日
** 说  明: //这个函数还有改进的余地
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
static void GPRSWrite(const char *Data)
{
    while (*Data)
    {
        while( (SC16C_Read(CSA|SC_LSR)&0x40) == 0 );
        SC16C_Write(CSA|SC_THR, *Data++);
    }
} 


/*********************************************************************************************************
** 函数名称: GPRSCheckQueue(const char *str, char *pos)
** 功能描述: 查找接收缓冲中是否出现特定的字符串
** 输 入: 	str 指向特定字符串的指针
			pos	该数据在接收缓存中的位置
** 输 出: 0:未找到; 1:已找到;
** 全局变量: GprsRcvQueue,数据接收缓存
** 调用模块: 无
**
** 作 者: 谢陆伟
** 日 期: 2007年6月13日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 GPRSCheckQueue(const char *str, char *const pos)
{     
	uint32 i;

	for(i=0; i<RCV_MAX; i++)
	{
		OS_ENTER_CRITICAL();
		if( GprsRcvQueue[i].Status == 2)
		{
			OS_EXIT_CRITICAL();
			if(!strncmp(GprsRcvQueue[i].RcvBuf, str, strlen(str)))	//得到预想的数据
			{
				*pos = i;
				return 1;
			}
		}
		else
		{
			OS_EXIT_CRITICAL();
		}
	}
		
	return 0;	//得到信号量出错或者超时
}

/*********************************************************************************************************
** 函数名称: GPRSCheckQueueExt(const char *pResp, char *pos, char time)
** 功能描述: 在time时间内不断查找接收缓冲中是否出现特定的字符串
** 输   入: str 指向特定字符串的指针
** 输   出: 0:未找到; 1:已找到;
** 全局变量: GprsRcvQueue,数据接收缓存
** 调用模块: GPRSCheckQueue
**
** 作   者: 谢陆伟
** 日   期: 2007年6月13日
** 注意事项: time的最大值是65535,但是DlyTime所能够达到的最大值是65532,因此该函数在调用
**			 的时候,需要保证time的最大值不大于65532,即设置的时间不大于65532*TIME_PER_TICK
**			 (秒),TIME_PER_TICK为每个时钟节拍的时长,即为 1/OS_TICKS_PER_SEC 秒
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 GPRSCheckQueueExt(const char *pResp, char *const pos, uint16 time)
{
	uint16 DlyTime = 0;

	do
	{
		OSTimeDly(4);	//每隔4个时钟节拍检查一遍接收缓存
		DlyTime += 4;		
		if(GPRSCheckQueue(pResp,pos))
		{
			return 1;
		}
		
	}while(DlyTime < time);
	
	return 0;
}


/**********************************************************************************************************
** 函数名称: char *GPRSQueuePosPtr(char pos)
** 功能描述: 得到指向接收缓存中某一行的指针
**********************************************************************************************************/
char *GPRSQueuePosPtr(char pos)
{
	return GprsRcvQueue[pos].RcvBuf;
}

/**********************************************************************************************************
** 函数名称: char GPRSSetQueuePosSta(char pos)
** 功能描述: 在使用GPRSQueuePos得到指向接收缓存中某一行的指针,
			 使用完了之后,使用GPRSQueuePosFlag清除这一行的标志位	
**********************************************************************************************************/
static void GPRSSetQueuePosSta(char pos)
{
	OS_ENTER_CRITICAL();
	GprsRcvQueue[pos].Status = 0;
	OS_EXIT_CRITICAL();
}


/*********************************************************************************************************
** 函数名称: GPRSFlushQueueSpec(unsigned char *SpecStr)
** 功能描述: 清空接收缓冲区中特定类型的字符串,AT指令的回显等
** 输 入: 指向特定类型的字符串的指针
** 输 出: 无
** 全局变量: GprsRcvQueue,数据接收缓存
** 调用模块: 无
**
** 作 者: 谢陆伟
** 日 期: 2007年6月13日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void GPRSFlushQueueSpec(const char *SpecStr)
{
	uint32 i;
	
	for(i=0;i<RCV_MAX;i++)
	{
		OS_ENTER_CRITICAL();
		if(GprsRcvQueue[i].Status == 2)
		{
			OS_EXIT_CRITICAL();

⌨️ 快捷键说明

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