📄 gprs.c
字号:
/****************************************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 + -