📄 sms.cpp
字号:
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Copyright (C), 2005, TopBond Tech. Co., Ltd.
* File name: SMS.CPP
* Module name: 收发短信低层函数的模块
* Author/Date: WuHuan 06/02/14
* Version: Ver 1.0
* Description: 收发短信低层系列函数的.CPP文件
* Others: 如有改动,请在下面的历史记录登记,谢谢合作!
------------------History-----------------------------
* Modifier/Date: //修订人及修订日期
* Modify Reason: //修订原因
* Modification: //修订的内容和位置的简要说明
------------------------------------------------------
* Modifier/Date: //修订人及修订日期
* Modify Reason: //修订原因
* Modification: //修订的内容和位置的简要说明
------------------------------------------------------
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <time.h>
#include <string.h>
#include <math.h>
#include "sms.h"
//#include "gprs.h" //add by wuhuan 06.03.24
#include "wdt.h" //add by wuhuan 06.03.24
#include "etr232i.h"
#include "rs232x3.h"
#include "keymenu.h"
#define retries 5 //# A counter for the number of retries
/***************************************************************************/
//下列声明的函数为短信的编解码函数,如若对短信的编解码不熟悉,请勿改动以下函数
int ConvertUDStr( char* InStr, char* OutStr );
void ConvertPhoneNumber( char* InStr, char* OutStr );
int GetRcvMSG( char* Str ); //读取短信的内容
void ToPhoneNumber( char* InStr, char* OutStr );
void ToTime( char* InStr, char* OutStr );
int Bit8ToStr( char* InStr, char* OutStr );
int Bit16ToStr( char* InStr, char* OutStr );
int GetMSGList( struct RcvSMSInfo* Info ); //检查SIM卡中未读短信的条数
/**************************************************************************/
//全局数组,改动前请查看它们在各个函数中的位置及其作用
unsigned char far str1[20], str2[200], str[200];
/***************************************************************
SMSRingFlg = 0: SMS state; =1: Ring state;在MAIN.CPP中定义;
让ETR232I模块在接收短信和检查震铃两种状态间切换
***************************************************************/
extern int SMSRingFlg ;
///////////////////////////////////
//存储AT指令响应的字符串或返回的短信字符
char far ReturnStr[2560];
int Check_Returnlen=0;
unsigned long StartTickNum;
int SEND( char* cmdstr ) //通过COM2口发AT指令
{
int i, len;
len = strlen( cmdstr );
for( i=0; i<len; i++ )
PutOutputData( SMSCOM, cmdstr[i] );
StartSend( SMSCOM );
StartTickNum = clock( );
return i;
}
int RcvIsTimeOut( long NumTick )
{
unsigned long CurrentTick;
if( NumTick == 0 ) return 0;
CurrentTick = clock( );
if( CurrentTick >= (StartTickNum + NumTick)) return 1;
else return 0;
}
int CHECK( long TimeOutNum, char* EchoStr )
{
int i, i1, EchoStrlen;
char abyte;
EchoStrlen = strlen( EchoStr );
i1 = GetInputData( SMSCOM );
if( i1 != -1 )
{
abyte = (char)i1;
if( abyte == '\r' ) ReturnStr[Check_Returnlen] = 'r';
else if( abyte == '\n' ) ReturnStr[Check_Returnlen] = 'n';
else ReturnStr[Check_Returnlen] = abyte;
Check_Returnlen++;
ReturnStr[Check_Returnlen] = '\0';
if( Check_Returnlen >= EchoStrlen )
if( strncmpi( &ReturnStr[Check_Returnlen - EchoStrlen], EchoStr, EchoStrlen )==0 )
{
Check_Returnlen = 0;
return 0; //AT响应正确
}
if( Check_Returnlen >= 2560 ) { Check_Returnlen = 0; return -1; }
}
if( RcvIsTimeOut(TimeOutNum) ) { Check_Returnlen = 0; return -1; }
return 1; //正在接收AT响应的字符串
}
int ReceiveSMS( char* Content, int Index )
{
int i,i1 ;
static ReceiveSMS_State State_of_ReceiveSMS = ReceiveSMS_START; // 定义描述ReceiveSMS()函数状态的全局变量
switch( State_of_ReceiveSMS )
{
case ReceiveSMS_START:
SEND( "ATE0\r" );
State_of_ReceiveSMS = ReceiveSMS_ATE0_Get;
break;
case ReceiveSMS_ATE0_Get:
i = CHECK( 2,"OKrn" );
if( i==0 )
{
SMSRingFlg = 1;
State_of_ReceiveSMS = ReceiveSMS_ATCMGF_SEND;
}
else if(i<0)
{
SMSRingFlg = 1;
State_of_ReceiveSMS = ReceiveSMS_Idle;
StartTickNum = clock( );
}
break;
case ReceiveSMS_ATCMGF_SEND:
SEND( "AT+CMGF=0\r" );
State_of_ReceiveSMS = ReceiveSMS_ATCMGF_GET;
break;
case ReceiveSMS_ATCMGF_GET:
i = CHECK( 2,"OKrn" );
if( i==0 )
{
SMSRingFlg = 1;
State_of_ReceiveSMS = ReceiveSMS_ATCMGR_SEND;
}
else if(i<0)
{
SMSRingFlg = 1;
State_of_ReceiveSMS = ReceiveSMS_Idle;
StartTickNum = clock( );
}
break;
case ReceiveSMS_ATCMGR_SEND:
sprintf( str1, "AT+CMGR=%d\r", Index );
SEND( str1 );
State_of_ReceiveSMS = ReceiveSMS_ATCMGR_GET;
break;
case ReceiveSMS_ATCMGR_GET:
i = CHECK( 20,"OKrn" );
if( i==0 )
{
SMSRingFlg = 1;
i1 = GetRcvMSG( Content );
if(GetKPState==LOCK) printf(" i1 = %d\n",i1);
sprintf( str1, "AT+CMGD=%d\r", Index );
SEND( str1 );
State_of_ReceiveSMS = ReceiveSMS_START;
return i1; //返回实际接受到短信内容的字节数
}
else if(i<0)
{
SMSRingFlg = 1;
State_of_ReceiveSMS = ReceiveSMS_Idle;
StartTickNum = clock( );
}
break;
case ReceiveSMS_Idle:
if( RcvIsTimeOut(20) ) State_of_ReceiveSMS = ReceiveSMS_START;
break;
}
/////////////////////////////////////////////////////////////////////*/
return 0;
}
//extern GTimeOut;
int CheckSMS( struct RcvSMSInfo* Info )
{
int i, i1;
static CheckSMS_State State_of_CheckSMS = CheckSMS_START; // 定义描述CheckSMS()函数状态的全局变量
static int num = retries;
switch(State_of_CheckSMS)
{
case CheckSMS_START:
num--;
if( num < 0)
{
State_of_CheckSMS = CheckSMS_Idle;
StartTickNum = clock( );
}
else State_of_CheckSMS = CheckSMS_ATE0_SEND;
if(GetKPState==LOCK) printf("step0 running\n");
break;
case CheckSMS_ATE0_SEND:
SEND( "ATE0\r" );
State_of_CheckSMS = CheckSMS_ATE0_Get;
if(GetKPState==LOCK) printf("step1 running\n");
break;
case CheckSMS_ATE0_Get:
i = CHECK( 80,"OKrn" );
if(i==0)
{
num = retries;
SMSRingFlg = 1;
State_of_CheckSMS = CheckSMS_ATCMGF_SEND;
}
else if(i<0 )
{
if(GetKPState==LOCK) printf("step2 timeout\n");
//NB_Delay( 1000 );
SMSRingFlg = 1;
State_of_CheckSMS = CheckSMS_Idle;
StartTickNum = clock( );
}
if(GetKPState==LOCK) printf("step2 running\n");
break;
case CheckSMS_ATCMGF_SEND:
SEND( "AT+CMGF=0\r" );
State_of_CheckSMS = CheckSMS_ATCMGF_GET;
if(GetKPState==LOCK) printf("step3 running\n");
break;
case CheckSMS_ATCMGF_GET:
i = CHECK( 80,"OKrn" );
if(i==0)
{
SMSRingFlg = 1;
State_of_CheckSMS = CheckSMS_ATCMGL4_SEND ;
}
else if(i<0 )
{
SMSRingFlg = 1;
State_of_CheckSMS = CheckSMS_Idle;
if(GetKPState==LOCK) printf("step4 timeout\n");
StartTickNum = clock( );
}
if(GetKPState==LOCK) printf("step4 running\n");
break;
case CheckSMS_ATCMGL4_SEND:
SEND( "AT+CMGL=0\r" ); //显示所有未读的短信
State_of_CheckSMS = CheckSMS_ATCMGL4_GET ;
//if(GetKPState==LOCK) printf("step5 running\n");
break;
case CheckSMS_ATCMGL4_GET :
i = CHECK( 120,"OKrn" ); //change 80 to 120 by wuhuan 06.03.24
if( i==0 )
{
SMSRingFlg = 1;
i1 = GetMSGList( Info );
//if(GetKPState==LOCK) printf("GetMSGList=%d\n",i1);
//NB_Delay( 1000 );
State_of_CheckSMS = CheckSMS_ATCMGL4_SEND;
return i1; //返回值>0:接收到短信
}
else if(i<0 )
{
if(GetKPState==LOCK) printf("step6 timeout\n");
//NB_Delay( 1000 );
SMSRingFlg = 1;
State_of_CheckSMS = CheckSMS_Idle;
StartTickNum = clock( );
}
// if(GetKPState==LOCK) printf("step6 running\n");
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -