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

📄 modem.c

📁 一个完整的MODEM例程
💻 C
📖 第 1 页 / 共 2 页
字号:

/****************************************************************************
* 名称:GetModemState()
* 功能:读取MODEM状态值。
* 入口参数:无
* 出口参数:当前MODEM状态值
****************************************************************************/
uint8  GetModemState(void)
{
    return(ModemState);
}


/****************************************************************************
* 名称:ModemInit()
* 功能:初始化MODEM。
* 入口参数:bps		串口波特率
* 出口参数:返回当前MODEM状态值
****************************************************************************/
uint8  ModemInit(uint32 bps)
{
    uint8 temp;
    uint32 count;
    ModemState = MODEM_CLOSE;					// 设置MODEM已关闭状态
    UART1Init(bps);								// 初始化UART1

    temp=U1MSR;
    /*if((temp & 0x30) != 0x30)					// 判断DSR、CTS是否有效
    {
        DelayNS(1);
        if((temp & 0x30) != 0x30)
        {
            ModemState = NOT_FIND_MODEM;		// 没有发现MODEM
        }
    }*/
    
    if(ModemState == MODEM_CLOSE)				// 进行MODEM初始化
    {
        //ModemCommand("ATE0");				// 关闭命令回显	
        ModemWrite("ATE0\r", 5);				// 发送AT指令
        
        count=0;
        do{
            if(count>20000)
            {
                ModemWrite("ATE0\r", 5);
                count=0;
            }
        }while(RecPointer==0);
        
        if(RecPointer==11||RecPointer==06||RecPointer==02||RecPointer==07)  //ATE0\r\r\nOK\r\n,\r\nOK\r\n,0\r
        {
            if(RecPointer==11)
            {
                if(RecBuff[ReadPointer]=='A'||RecBuff[ReadPointer]=='a')
                {
                    while(ReadPointer<RecPointer)
                    {
                        if(RecBuff[ReadPointer]=='O'||RecBuff[ReadPointer]=='o')
                        {
                            ReadPointer++;
                            if(RecBuff[ReadPointer]=='K'||RecBuff[ReadPointer]=='k')
                            {
                                U1IER &= (~ 0x01);                   // 允许接收中断 
                                RecPointer=ReadPointer=0;
                                U1IER = U1IER | 0x01;                   // 允许接收中断 
                                break;
                            }
                        }
                        
                        ReadPointer++;
                    }
                    
                    if(ReadPointer!=0)
                    {
                        RecPointer=ReadPointer=0;
                        return NOT_FIND_MODEM;
                    }
                }
            }
            else if(RecPointer==07)
            {
                if(RecBuff[0]!='A'||RecBuff[1]!='T'||RecBuff[2]!='E'||RecBuff[3]!='0'||RecBuff[5]!='0')
                {
                    RecPointer=ReadPointer=0;
                    return NOT_FIND_MODEM;
                }
            }
            else if(RecPointer==06)
            {
                while(ReadPointer<RecPointer)
                {
                    if(RecBuff[ReadPointer]=='O'||RecBuff[ReadPointer]=='o')
                    {
                        ReadPointer++;
                        if(RecBuff[ReadPointer]=='K'||RecBuff[ReadPointer]=='k')
                        {
                            U1IER &= (~ 0x01);                   // 允许接收中断 
                            RecPointer=ReadPointer=0;
                            U1IER = U1IER | 0x01;                   // 允许接收中断 
                            break;
                        }
                    }
                    
                    ReadPointer++;
                }
                
                if(ReadPointer!=0)
                {
                    RecPointer=ReadPointer=0;
                    return NOT_FIND_MODEM;
                }
            }
            else
            {
                if(RecBuff[0]=='0'&&RecBuff[1]==13)
                {
                    U1IER &= (~ 0x01);                   // 允许接收中断 
                    RecPointer=ReadPointer=0;
                    U1IER = U1IER | 0x01;                   // 允许接收中断  
                }
                else
                {
                    return NOT_FIND_MODEM;
                }
            }
         }
         else
         {
            return NOT_FIND_MODEM;
         }   
       	
        ModemCommand("ATV0");					// 以数字形式返回结果码
        ModemCommand("AT&C1");					// 数据载波检测(DCD)选择有效
        ModemCommand("AT&D2");					// 数据终端准备就绪(DTR)选择,当DTR由ON-OFF时,MODEM将挂机,并返回命令状态
        ModemCommand("AT&R0");					// 请求发送(RTS)/清除发送(CTS)选择,当MODEM在线时,CTS跟随RTS的变化
        ModemCommand("AT&S0");					// 数据设备就绪(DSR)选择,DSR一直有效
        ModemCommand("ATS0=2");					// 自动摘机应答设置,响铃2次后MODEM自动摘机
    }
    
    DelayNS(10);
    //ModemState=5;
    return(ModemState);
}

/****************************************************************************
*
*
*   命令的应答
*
*
*
*****************************************************************************/
uint8 WaitCmdAck(void)
{
    DelayNS(1);
    while(ReadPointer<RecPointer)
    {
        if(RecBuff[ReadPointer]=='0')
        {
            U1IER &= (~ 0x01);                   // 允许接收中断 
            RecPointer=ReadPointer=0;
            U1IER = U1IER | 0x01;                // 允许接收中断 
                
            return(ModemState);
        }
        
        ReadPointer++;
   }

   if(ReadPointer!=0)
   {
        RecPointer=ReadPointer=0;
        return MODEM_CMDERROR; 
   } 
   
   return ModemState;       
}

/****************************************************************************
* 名称:UART1_Exception()
* 功能:UART1中断服务程序。
* 入口参数:无
* 出口参数:无
* 说明:
****************************************************************************/
void __irq  UART1_Exception(void)
{
    uint8 IIR, temp;
    
    IIR=U1IIR;
    //while(( IIR& 0x01) == 0)
    //{                                                   // 有中断未处理完
        switch (IIR & 0x0e)
        {
            case 0x00:                                  // Modem状态变化中断
                temp=U1MSR;
                if ((temp & 0x80) != 0)                 //数据载波检测
                {
                    ModemState = MODEM_CONNECT;
                }
                else
                {
                    ModemState = MODEM_CLOSE;
                }
                
                if ((temp & 0x40) != 0)                 //响铃 
                {
                    ModemState = MODEM_RING;
                }
                
                if ((temp & 0x30) != 0x30)              //数据设备就绪、清除发送
                {
                    ModemState = NOT_FIND_MODEM;
                }
                break;
                
            case 0x04:                                  // 接收数据可用
                //U1IER &= (~0x01);                     // 禁止接收及字符超时中断
                //if(Config_Finish)
                //{
                    RecBuff[RecPointer]=U1RBR;
                    RecPointer++;
                //}
                //else
                //{
                    //U1IER &= (~0x01);                       // 禁止接收及字符超时中断
                //}    
                break;
                    
            case 0x06:                                  // 接收线状态
                temp = U1LSR;
                break;
                
            case 0x0c:                                  // 字符超时指示
                U1IER &= (~0x01);                       // 禁止接收及字符超时中断
                break;
            case 0x02:                                  //发送中断
                //后续
                
                break;    
            default:
                break;
        }
    //} 
    
    VICVectAddr = 0;      		// 通知中断控制器中断结束
}

⌨️ 快捷键说明

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