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

📄 gsm.c

📁 GPS驱动集合
💻 C
📖 第 1 页 / 共 4 页
字号:
    &amt;CCEDSub 
}
; 


//--------------------------------------------------------------- 
BYTE code ATAck_OK[] = 
{
    "OK"
}
; // 正应答 
BYTE code ATAck_RING[] = 
{
    "RING"
}
; // 来电输出标志 
BYTE code ATAck_CLIP[] = 
{
    "+CLIP:"
}
; // 来电号码输出标志 
BYTE code ATAck_CCLK[] = 
{
    "+CCLK:"
}
; // 模块时钟输出标志 
BYTE code ATAck_NOCarrier[] = 
{
    "NO CARRIER"
}
; // 网络挂断 
BYTE code ATAck_Error[] = 
{
    "ERROR"
}
; // 负应答 
BYTE code ATAck_CSQ[] = 
{
    "+CSQ:"
}
; // 信号强度输出 
BYTE code ATAck_SCKS[] = 
{
    "+CCID"
}
; // SIM卡ID号输出 
BYTE code ATAck_BUSY[] = 
{
    "BUSY"
}
; // 网络忙 
BYTE code ATAck_NODIALTONE[] = 
{
    "NO DIALTONE"
}
; // 网络无拨号音 
BYTE code ATAck_CPIN[] = 
{
    "+CPIN:"
}
; // SIM卡PIN码状态输出 
BYTE code ATAck_NOANSWER[] = 
{
    "NO ANSWER"
}
; // 网络无应答 
BYTE code ATAck_CCWA[] = 
{
    "+CCWA:"
}
; // 呼叫等待 
BYTE code ATAck_CREG[] = 
{
    "+CREG:"
}
; // SIM注册状态输出 
BYTE code ATAck_CMTI[] = 
{
    "+CMTI:"
}
; // 新短消息的位置信息 
BYTE code ATAck_CMGR[] = 
{
    "+CMGR:"
}
; // 读取短消息输出 
BYTE code ATAck_CMGS[] = 
{
    "+CMGS:"
}
; // 发送短消息输出 
BYTE code ATAck_CMGL[] = 
{
    "+CMGL:"
}
; // 罗列短消息输出 
BYTE code ATAck_WBCI[] = 
{
    "+WBCI:"
}
; // 电池电压输出 

WORD code ATCmd_RX_Tab[] = 
{ 
    &amt;ATAck_OK, 
    &amt;ATAck_RING, 
    &amt;ATAck_CLIP, 
    &amt;ATAck_CCLK, 
    &amt;ATAck_NOCarrier, 
    &amt;ATAck_Error, 
    &amt;ATAck_CSQ, 
    &amt;ATAck_SCKS, 
    &amt;ATAck_BUSY, 
    &amt;ATAck_NODIALTONE, 
    &amt;ATAck_CPIN, 
    &amt;ATAck_NOANSWER, 
    &amt;ATAck_CCWA, 
    &amt;ATAck_CREG, 
    &amt;ATAck_CMTI, 
    &amt;ATAck_CMGR, 
    &amt;ATAck_CMGS, 
    &amt;ATAck_CMGL, 
    &amt;ATAck_WBCI, 
    0xFFFF 
}
; 

//--------------------------------------------------------------- 
BYTE code PIN_READY[] = 
{
    "+CPIN: READY"
}
; 
BYTE code PIN_SIMPIN[] = 
{
    "+CPIN: SIM PIN"
}
; 
/* 
//*************************************************************** 
// void VoxsonInit(void) 
// 
// Note: Voxson模块初始化 
//*************************************************************** 
void VoxsonInit(void) 
{ 
    boWaveComRst = true; 
    Delay20ms(20); 
    boWaveComRst = false; 
    
    PostATcmd(cnATcmd_TestAT,NULL); // 测试Model软件 
    // PostATcmd(cnATcmd_ATE,NULL); // 禁止AT命令回传 
    // PostATcmd(cnATcmd_CCLK,NULL); // 读取实时时钟 
    // PostATcmd(cnATcmd_CCID,NULL); // 读取SIM卡ID 
    // PostATcmd(cnATcmd_NeedPIN,NULL); // 查询SIM卡PIN码状态 
} 

// 继续模块初始化 
void ModelInitNext(void) 
{ 
    // PostATcmd(cnATcmd_Audio,NULL); // 选择语音通道 
    PostATcmd(cnATcmd_CLIP,NULL); // 允许来电输出 
    PostATcmd(cnATcmd_CSQ,NULL); // 查询信号强度 
} 
*/ 
//*************************************************************** 
// void VoxsonInit(void) 
// 
// Note: Voxson模块复位 
//*************************************************************** 
void VocSonReset(void) 
{ 
    boWaveComRst = true; 
    Delay20ms(20); 
    boWaveComRst = false; 
    SendATcmdReset(); 
} 

//*************************************************************** 
// void SendATcmd(BYTE ATcmdNo,BYTE ATcmdDataPtr) 
// 
// IN: ATcmdNo --> AT命令号 
// ATcmdDataPtr --> 带参的AT命令参数在EEp中地址 
//*************************************************************** 
void SendATcmd(BYTE ATcmdNo,BYTE ATcmdDataPtr) 
{ 
    BYTE SendATcmdData; 
    BYTE code *ATcmdPtr; 
    BYTE pdata ATCmdPara[cnATCmdParaEEpAddrLen]; 
    ATcmdPtr = ATCmd_TX_Tab[ATcmdNo]; 
    
    ES = false; // 发送时,关闭串口接收中断 
    //--------- 
    ResetATcmdRx(); // 清除收到的缓冲 
    //--------- 
    if(ATcmdNo < cnATcmd_EndCMD) // 是否定义过的AT命令 
    { 
        if(!((ATcmdNo == cnATcmd_ATD) || (ATcmdNo == cnATcmd_VTS))) // 是否是拨号命令或发送DTMF命令 
        { 
            SendATcmdData = *ATcmdPtr; 
            while(SendATcmdData != cnATcmdEndFlag) // 是否是AT命令结束符 
            { 
                if(SendATcmdData == cnNeedPara) // 是否需要参数 
                { 
                    EepromReadX(cnATCmdParaEEpAddrLen,ATCmdPara,LoadATCmdParaEEpAddr(ATcmdDataPtr));// 取AT命令的参数 
                    
                    SendATcmdData = 0x00; 
                    while(ATCmdPara[SendATcmdData] != 0xFF) // 如果需要参数,参数是否发送完毕 
                    { 
                        SBUFTx(ATCmdPara[SendATcmdData]); // 发送参数 
                        ++SendATcmdData; // 参数地址++ 
                    } 
                    ReleaseATCmdParaEEpNo(ATcmdDataPtr); // 释放AT命令参数存储区 
                    ++ATcmdPtr; // AT命令字指针++ 
                } 
                else 
                { 
                    SBUFTx(SendATcmdData); // 发送AT命令字 
                    ++ATcmdPtr; // AT命令字指针++ 
                } 
                SendATcmdData = *ATcmdPtr; 
            } 
        } 
        else 
        { 
            // 发送AT拨号命令或DTMF命令的命令体 
            if (KeyBufReadPtr >= KeyBufWritePtr) 
            DelCurAtcmd(); // 无效的AT命令,移位发送队列 
            
            while(*ATcmdPtr != cnATcmdEndFlag) 
            { 
                SBUFTx(*ATcmdPtr); 
                ++ATcmdPtr; 
            } 
            
            // 发送AT拨号命令或DTMF命令的参数 
            if(ATcmdNo == cnATcmd_VTS) //Dtmf格式为“2”,拨号为05921861; 
            SBUFTx('"'); 
            while (KeyBufReadPtr < KeyBufWritePtr) 
            { 
                SendATcmdData=KeyBuffer[KeyBufReadPtr / 2]; 
                if (KeyBufReadPtr &amt; 0x01) 
                SendATcmdData = SendATcmdData >> 4; 
                SendATcmdData = SendATcmdData &amt; 0x0F; 
                SBUFTx(JudgeJinXing(SendATcmdData)); 
                ++KeyBufReadPtr; 
            } 
            if(ATcmdNo == cnATcmd_VTS) 
            SBUFTx('"'); 
            else 
            SBUFTx(';'); 
            SBUFTx(cnTxATcmdEndFlag); 
        } 
        ATcmdTxArray[0].ATcmdNo |= 0x80; 
    } 
    ES = true; // 发送接收时,打开串口接收中断 
} 


//*************************************************************** 
// void SBUFTx(BYTE SBUFData) 
// 
// IN: SBUFData --> 需要从串口发送的单字节数据 
//*************************************************************** 
void SBUFTx(BYTE SBUFData) // 从串口发送数据 
{ 
    SBUF = SBUFData; 
    while(!TI); 
    TI = false; 
} 


//*************************************************************** 
// BYTE JudgeJinXing(BYTE DialData) 
// 
// IN: DialData --> 需要转换待发送的十六进制数为ASCII字符 
//*************************************************************** 
BYTE JudgeJinXing(BYTE DialData) // 转换待发送的十六进制数为ASCII字符 
{ 
    if(DialData == cnKeyJin) return ('#'); 
    else if(DialData == cnKeyXing) return ('*'); 
    else return(DialData + '0'); 
} 


//*************************************************************** 
// void SendATcmdReset(void) 
// 
// Note: AT命令发送任务的参数初始化 
//*************************************************************** 
void SendATcmdReset(void) 
{ 
    BYTE i; 
    
    for(i = 0; i < cnATcmdTxArrayLen; i++) 
    { 
        ATcmdTxArray[i].ATcmdNo = 0xFF; // AT命令发送队列初始化 
        ATcmdTxArray[i].ATcmdParaPtr = 0xFF; // AT命令发送队列初始化 
    } 
    ATcmdTxPara = 0x00; // 定时计数器复位 
    //---------- 
    ResetATcmdRx(); // 清除收到的缓冲 
    for (i=1; i<9; i++) 
    ReleaseATCmdParaEEpNo(i); 
    
} 


//*************************************************************** 
// void SendATcmdTask(void) 
// 
// Note: AT命令发送任务 
//*************************************************************** 
void SendATcmdTask(void) 
{ 
    if (bComTxD1On) return; //串口正在发送数据 
    if(ATcmdTxArray[0].ATcmdNo == 0xFF) return; // AT命令发送队列为空,退出 
    if(ATcmdTxArray[0].ATcmdNo &amt; 0x80) return; // 正在发送该AT命令,还没有得到应答,退出 
    else 
    { 
        SendATcmd(ATcmdTxArray[0].ATcmdNo,ATcmdTxArray[0].ATcmdParaPtr); 
        ATcmdTxPara = (ATcmdTxPara + 0x10) &amt; 0xF0; // 发送次数累计,发送定时器清'0' 
    } 
} 


//*************************************************************** 
// void WaitATcmdAck1sTask(void) 
// 
// Note: 等待AT命令应答任务 
//*************************************************************** 
void WaitATcmdAck1sTask(void) 
{ 
    BYTE ATcmdNo; 
    if(ATcmdTxArray[0].ATcmdNo == 0xFF) return; 
    if(ATcmdTxArray[0].ATcmdNo &amt; 0x80) 
    { 
        if((ATcmdTxPara &amt; 0x0F) < 14) // AT命令应答严重超时后不再累计时间 
        { 
            ++ATcmdTxPara; // AT命令应答超时时间累计 
        } 
        else 
        { 
            ATcmdNo = ATcmdTxArray[0].ATcmdNo &amt; 0x7f; 
            if((ATcmdNo == cnATcmd_ATD) || (ATcmdNo == cnATcmd_VTS)) // 是否是拨号命令或发送DTMF命令 
            { 
                ATcmdTxPara += 0x10; 
                if ((ATcmdTxPara &amt; 0xf0) > 0x90) 
                StationRun(MsgModelError,false); //如果拨号2分钟无响应,认为模块出错 
                else 
                ATcmdTxPara &amt;= 0xf0; 
            } 
            else 
            { 
                if ((ATcmdTxPara &amt; 0xf0) > 0x40) 
                StationRun(MsgModelError,false); //重发了3次,认为系统出错,需要复位WAVCOM 
                else 
                ATcmdTxArray[0].ATcmdNo = ATcmdNo; // 严重超时后,重发该命令 ------> 测试用2003/04/18 
                // ATcmdTxPara = 0x00; 
            } 
        } 
    } 
    
} 
//-------------------------------------------------------------- 
// void DelCurAtcmd(void) 
// Func: 删除当前AT-Cmd 
//-------------------------------------------------------------- 
void DelCurAtcmd(void) 
{ 
    BYTE i; 
    for(i = 0; i < cnATcmdTxArrayLen; i++) // AT命令得到应答后,移位发送队列 
    { 
        ATcmdTxArray[i].ATcmdNo = ATcmdTxArray[i+1].ATcmdNo; 
        ATcmdTxArray[i].ATcmdParaPtr = ATcmdTxArray[i+1].ATcmdParaPtr; 
    } 
    ATcmdTxArray[cnATcmdTxArrayLen-1].ATcmdNo = 0xFF; 
    ATcmdTxArray[cnATcmdTxArrayLen-1].ATcmdParaPtr = 0xFF; 
} 

//*************************************************************** 
// void PostATcmd(BYTE ATcmdNo,BYTE ATcmdParaPtr) 
// 
// Note: 建立AT命令发送任务 
//*************************************************************** 
void PostATcmd(BYTE ATcmdNo,BYTE ATcmdParaPtr) 
{ 
    BYTE i; 
    
    if(ATcmdNo == cnATcmd_ATH) // 挂机命令的优先级最高 
    { 
        for(i =0; i < cnATcmdTxArrayLen; i++) // 有挂机命令时,取消所以别的AT命令 
        { 
            ATcmdTxArray[i].ATcmdNo = 0xFF; 
            ATcmdTxArray[i].ATcmdParaPtr = 0xFF; 
        } 
        ATcmdTxArray[0].ATcmdNo = ATcmdNo; 
        ATcmdTxArray[0].ATcmdParaPtr = ATcmdParaPtr; 
    } 
    else 
    { 
        for(i =0; i < cnATcmdTxArrayLen; i++) 
        { 
            if(ATcmdTxArray[i].ATcmdNo == 0xFF) 
            { 
                ATcmdTxArray[i].ATcmdNo = ATcmdNo; 
                ATcmdTxArray[i].ATcmdParaPtr = ATcmdParaPtr; 
                break; 
            } 
        } 
    } 
} 


//*************************************************************** 
// void AnalyseATcmdTask(void) 
// 
// Note: 分析模块返回的参数(判断是否是已定义,未定义则弃除) 
//*************************************************************** 
void AnalyseATcmdTask(void) 
{ 
    BYTE i; 
    BYTE idata *AnalyseIdataPtr; 
    BYTE code *ATcmdRxCodePtr; 
    BYTE AnalyseIdataPtrTemp; 
    if(ATcmdRxBuf0[0]!= 0xFF) 
    AnalyseIdataPtr = &amt;ATcmdRxBuf0[0]; // 接收缓存0的数据是否有效 
    else 
    { 
        if(ATcmdRxBuf1[0] != 0xFF) 
        AnalyseIdataPtr = &amt;ATcmdRxBuf1[0]; // 接收缓存1的数据是否有效 
        else 
        return; // 缓存0和缓存1的数据都无效,则返回 
    } 
    
    AnalyseIdataPtrTemp = AnalyseIdataPtr; // 暂存有效缓存指针 
    bWaitOKAck = false; 
    for(i = 0; ATCmd_RX_Tab[i] != 0xFFFF; i++) // 接收数据字头表是否没有改串数据?没有则不处理 
    { 
        ATcmdRxCodePtr = ATCmd_RX_Tab[i]; 
        
        if(CmpString(ATcmdRxCodePtr,AnalyseIdataPtr)) // 比较数据串 

⌨️ 快捷键说明

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