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

📄 sms.c

📁 基于KEIL C51和MC55模块的短消息发送和接收程序源代码,C51控制
💻 C
📖 第 1 页 / 共 2 页
字号:
/*******************************************************************
文件名:			sms.c
内容:			短消息程序
作者:			Bob Lee
创建日期:		2005-9-7
修改日期:		2005-9-7
版本:			1.00.000
*******************************************************************/
#include "sms.h"

/*------------------------------------------------------------------
名称:			ATCheck
作用:			向串口发送AT 指令后,检查其返回值 来确定 指令是否操作成功
输入:			TimeOut		->	超时时间
				ResultStr	->	期望字符
				CheckOK		->	是否有OK返回false/true
输出:			=0 正确
				=1 超时错误
				=2 返回错误
修改原因:
修改内容:
创建日期:		2005-8-26
修改日期:		2005-8-26
------------------------------------------------------------------*/
uchar ATCheck( uchar TimeOut,char* ResultStr,uchar CheckOK )
{

	unsigned char data i,res = 0x01,Flag = 0x00;
		
	for( i = 0x00; i < 0xff; i ++ ) ReturnBuffer[ i ] = 0x00;i = 0x00;
															//清接收数据缓冲区
	SecondRegister = TimeOut;Flag_1s = false;				//清定时器
	while( !Flag_1s )
	{
		ClearWDT( );

		ReturnBuffer[ i ] = ATReceive( );					//读取数据

#ifdef HARDDEBUG
	DSend( &ReturnBuffer[ i ] );
#endif

		if( !ReturnBuffer[ i ] ) continue;
		i ++;

		if( strstr( (char *)ReturnBuffer, "CMTI:") )
		{
			Flag_Hour = true;
			if( CheckOK == CHECKNEW ) return 0x00;
		}
															//有新短信
		if( strstr( (char *)ReturnBuffer, "ERROR\r\n") ){res = 0x02;break;}
															//判断是否为ERROR
		if( CheckOK )
		{
			if( strstr( (char *)ReturnBuffer, "OK\r\n" ) )
			{												//返回数据中有错误提示
				res = 0x00;
				if( ResultStr!= NULL )						//OK接收正确
				{
					if( !strstr( (char *)ReturnBuffer, ResultStr ) ) res = 0x03;
				}
				break;
			}
		}
		else
		{
			res = 0x03;										//Data error
			if( strstr( (char *)ReturnBuffer, ResultStr ) ){ res = 0x00; break; }				
															//Data right
		}

	}
	return res;
}

/*------------------------------------------------------------------
名称:			SendSMS
作用:			发送一条短信
输入:			Number -> 电话号码
				Contect -> 内容
输出:			=0成功
				>0失败
创建日期:		2005-8-26
修改日期:		2005-8-26
------------------------------------------------------------------*/
uchar SMSSend( char* Number, char* Content )
{
	char i;

#ifdef HARDDEBUG1
	DSend("\r\n\r\n==================================================\r\n:");
	DSend("电话号码:");
	DSend(Number);
	DSend("\r\n内容:");
	DSend(Content);
	DSend("\r\n:");
#endif
#ifdef SMSDEBUG
	return 0x00;
#endif

	for( i = 0x00; i < 0x11; i ++ )
	{
		if( Number[ i ] > '9' ) break;
		if( Number[ i ] < '0' ) break;
		pppp[ i ] = Number[ i ];
	}
	pppp[ i ] = 0x00;

	for( i = 0x00; i < 0x10; i ++ )
	{
		sprintf( TempBuffer, "AT+CMGS=\"%s\"\r", pppp );
		ATSend( TempBuffer );										//发送发送短信申请
		if( !ATCheck( MIDDLEWAIT, ">", NOTCHECKOK ) ) break;		//等待>
	}
	if(i > 0x0f){InitializeFlag = true;return 0x01;}

	SMSNumber ++;													//发送短消息条数
	SMSNumber &= 0x7fffffff;
	strcpy( TempBuffer,Content );									//发送短信
	sprintf( TempBuffer,"%s%c",Content,0x1a );
	ATSend( TempBuffer );
	if( ATCheck( LONGWAIT, "", CHECKOK ) ) return 0x01;				//等待OK
	return 0x00;
}                                   

/*------------------------------------------------------------------
名称:			DowithAT
作用:			接收并处理AT命令
输入:			=0x00 要求检查是否有短信
				>0x00 短信数目
输出:			无
创建日期:		2005-8-26
修改日期:		2005-8-26
------------------------------------------------------------------*/
void DowithAT( void )
{
	unsigned int data i, Number, AllNumber;
	unsigned char data j;

	//检查内存短信数目
	for( i = 0x00;i < 0x10;i ++)
	{
		ATSend( "AT+CPMS?\r" );
		if( !ATCheck( SHORTWAIT, "CPMS: \"SM\",", NOTCHECKOK) ) break;	//+[CPMS: "SM",]0,40
	}

	if( i > 0x0f ) { InitializeFlag = true; return; }					//超时错误,请求重新检测通讯设备

	if( ReceiveBuffer[ ReceiveHead ] == '0' )
	{
		ClearReceiveBuffer( );											//清空接收区
		return;
	}

	//取得短信数目
	if( ATCheck( SHORTWAIT, ",", NOTCHECKOK) ) return;					//+CPMS: "SM",0[,]40
	ReturnBuffer[ strlen( ReturnBuffer ) ] = 0x00;
	Number = atoi( ReturnBuffer );
	if( !Number ) return;
	//取得短信数目
	if( ATCheck( SHORTWAIT, ",", NOTCHECKOK) ) return;					//+CPMS: "SM",0[,]40
	ReturnBuffer[ strlen( ReturnBuffer ) ] = 0x00;
	AllNumber = atoi( ReturnBuffer );									//+CPMS: "SM",0[,]40
	ATCheck( SHORTWAIT, "", CHECKOK);

	ClearReceiveBuffer( );

	//读所有短信
	for( i = 0x01; i < AllNumber; i ++ )
	{
		if( !Number ) break;											//处理完毕

		sprintf( TempBuffer,"AT+CMGR=%d\r",i );							//要求读短信
		ATSend( TempBuffer );											

		if( ATCheck( SHORTWAIT,"CMGR:",NOTCHECKOK)) continue;
		j = 1;
		if( ATCheck( SHORTWAIT,"READ\",\"",NOTCHECKOK)) goto NotRightSMS;
		if( ATCheck( SHORTWAIT,",",NOTCHECKOK)) goto NotRightSMS;

		for(j = 0x00;j < 0x11;j ++)
		{
			if( ReturnBuffer[ j ] < '0' ) break;
			if( ReturnBuffer[ j ] > '9' ) break;
			SendPhoneNumber[j] = ReturnBuffer[j];
		}
		SendPhoneNumber[j] = 0x00;

		if( ATCheck( MIDDLEWAIT,"SZ",NOTCHECKOK)) goto NotRightSMS;
		if( ATCheck( MIDDLEWAIT,"",CHECKOK)) goto NotRightSMS;

		j = SMSCheck( );
		switch( j )
		{
			case 0x01:ConfirmSMS( );break;							//确认短信
			case 0x02:AskSetupSMS( );break;							//询问设置内容短信
			case 0x03:AskDetectSMS( );break;						//询问监测状态短信
			case 0x04:SetupSMS( );break;							//设置短信
			case 0x05:ErrorPassword( );break;						//短信密码错误
			case 0x06:ErrorData( );break;							//短信数据错误
			default:break;											//无效短信
		}

NotRightSMS:

		Number --;
		sprintf( TempBuffer,"AT+CMGD=%d\r",i );
		ATSend( TempBuffer );											//要求读短信
		ATCheck( LONGWAIT, "", CHECKOK );	
	
	}
}

/*------------------------------------------------------------------
名称:			SMSCheck
作用:			判断短信内容
输入:			无
输出:			=0:无效短信
				=1:为确认短信
				=2:询问设置内容短信
				=3:询问监测状态短信
				=4:设置短信
				=5:短信密码错误
				=6:短信数据错误
创建日期:		2005-8-26
修改日期:		2005-8-26
------------------------------------------------------------------*/
uchar SMSCheck( void )
{
	char *Station;
	unsigned char data i;
	
	i = 5;																//SZ{(}00{)[}0{]}
	if( ReturnBuffer[0] != '(' ) i --;									//短信为确认短信
	if( ReturnBuffer[1] != '1' ) i --;									//不是有效短信
	if( ReturnBuffer[3] != ')' ) i --;									//不是有效短信
	if( ReturnBuffer[4] != '[' ) i --;									//不是有效短信
	if( ReturnBuffer[6] != ']' ) i --;									//不是有效短信
	if( i == 5 )
	{
		ReturnBuffer[ 0x00 ] = ReturnBuffer[ 2 ];
		ReturnBuffer[ 0x01 ] = ReturnBuffer[ 5 ];
		return 0x01;
	}

	if( ReturnBuffer[0] != '[' ) return 0x00;							//SZ{[}000000](00)<00...00>(00)<00...00>
	if( ReturnBuffer[7] != ']' ) return 0x00;							//SZ[000000{]}(00)<00...00>(00)<00...00>
	if( ReturnBuffer[8] != '(' ) return 0x00;							//SZ{[}000000](00)<00...00>(00)<00...00>
	if( ReturnBuffer[11] != ')' ) return 0x00;							//SZ[000000{]}(00)<00...00>(00)<00...00>

	for( i = 0x00; i < 0x06; i ++ )										//SZ[{000000}](00)<00...00>(00)<00...00>
	{
		if( ReturnBuffer[ i + 1 ] != Password[ i ] )
		{
			strcpy( TempBuffer, &ReturnBuffer[8] );
			return 0x05;		//密码错误
		}
	}
	
	strcpy( ReturnBuffer, &ReturnBuffer[8] );
	strcpy( TempBuffer, ReturnBuffer );

	if( ReturnBuffer[ 0 ] != '(' ) return 0x06;							//SZ[000000]{(}00)<00...00>(00)<00...00>
	if( ReturnBuffer[ 3 ] != ')' ) return 0x06;							//SZ[000000](00{)}<00...00>(00)<00...00>
	if( ReturnBuffer[ 4 ] != '<' ) return 0x06;							//SZ[000000](00){<}00...00>(00)<00...00>
	Station = strstr( ReturnBuffer, ">" );								//SZ[000000](00)<00...00{>}(00)<00...00>
	if( !Station ) return 0x06;

	i = Station - ReturnBuffer;
	strncpy( TempBuffer, ReturnBuffer, i );
	TempBuffer[i] = 0x00;
	strcpy( ReturnBuffer, Station + 1 );
	ReturnBuffer[ i ] = 0x00;
	if( strcmp( TempBuffer, ReturnBuffer ) ) return 0x06;				//SZ[000000]{(00)<00...00>(00)<00...00>}

	switch( ReturnBuffer[ 1 ] )
	{
		case '0':i = 4;break;											//设置参数
		case '8':i = 2;break;											//查询参数
		case '9':i = 3;break;											//查询监测状态
		default:i = 6;break;
	}

	return (i & 0x7f);
}

/*------------------------------------------------------------------
名称:			ConfirmSMS
作用:			确认短信
输入:			无
输出:			无
创建日期:		2005-8-26
修改日期:		2005-8-26
------------------------------------------------------------------*/
void ConfirmSMS( void )
{
	if( ReturnBuffer[1] == '1' )
	{
		if(!strcmp(SendPhoneNumber,PhoneNumber))
		{
			strcpy( PasswordCheck, "?????" );
			return;
		}
	}
	if( ReturnBuffer[1] == '2' )
	{
		return;
	}
	
	switch( ReturnBuffer[0] )
	{
		case '1':
			WaitStatus &= 0xfe;
#ifdef HARDDEBUG1
	DSend("Detect OK!!!!\r\n");
#endif
			break;
		case '2':
			WaitStatus &= 0xfd;
			LoginFlag = true;
#ifdef HARDDEBUG1
	DSend("Login OK!!!!\r\n");
#endif
			break;
		case '3':WaitStatus &= 0xfb;break;
		case '4':
#ifdef HARDDEBUG1
	DSend("Power down OK!!!!\r\n");
#endif
			WaitStatus &= 0xf7;
			if( POWERDETECT ) DisableBattery( );						//掉电
			while( true )
			{ 
				if( !POWERDETECT )
				{
					EnableBattery( );
					ClearWDT( );
					break;
				}
			}
			break;
		default:break;
	}
}

/*------------------------------------------------------------------
名称:			AskSetupSMS
作用:			询问设置短信
输入:			无
输出:			无
创建日期:		2005-8-26
修改日期:		2005-8-26
------------------------------------------------------------------*/
void AskSetupSMS( void )
{

	TempBuffer[0x00] = '(';							//(00)<
	TempBuffer[0x01] = '0';
	TempBuffer[0x02] = ReturnBuffer[2];
	TempBuffer[0x03] = ')';
	TempBuffer[0x04] = '<';
	TempBuffer[0x05] = 0x00;

⌨️ 快捷键说明

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