?? gprs.cpp
字號:
// GPRS.cpp: implementation of the CGPRS class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "GPRS.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CGPRS::CGPRS()
{
ResetGlobalVarial();
}
CGPRS::~CGPRS()
{
if (pCeSerial->IsPortOpen() == TRUE)
{
pCeSerial->ClosePort();
}
if (pCeSerial)
delete pCeSerial;
}
/*******************************************************************************************
函數名稱: ResetGlobalVarial
描 述: 復位一些全局變量為默認值
輸入參數: 無
輸出參數: 無
返 回: 無
********************************************************************************************/
void CGPRS::ResetGlobalVarial(void)
{
bSendATCmd = FALSE; /* 當前不處于發送命令狀態 */
m_RespCnt = 0;
m_strRespBuf = _T("");
ResetEvent(m_ATCmdRespEvent); /* 復位 GPRS 響應事件*/
}
/*******************************************************************************************
函數名稱: GPRS_Init
描 述: GPRS 模塊初始化函數
輸入參數: LPCTSTR Port : 串口號, 如 "COM1:"
int BaudRate : 串口波特率, 如 115200
DWORD UserParam: 用戶傳遞到該類中的參數
輸出參數: 無
返 回: TRUE: 成功 FALSE: 失敗
********************************************************************************************/
BOOL CGPRS:: GPRS_Init(LPCTSTR Port, int BaudRate, DWORD UserParam)
{
BOOL ret;
DWORD Trycount = 2;
do{ /* 嘗試初始化 GPRS, 最多嘗試兩次 */
Trycount--;
pCeSerial = new CCeSerial;
ret = pCeSerial->OpenPort(Port, BaudRate, 8, ONESTOPBIT, NOPARITY, TRUE, TRUE, (DWORD)this);
if (ret == FALSE) /* 打開串口, 數據位為8,停止位為1,無校驗位 */
{
delete pCeSerial;
return FALSE;
}
pCeSerial->OnCommRecv = OnCommRecv; /* 串口接收成功回調函數 */
m_UserParam = UserParam; /* 保存用戶傳進來的參數 */
m_ATCmdRespEvent = CreateEvent(NULL, TRUE, FALSE, NULL); /* 創建 GPRS 響應事件 */
GPRS_SendATCmd(_T("AT")); /* 嘗試模塊是否處于激活狀態 */
GPRS_WaitResponseOK();
GPRS_SendATCmd(_T("AT")); /* 嘗試模塊是否處于激活狀態 */
GPRS_WaitResponseOK();
GPRS_SendATCmd(_T("AT$NOSLEEP=1")); /* 禁止模塊進入睡眠模式 */
ret = GPRS_WaitResponseOK();
if (ret == FALSE)
{
delete pCeSerial;
if (Trycount == 0) return FALSE;
}
else
Trycount = 0;
}while(Trycount > 0);
GPRS_SendATCmd(_T("AT+CREG=1"));
ret = GPRS_WaitResponseOK();
if (ret == FALSE)
return FALSE;
GPRS_SendATCmd(_T("AT+CLIP=1")); /* 設置來電顯示 */
ret = GPRS_WaitResponseOK();
if (ret == FALSE)
return FALSE;
GPRS_SendATCmd(_T("AT+CMGF=1")); /* 設置為文本模式 */
ret = GPRS_WaitResponseOK();
if (ret == FALSE)
return FALSE;
GPRS_SendATCmd(_T("AT+CSCS=\"GSM\"")); /* 設置字符集 */
ret = GPRS_WaitResponseOK();
if (ret == FALSE)
return FALSE;
//GPRS_SendATCmd(_T("AT+CSMP=17,168,0,0")); /* 設置文本模式參數 */
//ret = GPRS_WaitResponseOK();
//if (ret == FALSE)
// return FALSE;
return TRUE;
}
/*******************************************************************************************
函數名稱: OnCommRecv
描 述: 串口接收成功回調函數, 當串口正確接收到數據時, 該函數將被調用
輸入參數: CString strCmd: 命令字
輸出參數: DWORD UserParam : 用戶傳遞的參數, 通常為CGPRS類的一個對象的指針
BYTE *buf : 串口接收數據緩沖
DWORD buflen : 串口接收到的數據長度
返 回: 無
********************************************************************************************/
void CALLBACK CGPRS::OnCommRecv(DWORD UserParam, BYTE *buf, DWORD buflen)
{
CGPRS *pGPRS = (CGPRS *)UserParam;
CString strTmp = _T("");
LPTSTR pStr = strTmp.GetBuffer(buflen);
MultiByteToWideChar(CP_ACP, 0, (char *)buf, buflen, pStr, buflen); /* 將接收到的數據轉換為 Unicode 編碼 */
strTmp.ReleaseBuffer();
if (pGPRS->bSendATCmd == TRUE)
{ /* 之前用戶發送了 AT 指令 */
pGPRS->m_strRespBuf.Insert(pGPRS->m_RespCnt, strTmp); /* 保存數據 */
SetEvent(pGPRS->m_ATCmdRespEvent);
return;
}
if ((strTmp.Find(_T("RING")) >= 0) ||
(strTmp.Find(_T("ring")) >= 0))
{ /* 有電話打進來 */
CString strCallNum = pGPRS->GPRS_GetTheCallNum(strTmp);
pGPRS->OnGPRSRecv(pGPRS->m_UserParam, GPRS_STATUS_RECEIVE_CALL,strCallNum);
}
if ((strTmp.Find(_T("NO CARRIER")) >= 0) ||
(strTmp.Find(_T("no carrier")) >= 0))
{ /* 來電后, 對方掛機 */
pGPRS->OnGPRSRecv(pGPRS->m_UserParam, GPRS_STATUS_OTHER_SIDE_HANDUP, "");
}
pGPRS->bSendATCmd = FALSE; /* 復位相關全局變量 */
pGPRS->m_RespCnt = 0;
pGPRS->m_strRespBuf = _T("");
ResetEvent(pGPRS->m_ATCmdRespEvent);
}
/*******************************************************************************************
函數名稱: GPRS_GetTheCallNum
描 述: 取得來電的電話號碼
輸入參數: CString str: 來電時, GPRS 響應字符
輸出參數: 無
返 回: 來電電話號碼
********************************************************************************************/
CString CGPRS::GPRS_GetTheCallNum(CString str)
{
int pos1 = str.Find(_T("+CLIP: \""), 0);
if (pos1 < 0)
return "";
else
pos1 = pos1 + wcslen(_T("+CLIP: \""));
int pos2 = str.Find(_T("\""), pos1);
if (pos2 < 0)
return "";
CString strNum;
strNum = str.Mid(pos1, pos2 - pos1); /* 取得電話號碼 */
return strNum;
}
/*******************************************************************************************
函數名稱: GPRS_SendATCmd
描 述: 發送 AT 命令
輸入參數: CString strCmd: 命令字
輸出參數: 無
返 回: TRUE: 成功 FALSE: 失敗
********************************************************************************************/
BOOL CGPRS::GPRS_SendATCmd(CString strCmd)
{
int len = strCmd.GetLength();
BYTE *psendbuf = new BYTE[len + 2];
m_RespCnt = 0;
bSendATCmd = TRUE; /* 進入發送命令狀態 */
for(int i = 0; i < len;i++)
psendbuf[i] = (char)strCmd.GetAt(i); /* 轉換為單字節字符 */
psendbuf[len] = '\r'; /* 加入結束符 */
psendbuf[len + 1] = '\n';
pCeSerial->Senddata(psendbuf, len + 2); /* 從串口發送數據 */
delete[] psendbuf;
return TRUE;
}
/*******************************************************************************************
函數名稱: GPRS_WaitResponseOK
描 述: 等待 AT 命令響應 OK
輸入參數: 無
輸出參數: 無
返 回: 無
********************************************************************************************/
BOOL CGPRS::GPRS_WaitResponseOK(void)
{
DWORD ret;
BOOL bOK = TRUE;
while(1)
{ // 等待 0.5 秒, 如果得不到回復, 即為錯誤
ret = WaitForSingleObject(m_ATCmdRespEvent, 500);
if (ret == WAIT_OBJECT_0)
{
if ((m_strRespBuf.Find(_T("ERROR\r\n"), 0) >= 0) ||
(m_strRespBuf.Find(_T("error\r\n"), 0) >= 0))
{ /* 響應中有"ERROR" */
bOK = FALSE;
break;
}
if ((m_strRespBuf.Find(_T("OK\r\n"), 0) >= 0) ||
(m_strRespBuf.Find(_T("ok\r\n"), 0) >= 0))
{ /* 響應中有"OK" */
bOK = TRUE;
break;
}
ResetEvent(m_ATCmdRespEvent);
}
else
{
bOK = FALSE; /* 響應超時 */
break;
}
}
ResetGlobalVarial(); /* 復位用到的全局變量 */
if (FALSE == bOK)
return FALSE;
return TRUE;
}
/*******************************************************************************************
函數名稱: GPRS_WriteMsg
描 述: 將短信內容寫入 GPRS 模塊
輸入參數: CString Msg: 短信內容
輸出參數: 無
返 回: 無
********************************************************************************************/
BOOL CGPRS::GPRS_WriteMsg(CString Msg)
{
int len = Msg.GetLength();
BYTE *psendbuf = new BYTE[len + 3];
for(int i = 0; i < len;i++)
psendbuf[i] = (char)Msg.GetAt(i); /* 轉換為單字節字符 */
psendbuf[len] = '\r'; /* 加入結束符 */
psendbuf[len + 1] = '\n';
psendbuf[len + 2] = 0x1A;
pCeSerial->Senddata(psendbuf, len + 3); /* 從串口發送數據 */
delete[] psendbuf;
return TRUE;
}
/*******************************************************************************************
函數名稱: GPRS_DialUp
描 述: 撥打電話(由本機打出)
輸入參數: CString strTelNum: 電話號碼
輸出參數: 無
返 回: TRUE: 成功 FALSE: 失敗
********************************************************************************************/
BOOL CGPRS::GPRS_DialUp(CString strTelNum)
{
CString strDialup = _T("ATD");
strDialup += strTelNum + ";"; /* 以分號作為結束 */
GPRS_SendATCmd(strDialup); /* 發送撥號命令 */
return (GPRS_WaitResponseOK());
}
/*******************************************************************************************
函數名稱: GPRS_DialDown
描 述: 掛機(由本機打出的掛機)
輸入參數: 無
輸出參數: 無
返 回: TRUE: 成功 FALSE: 失敗
********************************************************************************************/
BOOL CGPRS::GPRS_DialDown(void)
{
GPRS_SendATCmd("ATH");
return (GPRS_WaitResponseOK());
}
/*******************************************************************************************
函數名稱: GPRS_TakeTheCall
描 述: 接聽電話(有電話打進來, 接聽該電話)
輸入參數: 無
輸出參數: 無
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -