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

📄 wavecom.c

📁 q24Wavecom的C程序代码
💻 C
📖 第 1 页 / 共 4 页
字号:
			}
			
			// 发送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 + -