📄 smsg.cpp
字号:
// 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 + -