📄 gprs.cpp
字号:
返 回: TRUE: 成功 FALSE: 失败
********************************************************************************************/
BOOL CGPRS::GPRS_TakeTheCall(void)
{
GPRS_SendATCmd("ATA");
return (GPRS_WaitResponseOK());
}
/*******************************************************************************************
函数名称: GPRS_TakeTheCall
描 述: 挂断电话(有电话打进来时, 挂断电话)
输入参数: 无
输出参数: 无
返 回: TRUE: 成功 FALSE: 失败
********************************************************************************************/
BOOL CGPRS::GPRS_HangUpTheCall(void)
{
GPRS_SendATCmd("AT+CHUP");
return (GPRS_WaitResponseOK());
}
/*******************************************************************************************
函数名称: GPRS_SetShortMSGCenterTel
描 述: 设置短信中心号码
输入参数: CString strTelNum: 短信中心号码
输出参数: 无
返 回: TRUE: 成功 FALSE: 失败
********************************************************************************************/
BOOL CGPRS::GPRS_SetShortMSGCenterTel(CString strTelNum)
{
CString strTmp;
strTmp = strTelNum + ",145";
GPRS_SendATCmd(strTelNum);
return (GPRS_WaitResponseOK());
}
/*******************************************************************************************
函数名称: FindMsgPos
描 述: 设置短信中心号码
输入参数: CString strTelNum: 短信中心号码
输出参数: 无
返 回: TRUE: 成功 FALSE: 失败
********************************************************************************************/
int CGPRS::FindMsgPos(int *posnum, int *numlen, int *posmsg, int *msglen)
{
// 短信开始位置
int posStart = m_strRespBuf.Find(_T("+CMGR:"), 0);
if (posStart < 0)
return -1;
// 电话号码开始位置
*posnum = m_strRespBuf.Find(_T("\"REC READ\",\""), posStart);
if (*posnum < 0)
return -1;
*posnum = *posnum + wcslen(_T("\"REC READ\",\""));
// 电话号码结束位置
int posnumend = m_strRespBuf.Find(_T("\""), *posnum + 1);
if (posnumend < 0)
return -1;
// 电话号码长度
*numlen = posnumend - *posnum;
// 短信开始位置
*posmsg = m_strRespBuf.Find(_T("\r\n"), posStart);
if (*posmsg < 0)
return -1;
*posmsg = *posmsg + wcslen(_T("\r\n"));
// 短信结束位置
int posmsgend = m_strRespBuf.Find(_T("\r\n\r\nOK"), *posmsg);
*msglen = posmsgend - *posmsg;
return 1;
}
/*******************************************************************************************
函数名称: GPRS_ReadShortMessage
描 述: 读取短信内容
输入参数: DWORD num : 短信序号
输出参数: CString *Msg : 短信内容
返 回: TRUE: 成功 FALSE: 失败
********************************************************************************************/
BOOL CGPRS::GPRS_ReadShortMessage(DWORD num, CString *strTelCode, CString *Msg)
{
CString strReadNum;
BOOL ret, retvalue;
strReadNum.Format(_T("AT+CMGR=%d"), num);
bSendATCmd = TRUE;
GPRS_SendATCmd(strReadNum); /* 命令: 读第 num 条短信 */
while(1)
{
ret = WaitForSingleObject(m_ATCmdRespEvent, 2000);
if (ret == WAIT_OBJECT_0)
{
if (m_strRespBuf.Find(_T("ERROR\r\n"), 0) > 0) /* 响应为 ERROR */
{
//AfxMessageBox(_T("读取短信发现错误"));
retvalue = FALSE;
break;
}
int posnum, numlen, posmsg, msglen;
int pos = FindMsgPos(&posnum, &numlen, &posmsg, &msglen); /* 寻找短信位置 */
if (pos > 0)
{
//char buffer[1024];
//for (int i = 0; i < m_strRespBuf.GetLength(); i++)
// buffer[i] = (char)m_strRespBuf.GetAt(i);
*strTelCode = m_strRespBuf.Mid(posnum, numlen);
*Msg = m_strRespBuf.Mid(posmsg, msglen); /* 取出短信内容 */
retvalue = TRUE;
break;
}
ResetEvent(m_ATCmdRespEvent);
}//end of if (ret == WAIT_OBJECT_0)
else
{
//AfxMessageBox(_T("读取短信超时"));
retvalue = FALSE;
break;
}
}
ResetGlobalVarial();
if (retvalue == FALSE)
return FALSE;
return TRUE;
}
/*******************************************************************************************
函数名称: GPRS_SendShortMessage
描 述: 发送短信
输入参数: CString strTelNum : 对方电话号码
输出参数: CString *Msg : 短信内容
返 回: TRUE: 成功 FALSE: 失败
********************************************************************************************/
BOOL CGPRS::GPRS_SendShortMessage(CString strTelNum, CString Msg)
{
BOOL ret, retvalue;
int pos;
/*
* 1. 发送电话号码
*/
CString strNum;
strNum.Format(_T("AT+CMGS=\"%s\""), strTelNum);
bSendATCmd = TRUE;
GPRS_SendATCmd(strNum); /* 发送电话号码 */
while(1)
{
ret = WaitForSingleObject(m_ATCmdRespEvent, 2000);
if (ret == WAIT_OBJECT_0)
{
pos = m_strRespBuf.Find(_T('>'), 0);
if (pos > 0)
{ /* 收到提示符, 现在可以往模块写入短信内容了 */
retvalue = TRUE;
break;
}
pos = m_strRespBuf.Find(_T("ERROR\r\n"), 0);
if (pos > 0)
{
retvalue = FALSE; /* GPRS 响应字符中包含有"ERROR" */
break;
}
}
else
{
retvalue = FALSE;
break;
}
}
ResetGlobalVarial();
if (retvalue == FALSE) return FALSE;
/*
* 2. 等待 '>' 提示符, 发送短信内容
*/
bSendATCmd = TRUE;
GPRS_WriteMsg(Msg);
while(1)
{
ret = WaitForSingleObject(m_ATCmdRespEvent,500);
if (ret == WAIT_OBJECT_0)
{
int pos = m_strRespBuf.Find(_T("ERROR\r\n"), 0);
if (pos > 0)
{
retvalue = FALSE;
break;
}
pos = m_strRespBuf.Find(_T("CMGS"), 0);
if (pos > 0)
{ /* 响应正确, 发送成功 */
retvalue = TRUE;
break;
}
}
}
ResetGlobalVarial();
if (retvalue == FALSE)
return FALSE;
return TRUE;
}
/*******************************************************************************************
函数名称: CheckMsgNum
描 述: 检查短信数量: SIN卡中有效短信数量及可纳容的最大短信数量(private函数)
输入参数: CString str : GPRS 响应字符
输出参数: CString *strNum : 有效短信数量
CString *strTotal: 可纳容的最大短信数量
返 回: TRUE: 成功 FALSE: 失败
********************************************************************************************/
BOOL CheckMsgNum(CString str, CString *strNum, CString *strTotal)
{
int pos1 = str.Find(_T("\"SM\","), 0); /* 标识字符 */
if (pos1 < 0)
return FALSE;
int pos2 = str.Find(_T(','), pos1 + 5); /* 分隔逗号 */
if (pos2 < 0)
return FALSE;
*strNum = str.Mid(pos1 + 5, pos2 - (pos1 + 5)); /* 现有短信数量 */
int pos3 = str.Find(_T(","), pos2 + 1);
if (pos3 < 0)
return FALSE;
*strTotal = str.Mid(pos2 + 1, pos3 - pos2 - 1); /* 可纳容的最大短信数量 */
return TRUE;
}
/*******************************************************************************************
函数名称: GPRS_CheckMsgNum
描 述: 检查短信数量: SIN卡中有效短信数量及可纳容的最大短信数量(public函数)
输入参数: 无
输出参数: CString *strNum : 有效短信数量
CString *strTotal: 可纳容的最大短信数量
返 回: TRUE: 成功 FALSE: 失败
********************************************************************************************/
BOOL CGPRS::GPRS_CheckMsgNum(CString *strNum, CString *strTotal)
{
BOOL ret, retvalue;
CString strTmp;
bSendATCmd = TRUE;
GPRS_SendATCmd(_T("AT+CPMS?")); /* 查询命令 */
while(1)
{
ret = WaitForSingleObject(m_ATCmdRespEvent, 500);
if (ret == WAIT_OBJECT_0)
{
int pos = m_strRespBuf.Find(_T("ERROR\r\n"), 0);
if (pos > 0)
{
retvalue = FALSE;
break;
}
if (CheckMsgNum(m_strRespBuf, strNum, strTotal) == TRUE)
{ /* 查询成功 */
retvalue = TRUE;
break;
}
ResetEvent(m_ATCmdRespEvent);
}
else
{
retvalue = FALSE;
break;
}
}
ResetGlobalVarial();
if (retvalue == FALSE)
return FALSE;
return TRUE;
}
/*******************************************************************************************
函数名称: GPRS_DeleteShortMsg
描 述: 删除短信
输入参数: 无
输出参数: DWORD num : 短信序号
返 回: TRUE: 成功 FALSE: 失败
********************************************************************************************/
BOOL CGPRS::GPRS_DeleteShortMsg(DWORD num)
{
CString strCmd;
BOOL ret;
strCmd.Format(_T("AT+CMGD=%d"), num);
GPRS_SendATCmd(strCmd);
ret = GPRS_WaitResponseOK();
if (ret == FALSE)
return FALSE;
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -