/*********************************************************************
* INCLUDES
*/
#include "Global.h"
#include "Uart.h"
#include "Uart2.h"
#include <stdio.h>
/*********************************************************************
* CONSTANTS
*/
/*********************************************************************
* MACROS
*/
StrGsmDat gsm;
StrGsmContact contact;
StrGsmMsg msg;
/*********************************************************************
* TYPEDEFS
*/
/*********************************************************************
* LOCAL VARIABLES
*/
bit Rx_done;
/*********************************************************************
* GLOBAL VARIABLES
*/
/*********************************************************************
* GLOBAL VARIABLES
*/
/*********************************************************************
* LOCAL FUNCTIONS
*/
/*********************************************************************
* GLOBAL FUNCTIONS
*/
/*********************************************************************
* EXTERN VARIABLES
*/
/*********************************************************************
* EXTERN FUNCTIONS
*/
/*********************************************************************/
/*********************************************************************
* @fn &:main--
* @brief &:First function called after startup.
* @return &:don't care
*********************************************************************/
void GsmMain(void)
{
INT8S *pstr;
INT16U retrys = 5;
INT8U step = 0;
INT8U len = 0;
do {
switch(step)
{
/***********************************************
* 描述:先检查网络,如果网络已注册则进行短信查询,否则重新初始化
*/
case 0:
//UartPrintf(COMM_PORT_MSG,"检查网络:%d\r\n",retrys);
if ( ATSendCmd( 100,1,"AT+CREG?\r\n" ) ) {
pstr = FindStrInStrs( gsm.buf, ",");
if ( pstr ) {
pstr++;
switch( *pstr )
{
case '0':
//UartWriteString("未注册,停止搜网\r\n");
gsm.status = GSM_NOREG;
break;
case '1':
//UartWriteString("已注册,本地网络\r\n");
step++;
retrys = 10;
gsm.status = GSM_REGOK;
break;
case '2':
//UartWriteString("未注册,搜索网络...\r\n");
gsm.status = GSM_REGING;
break;
case '3':
//UartWriteString("注册被拒\r\n");
gsm.status = GSM_NOREG;
break;
case '4':
//UartWriteString("未知代码\r\n");
gsm.status = GSM_NOREG;
break;
case '5':
//UartWriteString("已注册,外地网络\r\n");
step++;
retrys = 10;
gsm.status = GSM_REGOK;
break;
default:
//UartWriteString("未知错误\r\n");
gsm.status = GSM_NOREG;
break;
}
} else {
UartPrintf(COMM_PORT_MSG,"操作失败\r\n");
}
}
break;
/***********************************************
* 描述:查询是否有短信,如果有短信则读短信,没有则不处理
*/
case 1:
//UartPrintf(COMM_PORT_MSG,"查询信息:%d\r\n",retrys);
if ( ATSendCmd( 100,1,"AT+CPMS?\r\n" ) ) {
if ( FindStrInStrs( gsm.buf, "OK") ) {
pstr = FindStrInStrs( gsm.buf, "SM");
if( pstr ) {
INT16U idx;
gsm.recvMsgCnt = PickUpIntFromStr(pstr,&len);
pstr += 5 + len;
len = 10;
gsm.maxMsgCnt = PickUpIntFromStr(pstr,&len);
//UartPrintf(COMM_PORT_MSG,"SM:%d,%d\r\n",(INT16U)gsm.recvMsgCnt, (INT16U)gsm.maxMsgCnt);
if( gsm.recvMsgCnt ) { // 如果有短信则读取
for( idx = 1; idx <= gsm.maxMsgCnt; idx++ ) {
msg.idx = idx;
msg.status = ReadOneMsg(&msg);
if ( MSG_ERROR == msg.status ) {
//UartPrintf(COMM_PORT_MSG,"短信%d读取错误\r\n",idx);
DealOneMsg(&msg);
} else if ( MSG_NULL != msg.status ) {
//UartPrintf(COMM_PORT_MSG,"短信%d读取成功\r\n",idx);
DealOneMsg(&msg);
if ( --gsm.recvMsgCnt == 0 )
break;
}
}
} else {
return ;
}
}
} else {
//UartWriteString("操作失败\r\n");
}
}
break;
}
} while (--retrys);
}
/*********************************************************************
* 名 称:应用初始化
* 功 能:GSM模块初始化
* 入口参数:
* 出口参数:无
* 作 者:
* 创建日期:
* 修 改:
* 修改日期:
*********************************************************************/
void AppInit( void )
{
/***********************************************
* 描述:全局变量及标志位初始化
*/
memset(gsm.buf,0x00,GSM_BUF_LEN);
gsm.recvIdx = 0;
gsm.recvMsgCnt = 0;
gsm.maxMsgCnt = 0;
gsm.ringCnt = 0;
gsm.ringTimeOut = 0;
gsm.status = 0;
gsm.retrys = 0;
/***********************************************
* 描述:系统初始化
*/
UartInit(); // 串口初始化
Uart2Init(); // 串口2初始化
//UartPrintf( COMM_PORT_MSG, "串口1初始化完成\r\n" );
//UartPrintf( COMM_PORT_MSG, "串口2初始化完成\r\n" );
/***********************************************
* 描述:系统初始化
*/
}
/*********************************************************************
* 名 称:GsmInit
* 功 能:GSM模块初始化
* 入口参数:
* 出口参数:无
* 作 者:
* 创建日期:2012-04-28
*********************************************************************/
BOOL GsmInit(void)
{
INT16U retrys = 3;
INT8U step = 0;
do {
switch(step)
{
/***********************************************
* 描述:连机测试
*/
case 0:
//UartPrintf(COMM_PORT_MSG,"设备连接:%d\r\n",retrys);
if ( ATSendCmd(100,1,"AT\r\n" ) ) {
if( FindStrInStrs( gsm.buf, "OK") ) {
step++;
retrys = 3;
gsm.status = GSM_CONNECT;
//UartPrintf(COMM_PORT_MSG,"操作成功\r\n");
} else {
//UartPrintf(COMM_PORT_MSG,"命令错误\r\n");
}
} else {
//UartWriteString("连接失败\r\n");
}
break;
/***********************************************
* 描述:取消回写
*/
case 1:
//UartPrintf(COMM_PORT_MSG,"关闭回写:%d\r\n",retrys);
if ( ATSendCmd(100,1,"ATE0\r\n" ) ) {
if( FindStrInStrs( gsm.buf, "OK") ) {
step++;
retrys = 3;
//UartPrintf(COMM_PORT_MSG,"操作成功\r\n");
} else {
//UartPrintf(COMM_PORT_MSG,"命令错误\r\n");
}
}
break;
/***********************************************
* 描述:检查SIM卡
*/
case 2:
//UartPrintf(COMM_PORT_MSG,"检查SIM卡状态:%d\r\n",retrys);
if ( ATSendCmd( 100,1,"AT+CPIN?\r\n" ) ) {
if ( FindStrInStrs( gsm.buf, "READY") ) {
step++;
retrys = 10;
gsm.status = GSM_READY;
//UartPrintf(COMM_PORT_MSG,"操作成功\r\n");
} else {
//UartPrintf(COMM_PORT_MSG,"命令错误\r\n");
}
}
break; /**
/***********************************************
* 描述:检查信号
*/
case 3:
//UartPrintf(COMM_PORT_MSG,"设置自动接收:%d\r\n",retrys);
if ( ATSendCmd( 100,1,"AT+CNMI=2,1\r\n" ) ) {
if ( FindStrInStrs( gsm.buf, "OK") ) {
gsm.status = GSM_REGOK;
goto exit;
//step++;
//retrys = 5;
//UartPrintf(COMM_PORT_MSG,"操作成功\r\n");
} else {
//UartPrintf(COMM_PORT_MSG,"未连网络\r\n");
}
}
break;
}
} while (--retrys);
exit:
if ( GSM_REGOK == ( 0XF0 & gsm.status ) ) {
///UartWriteString("GSM初始化成功\r\n");
return TRUE;
} else {
//UartWriteString("GSM初始化失败\r\n");
return FALSE;
}
}
/*********************************************************************
/*********************************************************************
* 名 称:SendOneMsg
* 功 能:发送一条短信
* 入口参数:
* 出口参数:成功返回TRUE,失败返回TRUE
* 作 者:
* 创建日期:2012-04-28
*********************************************************************/
BOOL SendOneMsg( StrGsmMsg *msg )
{
INT16U retry