?? 200545155548.c
字號:
//***************************************************************
// 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 + -