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

📄 sms.c

📁 GPS驱动集合
💻 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( &amt;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 &amt;= 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, &amt;ReturnBuffer[8] ); 
            return 0x05; //密码错误 
        } 
    } 
    
    strcpy( ReturnBuffer, &amt;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 &amt; 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 &amt;= 0xfe; 
        #ifdef HARDDEBUG1 
        DSend("Detect OK!!!!\r\n"); 
        #endif 
        break; 
        case '2': 
        WaitStatus &amt;= 0xfd; 
        LoginFlag = true; 
        #ifdef HARDDEBUG1 
        DSend("Login OK!!!!\r\n"); 
        #endif 
        break; 
        case '3':WaitStatus &amt;= 0xfb;break; 
        case '4': 
        #ifdef HARDDEBUG1 
        DSend("Power down OK!!!!\r\n"); 
        #endif 
        WaitStatus &amt;= 0xf7; 
        if( POWERDETECT ) DisableBattery( ); //掉电 
        while( true ) 
        { 
            if( !POWERDETECT ) 
            { 
                EnableBattery( ); 
                ClearWDT( ); 
                break; 
            } 
        } 
        break; 
        default:break; 
    } 
} 

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

⌨️ 快捷键说明

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