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

📄 gprs.cpp

📁 这是用evc编写的MagicARM2410开发平台上的一个GPRS收发短信的源码。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
返    回: 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 + -