📄 sms.c
字号:
/*******************************************************************
文件名: 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 + -