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

📄 wavecom.c

📁 q24Wavecom的C程序代码
💻 C
📖 第 1 页 / 共 4 页
字号:

//***************************************************************
//	VoxsonCom.c
//
//	By: SG			Date: 2003/03/18
//***************************************************************
#include "805xALL.h"				// 定义51系列常用定义

//----------------------------------------------------------------
//	引用的外部函数
//----------------------------------------------------------------
extern void StationRun(BYTE,BYTE);
extern BYTE SeekCharInString(BYTE,BYTE idata *);	// Pxsb.c 在字符串中查找某个字符
extern void FillTempBuf(void);						// Pxsb.c TempBuf中填入0xFF
extern BYTE CmpString(BYTE code *,BYTE idata *);	// Pxsb.c 比较两个字符串是否相等

extern BYTE DecToHexByte(BYTE);						// Pxsb.c 单字节dec变换成单字节hex
extern void Delay20ms(BYTE);						// Pxsb.c 延时20*DelayCnt毫秒
extern void RefreshDispTime(void);					// RealTime.c 重新全部刷新Idle下时钟
extern BOOL EepromWrite(BYTE Len,BYTE data *DATAAddr,WORD EepromAddr);  	//Eeprom.c 把内部RAM块写到EEPROM
extern BOOL EepromRead(BYTE Len,BYTE data *DATAAddr,WORD EepromAddr); 		//Eeprom.c 把EEPROM块读到内部RAM
extern WORD LoadEEpromAddr(BYTE);					// EEprom.c 从EEprom地址表读取参数存放地址
extern BOOL EepromReadX(BYTE Len,BYTE pdata *XDATAAddr,WORD EepromAddr); 	//EepromB.c 把EEPROM块读到外部RAM
extern WORD LoadATCmdParaEEpAddr(BYTE ATcmdParaNo);		// EEpTab.c 取AT命令的参数在EEp中的地址,占用EEp的cnRevAreaAddr1
extern BYTE LoadATCmdParaEEpNo(void);					// EEpTab.c 查找AT命令参数在EEp中的空地址的序号,1~8有效,0无效
extern void ReleaseATCmdParaEEpNo(BYTE ATCmdParaNo);	// EEpTab.c 释放AT命令参数存储区

extern void ResetATcmdRx(void);			//清除收到的缓冲

//extern void RvCallID(BYTE idata *);					// VoxsonCom.c 接收到来电号码的出来(显示,存储到EEprom中)

//----------------------------------------------------------------
//	引用的全局变量
//----------------------------------------------------------------
extern BYTE idata KeyBuffer[cnKeyBufferLen];// 临时数据缓冲区(如平时按键的键值保留区等)
extern BYTE data KeyBufWritePtr;			// 数据缓冲区写指针
extern BYTE data KeyBufReadPtr;				// 数据缓冲区读指针

extern BYTE idata TempBuf[];
extern struct RealTimeFormat{
	BYTE Year;		//年
	BYTE Month;		//月
	BYTE Day;		//日
	BYTE Hour;		//小时
	BYTE Minute;	//分钟
	BYTE Second;	//秒
	BYTE Week;		//星期
}idata RealTime;	

BOOL bWaitOKAck;		// 某些AT命令的应答分为两部分:参数和OK ==> 需要等到收到OK应答,才能弃除该AT命令
BOOL bATcmdNeedResend;	// 必须重新发送AT命令
BOOL bATcmdAckType;		// =1 模块主动输出的参数,如:RING,+CLIP:(振铃,来电号码);

//----------------------------------------------------------------
//	外部可引用的函数
//----------------------------------------------------------------
void VocSonReset(void);						// VoxsonApp.c Voxson模块复位
void VoxsonInit(void);						// VoxsonApp.c VoxsonInit初始化程序
void ModelInitNext(void);					// VoxsonApp.c 继续模块初始化

void SBUFTx(BYTE);							// VoxsonCom.c 从串口发送单字节数据
BYTE JudgeJinXing(BYTE);					// VoxsonCom.c 转换待发送的十六进制数为ASCII字符
void HdlATAckTask(BYTE,BYTE);				// VoxsonCom.c AT命令分析散装函数
void SendATcmd(BYTE,BYTE);					// VoxsonCom.c 发送AT命令
void AnalyseATcmdTask(void);				// VoxsonCom.c AT命令分析函数
void SendATcmdReset(void);					// VoxsonCom.c AT命令发送任务的参数初始化
void SendATcmdTask(void);					// VoxsonCom.c AT命令发送任务
void WaitATcmdAck1sTask(void);				// VoxsonCom.c 等待AT命令应答任务
void PostATcmd(BYTE,BYTE);					// VoxsonCom.c 建立AT命令发送任务

void DelCurAtcmd(void);						// WaveCom.c 删除当前AT-Cmd

extern struct PhoneStateFormat{
	BYTE bCallOut:1;			// =1 去电; =0 来电
	BYTE bIsTalking:1;			// =1 为通话状态; =0 为非通话状态
	BYTE bHookState:1;			// 手柄摘挂机标志 --> =1 手柄摘机; =0 手柄挂机
	BYTE bHandFree:1;			// 免提摘挂机标志 --> =1 免提摘机; =0 免提挂机
	BYTE bPhoneState:1;			// 话机摘挂机状态(包括免提和手柄) --> =1 摘机; =0 挂机
	BYTE bIsDialing:1;			// =1 正在拨号;
}PhoneFlag;

extern BOOL bComTxD1On;			//=1  串口正在发送数据
//---------------------------------------------------------------
//	定义变量
//---------------------------------------------------------------
/*
typedef struct {
	BYTE ATcmdNo;
	BYTE ATcmdParaPtr;
}ATcmdArrayDef;
*/
ATcmdArrayDef data ATcmdTxArray[cnATcmdTxArrayLen];	// AT命令发送队列

BYTE data ATcmdTxPara;						// 发送AT命令参数 --> 高4 bit该命令发送的次数;低4 bit发送后没有得到应答的时间

BYTE idata ATcmdRxBuf0[cnATcmdRxBufLen];	// AT命令接收缓存0
BYTE idata ATcmdRxBuf1[cnATcmdRxBufLen];	// AT命令接收缓存1
BYTE pdata SMSBuf[cnSMSRecordLen];			// 短信接收缓存
//---------------------------------------------------------------
BYTE code CMGI[] = {"AT+CGMI\r"};							// 读取厂家ID
BYTE code ATA[] = {"ATA\r"};								// 接听电话
BYTE code ATH[] = {"ATH\r"};								// 挂断电话
BYTE code ATD[] = {"ATD"};									// 拨号命令
BYTE code VTS[] = {"AT+VTS="};								// 发DTMF命令
BYTE code IPR[] = {"AT+IPR=9600\r"};						// 设置波特率
BYTE code CSQ[] = {"AT+CSQ\r"};								// 查询信号强度
BYTE code CLIP[] = {"AT+CLIP=1\r"};							// 允许来电输出
BYTE code CCLK[] = {"AT+CCLK?\r"};							// 读取模块的时间
BYTE code SendCCLK[] = {"AT+CCLK=\"\n\"\r"};				// 调整模块的时间
BYTE code ATM[] = {"AT+SPEAKER=1\r"};						// 挂机时打开SPEAKER通道
BYTE code AUDIO[] = {"AT+VGT=0\r"};							// 选择主音频通道
BYTE code CCID[] = {"AT+CCID\r"};							// 读取SIM卡ID号
BYTE code TestAT[] = {"AT&T0\r"};								// 测试模块软件

BYTE code SPSPKR0[] = {"AT+SPEAKER=1;+VGR=0;+VGT=0;+SIDET=0,0\r"};		// 手柄音量4
BYTE code SPSPKR1[] = {"AT+SPEAKER=1;+VGR=40;+VGT=0;+SIDET=0,0\r"};		// 手柄音量3
BYTE code SPSPKR2[] = {"AT+SPEAKER=1;+VGR=70;+VGT=0;+SIDET=0,0\r"};		// 手柄音量2
BYTE code SPSPKR3[] = {"AT+SPEAKER=1;+VGR=90;+VGT=0;+SIDET=0,0\r"};		// 手柄音量1
BYTE code HFSPKR0[] = {"AT+SPEAKER=1;+VGR=30;+VGT=0;+SIDET=0,0\r"};		// 免提音量4
BYTE code HFSPKR1[] = {"AT+SPEAKER=1;+VGR=90;+VGT=0;+SIDET=0,0\r"};		// 免提音量3
BYTE code HFSPKR2[] = {"AT+SPEAKER=1;+VGR=120;+VGT=0;+SIDET=0,0\r"};	// 免提音量2
BYTE code HFSPKR3[] = {"AT+SPEAKER=1;+VGR=150;+VGT=0;+SIDET=0,0\r"};	// 免提音量1
BYTE code MIC[] = {"AT+VGT=0\r"};							// MIC参数
BYTE code SID[] = {"AT+SID=0,0\r"};							// 侧音参数
BYTE code ECHO[] = {"AT+ECHO=1,3,30,8000,256\r"};			// 回响参数
BYTE code CMGF[] = {"AT+CMGF=0\r"};							// 选择PDU格式
BYTE code CSMS[] = {"AT+CSMS=1\r"};							// 符合Phase II标准
BYTE code CNMI[] = {"AT+CNMI=1,1;+CMGF=0\r"};						// 新短消息输出位置信息
BYTE code CREG[] = {"AT+CREG=1\r"};							// 输出网络注册信息
BYTE code CMGR[] = {"AT+CMGR=\n\r"};						// 读取短消息
BYTE code CMGD[] = {"AT+CMGD=\n\r"};						// 删除短消息
BYTE code CMGS[] = {"AT+CMGS=\n\r"};						// 发送短消息
BYTE code CSCA[] = {"AT+CSCA?\r"};							// 读取短信中心号码
BYTE code CMGL[] = {"AT+CMGL=4\r"};							// 罗列所有短消息
BYTE code ATE[] = {"ATE1\r"};								// 禁止AT命令数据回送

BYTE code NeedPIN[] = {"AT+CPIN?\r"};						// 查询SIM卡PIN码状态
BYTE code PINClck[] = {"AT+CLCK=\"SC\",1,1234\r"};			// 设置SIM卡锁PIN码
BYTE code InputPIN[] = {"AT+CPIN=\n\r"};					// 输入SIM卡PIN码
BYTE code ChangePIN[] = {"AT+CPWD=\"SC\",1234,\n\r"};		// 更改SIM卡PIN码
BYTE code PINUnClck[] = {"AT+CLCK=\"SC\",0,1234\r"};		// SIM卡PIN码解锁
BYTE code CHGBackPIN[] = {"AT+CPWD=\"SC\",\n,1234\r"};		// 该SIM卡PIN码为默认的‘1234’

BYTE code SaveCfg[] = {"AT&W\r"};							// 存储用户设置参数
BYTE code PowerOff[] = {"AT+CPOF\r"};						// 关机
BYTE code CheckBatt[] = {"AT+WBCM=2\r"};					// 检查电池电压

BYTE code SetCallWaitting[] = {"AT+CCWA=1,1,1\r"};			// 呼叫等待设置
BYTE code CancelCallWaittng[] = {"AT+CCWA=1,0,7\r"};		// 取消呼叫等待设置
BYTE code Answer2ndCall[] = {"AT+CHLD=1\r"};				// 接听呼叫等待的第二个电话
BYTE code Cancel2ndCall[] = {"AT+CHLD=0\r"};				// 挂断呼叫等待的第二个电话
BYTE code SetCallForward0[] = {"AT+CCFC=0,3,\"\n\"\r"};		// 呼叫转移设置
BYTE code SetCallForward1[] = {"AT+CCFC=1,3,\"\n\"\r"};		// 呼叫转移设置
BYTE code SetCallForward2[] = {"AT+CCFC=2,3,\"\n\"\r"};		// 呼叫转移设置
BYTE code SetCallForward3[] = {"AT+CCFC=3,3,\"\n\"\r"};		// 呼叫转移设置
BYTE code CancelCallForward[] = {"AT+CCFC=4,4\r"};			// 取消呼叫转移设置

BYTE code CCEDMain[] = {"AT+CCED=0,1\r"};						// 查询主基站号
BYTE code CCEDSub[] = {"AT+CCED=0,2\r"};						// 查询从属基站号


WORD code ATCmd_TX_Tab[] = 
{
	&CMGI,
	&ATA,
	&ATH,
	&ATD,
	&VTS,
	&IPR,
	&CSQ,
	&CLIP,
	&CCLK,
	&ATM,
	&AUDIO,
	&CCID,
	&TestAT,
	&SPSPKR0,
	&SPSPKR1,
	&SPSPKR2,
	&SPSPKR3,
	&HFSPKR0,
	&HFSPKR1,
	&HFSPKR2,
	&HFSPKR3,
	&MIC,
	&SID,
	&ECHO,
	&CMGF,
	&CSMS,
	&CNMI,
	&CREG,
	&CMGR,
	&CMGD,
	&CMGS,
	&CSCA,
	&CMGL,
	&ATE,
	&NeedPIN,
	&PINClck,
	&InputPIN,
	&ChangePIN,
	&PINUnClck,
	&CHGBackPIN,
	&SaveCfg,
	&PowerOff,
	&CheckBatt,
	&SetCallWaitting,
	&CancelCallWaittng,
	&Answer2ndCall,
	&Cancel2ndCall,
	&SetCallForward0,
	&SetCallForward1,
	&SetCallForward2,
	&SetCallForward3,
	&CancelCallForward,
	&SendCCLK,
	&CCEDMain,
	&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[] = 
{
	&ATAck_OK,
	&ATAck_RING,
	&ATAck_CLIP,
	&ATAck_CCLK,
	&ATAck_NOCarrier,
	&ATAck_Error,
	&ATAck_CSQ,
	&ATAck_SCKS,
	&ATAck_BUSY,
	&ATAck_NODIALTONE,
	&ATAck_CPIN,
	&ATAck_NOANSWER,
	&ATAck_CCWA,
	&ATAck_CREG,
	&ATAck_CMTI,
	&ATAck_CMGR,
	&ATAck_CMGS,
	&ATAck_CMGL,
	&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;

⌨️ 快捷键说明

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