📄 gsm.c
字号:
&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 + -