📄 wavecom.c
字号:
}
// 发送AT拨号命令或DTMF命令的参数
if(ATcmdNo == cnATcmd_VTS) //Dtmf格式为“2”,拨号为05921861;
SBUFTx('"');
while (KeyBufReadPtr < KeyBufWritePtr)
{
SendATcmdData=KeyBuffer[KeyBufReadPtr / 2];
if (KeyBufReadPtr & 0x01)
SendATcmdData = SendATcmdData >> 4;
SendATcmdData = SendATcmdData & 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 & 0x80) return; // 正在发送该AT命令,还没有得到应答,退出
else
{
SendATcmd(ATcmdTxArray[0].ATcmdNo,ATcmdTxArray[0].ATcmdParaPtr);
ATcmdTxPara = (ATcmdTxPara + 0x10) & 0xF0; // 发送次数累计,发送定时器清'0'
}
}
//***************************************************************
// void WaitATcmdAck1sTask(void)
//
// Note: 等待AT命令应答任务
//***************************************************************
void WaitATcmdAck1sTask(void)
{
BYTE ATcmdNo;
if(ATcmdTxArray[0].ATcmdNo == 0xFF) return;
if(ATcmdTxArray[0].ATcmdNo & 0x80)
{
if((ATcmdTxPara & 0x0F) < 14) // AT命令应答严重超时后不再累计时间
{
++ATcmdTxPara; // AT命令应答超时时间累计
}
else
{
ATcmdNo = ATcmdTxArray[0].ATcmdNo & 0x7f;
if((ATcmdNo == cnATcmd_ATD) || (ATcmdNo == cnATcmd_VTS)) // 是否是拨号命令或发送DTMF命令
{
ATcmdTxPara += 0x10;
if ((ATcmdTxPara & 0xf0) > 0x90)
StationRun(MsgModelError,false); //如果拨号2分钟无响应,认为模块出错
else
ATcmdTxPara &= 0xf0;
}
else
{
if ((ATcmdTxPara & 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 = &ATcmdRxBuf0[0]; // 接收缓存0的数据是否有效
else
{
if(ATcmdRxBuf1[0] != 0xFF)
AnalyseIdataPtr = &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)) // 比较数据串
{
HdlATAckTask(i,AnalyseIdataPtrTemp); // 数据串相等,则处理该项应答
break;
}
else
{
AnalyseIdataPtr = AnalyseIdataPtrTemp;
}
}
AnalyseIdataPtr = AnalyseIdataPtrTemp; // 置接收缓存x无效
*AnalyseIdataPtr = 0xFF;
if(!bWaitOKAck) // 判断是否需要等待'OK'应答
{
if(bATcmdAckType)
{
bATcmdAckType = false; // 模块主动输出的参数
}
else
{
if(bATcmdNeedResend) // 判断是否需要重发该AT命令
{
bATcmdNeedResend = false;
ATcmdTxArray[0].ATcmdNo &= 0x7F; // 解析AT命令后,得重发该AT命令
// ATcmdTxPara = 0x00;
}
else
{
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 HdlATAckTask(BYTE ATcmdAckNo)
//
// Note:
//***************************************************************
void HdlATAckTask(BYTE ATcmdAckNo,BYTE ATcmdAckBufNo)
{
BYTE i;
BYTE ATcmdAckData;
BYTE data *ATcmdAckDataPtr;
BYTE code *ATcmdAckCodePtr;
BYTE idata *ATcmdAckIdataPtr;
BYTE idata *ATcmdAckIdataPtrTemp;
ATcmdAckIdataPtr = ATcmdAckBufNo;
switch(ATcmdAckNo)
{
case cnRxATcmd_ATAck_OK: // 'OK'应答
{
switch(ATcmdTxArray[0].ATcmdNo & 0x7F)
{
case cnATcmd_CMGI: // 查询厂家代码'OK'应答
{
break;
}
//============================================
case cnATcmd_ATA: // 接听电话'OK'应答
{
StationRun(MsgATACall,true);
break;
}
//============================================
case cnATcmd_ATH: // 挂断电话'OK'应答
{
StationRun(MsgATHCall,true);
break;
}
//============================================
case cnATcmd_ATD: // 拨号'OK'应答
{
StationRun(MsgDialACall,true);
break;
}
//============================================
case cnATcmd_VTS: // 发DTMF'OK'应答
{
StationRun(MsgDTMF,true);
break;
}
//============================================
case cnATcmd_IPR: // 设置波特率'OK'应答
{
break;
}
//============================================
case cnATcmd_CSQ: // 查询信号强度'OK'应答
{
StationRun(MsgModelOk,TRUE);
break;
}
//============================================
case cnATcmd_CLIP: // 设置来电输出'OK'应答
{
StationRun(MsgModelOk,true);
break;
}
//============================================
case cnATcmd_CCLK: // 查询实时时钟'OK'应答
{
StationRun(MsgModelOk,TRUE);
break;
}
//============================================
case cnATcmd_ATM:
case cnATcmd_AUDIO:
{
StationRun(MsgModelOk,true);
break;
}
//============================================
case cnATcmd_CCID: // 查询SIM卡ID的'OK'应答
{
// StationRun(MsgModelOk,TRUE);
break;
}
//============================================
case cnATcmd_TestAT: // 测试模块'OK'应答
{
StationRun(MsgModelOk,true);
break;
}
//============================================
case cnATcmd_SPSPKR0:
case cnATcmd_SPSPKR1:
case cnATcmd_SPSPKR2:
case cnATcmd_SPSPKR3:
case cnATcmd_HFSPKR0:
case cnATcmd_HFSPKR1:
case cnATcmd_HFSPKR2:
case cnATcmd_HFSPKR3: // 设置通话音量等级'OK'应答
{
break;
}
//============================================
case cnATcmd_MIC: // 设置MIC参数'OK'应答
{
break;
}
//============================================
case cnATcmd_SID: // 设置侧音参数'OK'应答
{
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -