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

📄 smsg.cpp

📁 GSM Mobile收发短信
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// SMsg.cpp: implementation of the CSMsg class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "SMsg.h"
#include <process.h>

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//==========================================================================================
void CSMsg::Lock()
{
	try
	{
		EnterCriticalSection(&Cs);	
	}
	catch(...)
	{
		return;
	}

}
//==========================================================================================
void CSMsg::UnLock()
{
	try
	{
		LeaveCriticalSection(&Cs);
	}
	catch(...)
	{
		return ;
	}
}
/*
构建涵数目,初始化成员变量;
*/
CSMsg::CSMsg()
{
	try
	{
		m_hKillEvent  = CreateEvent(NULL,TRUE,FALSE,NULL);
        m_hSendEvent  = CreateEvent(NULL,TRUE,FALSE,NULL);
        m_hReadEvent  = CreateEvent(NULL,TRUE,FALSE,NULL);
	    m_hDelEvent   = CreateEvent(NULL,TRUE,FALSE,NULL);

		m_hCMGFEvent  = CreateEvent(NULL,TRUE,FALSE,NULL);
        m_hCSCAEvent  = CreateEvent(NULL,TRUE,FALSE,NULL);
	    m_hCNMIEvent   = CreateEvent(NULL,TRUE,FALSE,NULL);

		InitializeCriticalSection(&Cs);
		memset(m_strSmsCentNum,0,20);
	}
	catch(...)
	{
		return;
	}
}
//==========================================================================================
CSMsg::~CSMsg()
{
	try
	{
		comClose();	
		CloseHandle(m_hKillEvent);
		CloseHandle(m_hComEventThread);
		CloseHandle(m_hSendEvent);
        CloseHandle(m_hReadEvent);
	    CloseHandle(m_hDelEvent);
		CloseHandle(m_hCNMIEvent);
        CloseHandle(m_hCMGFEvent);
	    CloseHandle(m_hCSCAEvent);
	}
	catch(...)
	{
		return ;
	}
}
//=========================================================================================
/*99
涵数说明:
	int CSMsg::comOpen(char* ComN);
参数说明:
	ichar* ComN:端口名称,如:COM1,COM2;
反回值:
  Ret >=0:成功;
	Ret ==-1 :失败;没有结果;
*/
int CSMsg::comOpen(const char* ComN)
{
	try
	{
		LONG lLastError = ERROR_SUCCESS;
		lLastError = m_Com.Open(ComN);
		if (lLastError != ERROR_SUCCESS)
			return CODE_ERR;
	}
	catch(...)
	{
		return CODE_ERR;
	}

	return CODE_OK;
}
//==========================================================================================
int CSMsg::comClose()
{
	try
	{
		int nRet = -1;		
		nRet = m_Com.Close();
		if (nRet != ERROR_SUCCESS)
		{						
			return CODE_ERR;
		}	
		SetEvent(m_hKillEvent);
	}
	catch(...)
	{
		return CODE_ERR;
	}
	return CODE_OK;
}
/*99
涵数说明:
	int CSMsg::comSetUp (int Baudrate,int DataBits,int Parity,int StopBits)
参数说明:
	int Baudrate:波特;
	int DataBits:数据位;
	int Parity:奇偶;
	int StopBits:停止;
反回值:
  Ret >=0:成功;
	Ret ==-1 :失败;没有结果;
*/
int CSMsg::comSetUp 
(
	const int Baudrate,// = (int)CSerial::EBaud9600,
	const int DataBits,// = (int)CSerial::EData8,
	const int Parity,//= (int)CSerial::EParNone,
	const int StopBits// =(int)CSerial::EStop1
)
{
	try
	{
		LONG lLastError = ERROR_SUCCESS;
		lLastError = m_Com.Setup
						   (
								(CSerial::EBaudrate)(int)Baudrate,
								(CSerial::EDataBits)(int)DataBits,
								(CSerial::EParity)(int)Parity,
								(CSerial::EStopBits)(int)StopBits
						   );
		if (lLastError != ERROR_SUCCESS)
			return CODE_ERR;
		lLastError = m_Com.SetMask
		(
			CSerial::EEventBreak |
			CSerial::EEventCTS   |
			CSerial::EEventDSR   |
			CSerial::EEventError |
			CSerial::EEventRing  |
			CSerial::EEventRLSD  |
			CSerial::EEventRecv
		);
		if (lLastError != ERROR_SUCCESS)
			return CODE_ERR;
		lLastError = m_Com.SetupReadTimeouts(CSerial::EReadTimeoutNonblocking);
		if (lLastError != ERROR_SUCCESS)
			return CODE_ERR;

		//启动COM口监控线程
		unsigned long nComEventThreadID;
		m_hComEventThread = CreateThread
							(	NULL,
								0,
								(LPTHREAD_START_ROUTINE)&ComEventProc,
								(void*)this, 
								0, 
								&nComEventThreadID
							);
		if (m_hComEventThread == INVALID_HANDLE_VALUE)
		{				
				return CODE_ERR ;
		}
	}
	catch(...)
	{
		return CODE_ERR;
	}

	return CODE_OK;
}

/*99
涵数说明:
	int CSMsg::comHandshaking (int Handshake);
参数说明:
	int Handshake:握手协议;
反回值:
  Ret >=0:成功;
	Ret ==-1 :失败;没有结果;
*/
int CSMsg::comHandshaking (const int Handshake)
{
	try
	{
		LONG lLastError = ERROR_SUCCESS;
		lLastError = m_Com.SetupHandshaking((CSerial::EHandshake)(int)Handshake);
		if (lLastError != ERROR_SUCCESS)
			return CODE_ERR;
	}
	catch(...)
	{
		return CODE_ERR;
	}
	return CODE_OK;
}

/*99
涵数说明:
	int CSMsg::msgInit(char* Cent);
参数说明:
	char* Cent:短消息中心号码;
反回值:
  Ret >=0:成功;
	Ret ==-1 :失败;没有结果;
*/
int CSMsg::msgInit(const char* strSmsCenterNum ,
		           const char* strCom,
				   const int Baudrate,
				   const int DataBits,
				   const int Parity,
				   const int StopBits,
				   const int eHandshake)
{
	try
	{
		//打开串口
		LONG    lLastError = ERROR_SUCCESS;        
		lLastError = comOpen(strCom);
	    if (lLastError != CODE_OK)
			return CODE_ERR;
        //激活COM通信
		lLastError = comSetUp(Baudrate);
		if (lLastError != CODE_OK)
			return CODE_ERR;
        //设置Handshaking
		/*lLastError = comHandshaking(eHandshake);
		if (lLastError != CODE_OK)
			return CODE_ERR;
*/
		if(strlen(strSmsCenterNum) < 13)
		{
			return CODE_ERR;
		}

		if(!m_Com.IsOpen())
		{ 
			return CODE_ERR; 
		}
		char strATOrder[128];
		memset(strATOrder,0,128);
		//设置短信中心
		/*sprintf(strATOrder,"AT+CSCA=+%s\r\n\0",strSmsCenterNum);
        int nSize = strlen(strATOrder);
		int nRet = m_Com.Write(strATOrder,strlen(strATOrder));
		if (nRet != ERROR_SUCCESS) 
		{	
			return CSCA_ERR; 
		}
		
		if(WaitForSingleObject(m_hCSCAEvent, 2000) == WAIT_OBJECT_0)
		{
		    if(m_RetValue.CompareNoCase("OK") != 0)
			    return CMGF_ERR;
			m_RetValue = "";
		}*/
		sprintf(m_strSmsCentNum,"%s\0",strSmsCenterNum);
		//设置回显方式,显示新收到的短消息
		sprintf(strATOrder,"%s\0","AT+CNMI=1,1,0,0,1\r\n");
		int nRet = m_Com.Write(strATOrder,strlen(strATOrder));
		if (nRet != ERROR_SUCCESS) 
		{	
			return CNMI_ERR; 
		}
		if(WaitForSingleObject(m_hCNMIEvent, 2000) == WAIT_OBJECT_0)
		{
		    if(m_RetValue.CompareNoCase("OK") != 0)
			    return CMGF_ERR;
			m_RetValue = "";
		}

		//设置PDU模式
		sprintf(strATOrder,"%s\0","AT+CMGF=0\r\n");
		nRet = m_Com.Write(strATOrder,strlen(strATOrder));
		if (nRet != ERROR_SUCCESS) 
		{	
			return CMGF_ERR; 
		}
		if(WaitForSingleObject(m_hCMGFEvent, 2000) == WAIT_OBJECT_0)
		{
		    if(m_RetValue.CompareNoCase("OK") != 0)
			    return CMGF_ERR;
			m_RetValue = "";
		}
	}
	catch(...)
	{
		return CODE_ERR;
	}

	return CODE_OK;
}
/*99
涵数说明:
	int CSMsg::msgDel(int Index);
参数说明:
	int Index:操作序列号;-1<Index<10240;
反回值:
  Ret >=0:成功;
	Ret ==-1 :失败;没有结果;
*/
int CSMsg::msgDel(int Index)
{
	try
	{		
		char strATOrder[20];
		memset(strATOrder,0,20);
		//设置短信中心
		sprintf(strATOrder,"AT+CMGD=%d\r\n\0",Index);

		int nRet = m_Com.Write(strATOrder,strlen(strATOrder));
		if (nRet != ERROR_SUCCESS) 
		{	
			return CMGD_ERR; 
		}
		
		// Wait for an event		
		//WaitForComEvent("",&strRet);
		if(WaitForSingleObject(m_hDelEvent, 2000) == WAIT_OBJECT_0)
		{
		    if(m_RetValue.CompareNoCase("OK") != 0)
			    return CMGF_ERR;
		}
	}
	catch(...)
	{
		return CODE_ERR;
	}

	return CODE_OK;
}

//======================================================================================
int CSMsg::msgListSms(int nType,CMsgRecv& MR)
{
	try
	{
		char strATOrder[20];
		memset(strATOrder,0,20);
				
		sprintf(strATOrder,"AT+CMGL=%d\r\n\0",nType);

		int nRet = m_Com.Write(strATOrder,strlen(strATOrder));
		if (nRet != ERROR_SUCCESS) 
		{	
			return CMGL_ERR; 
		}

⌨️ 快捷键说明

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