?? 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 + -