📄 smscomm.cpp
字号:
#include "stdafx.h"
#include "SmsComm.h"
#include "ShortMessage.h"
#include "MsgSend.h"
SmsComm::SmsComm(void)
{
}
SmsComm::~SmsComm(void)
{
}
CString SmsComm::GetComm(void)
{
CString strResult;
HKEY hKey;
LONG ret;
OSVERSIONINFO osvi;
BOOL bOsVersionInfoEx;
char keyinfo[100],comm_name[200],ValueName[200];
int i;
DWORD sType,Reserved,cbData,cbValueName;
ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
memset(keyinfo,0,100);
strcpy(keyinfo,"HARDWARE\\DEVICEMAP\\SERIALCOMM");
i=0; sType=REG_SZ;Reserved=0;
bOsVersionInfoEx =GetVersionEx(&osvi);
ret=RegOpenKeyEx(HKEY_LOCAL_MACHINE,keyinfo,0,KEY_ALL_ACCESS,&hKey);
if (ret==ERROR_SUCCESS)
{
if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)
{
do
{
cbData=200;cbValueName=200;
memset(comm_name,0,200);
memset(ValueName,0,200);
ret=RegEnumValue(hKey,i,ValueName,&cbValueName,NULL,&sType,(LPBYTE)comm_name,&cbData);
if (ret==ERROR_SUCCESS)
{
//m_list.Add(comm_name);
strResult = strResult + "|" + comm_name;
i++;
}
}while (ret==ERROR_SUCCESS);
}
}
RegCloseKey(hKey);
return strResult;
}
int SmsComm::SendData(char *buffer, DWORD dwBytesWritten)
{
BOOL bWriteStat;
//DWORD dwBytesRead;
bWriteStat = WriteFile(m_hCom, buffer, dwBytesWritten, &dwBytesWritten, &m_OverlappedWrite );
//CString s;
//s.Format("SEND:%s",buffer);
//AddDebug(s);
if(!bWriteStat)
{
if(GetLastError()==ERROR_IO_PENDING)
{
WaitForSingleObject(m_OverlappedRead.hEvent,1000);
return ((int)dwBytesWritten);
}
return(0);
}
return ((int)dwBytesWritten);
}
int SmsComm::SendData(CString strPhone, CString strMessage)
{
CMsgSend msg;
CString m_mobile = strPhone;
CString m_message = strMessage;
msg.Pack(m_mobile,m_message);
CString sendMsg = msg.GetMsgData();
//AfxMessageBox("sendMsg:"+sendMsg);
CString m;
m.Format("AT+CMGS=%d\r",(sendMsg.GetLength()-msg.SCA.GetLength())/2);
//AfxMessageBox("command:"+m);
SendData((LPSTR)(LPCTSTR)m,m.GetLength());
Sleep(300);
m.Format("%s%c",sendMsg,0x1a);
//AfxMessageBox("content:"+m);
int iReturn = SendData((LPSTR)(LPCTSTR)m,m.GetLength());
return iReturn;
}
int SmsComm::ReadData(char *buffer, DWORD dwBytesRead)
{
BOOL bReadStatus;
bReadStatus = ReadFile( m_hCom, buffer, dwBytesRead, &dwBytesRead,&m_OverlappedRead);
if(!bReadStatus)
{
if(GetLastError()==ERROR_IO_PENDING)
{
WaitForSingleObject(m_OverlappedRead.hEvent,1000);
return ((int)dwBytesRead);
}
return(0);
}
return ((int)dwBytesRead);
}
int SmsComm::ReadUnReadMsg()
{
CString m;
m.Format("AT+CMGL=0\r");
int iReturn = SendData((LPSTR)(LPCTSTR)m,m.GetLength());
Sleep(500);
return iReturn;
}
int SmsComm::ReadAllMsg()
{
CString m;
m.Format("AT+CMGL=4\r");
int iReturn = SendData((LPSTR)(LPCTSTR)m,m.GetLength());
Sleep(500);
return iReturn;
}
int SmsComm::CommWatchProc(LPARAM parm)
{
SmsComm * smsComm = (SmsComm *)parm;
//HANDLE m_hComDev = dlg->m_hCom;
DWORD dwBytesRead;
char buffer[8000];
DWORD ret;
while(true)
{
memset(buffer,0,8000);
int r = smsComm->ReadData(buffer,8000);
// TRACE("%s",buffer);
if(strlen(buffer) != 0)
{
CString s;
s.Format("%s",buffer);
CShortMessage Message;
Message.Open(s);
if(Message.GetCount() > 0) //有消息
{
//CString szText;
//szText.Format("接收短信成功,共收到%d条信息。", Message.GetCount());
//AfxMessageBox(szText);
while(!Message.GetEOF())
{
CString szCallCenter = Message.GetCallCenter();
CString szCallFrom = Message.GetCallNumber();
CString szSMSContent = Message.GetSMSContent();
CString szDateTime = Message.GetDateString();
//szText.Format("短信中心:\t%s\r\n发送号码:\t%s\r\n短信内容:\t%s\r\n\r\n日期时间:\t%s",
// Message.GetCallCenter(), Message.GetCallNumber(), Message.GetSMSContent(), Message.GetDateString());
//AfxMessageBox(szText);
//dlg->AddDebug(Message.GetSMSContent());
AfxMessageBox(szSMSContent);
Message.MoveNext();
}
}
}
Sleep(100);
}
return 0;
}
int SmsComm::OpenComm(CString strComm)
{
int isOpen = 0;
CString strOpenComm = strComm;
DWORD dwThreadID;
m_hCom = CreateFile(strComm,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
if(m_hCom == INVALID_HANDLE_VALUE)
{
//AfxMessageBox("对不起,连接失败!");
return isOpen;
}
ASSERT(m_hCom!=INVALID_HANDLE_VALUE);
SetCommMask(m_hCom, EV_RXCHAR|EV_TXEMPTY );//设置事件驱动的类型
SetupComm( m_hCom, 1024,512) ; //设置输入、输出缓冲区的大小
PurgeComm( m_hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR ); //清干净输入、输出缓冲区
COMMTIMEOUTS CommTimeOuts ; //定义超时结构,并填写该结构
CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF;
CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
CommTimeOuts.ReadTotalTimeoutConstant = 0;
CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
CommTimeOuts.WriteTotalTimeoutConstant = 5000;
SetCommTimeouts( m_hCom, &CommTimeOuts ) ;//设置读写操作所允许的超时
DCB dcb;
GetCommState(m_hCom, &dcb ) ; //读串口原来的参数设置
dcb.BaudRate =9600;
dcb.ByteSize =8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT ;
dcb.fBinary = TRUE ;
dcb.fParity = FALSE;
SetCommState(m_hCom, &dcb ) ; //串口参数配置
memset( &m_OverlappedRead, 0, sizeof( OVERLAPPED ) );
memset( &m_OverlappedWrite, 0, sizeof( OVERLAPPED ) );
m_OverlappedRead.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
m_OverlappedWrite.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
m_hExit = CreateEvent(NULL,NULL,FALSE,NULL);
hCommWatchThread = CreateThread( (LPSECURITY_ATTRIBUTES) NULL,0,(LPTHREAD_START_ROUTINE)CommWatchProc,this,0, &dwThreadID );
if(hCommWatchThread == NULL)
{
//AfxMessageBox("对不起,连接失败!");
return isOpen;
}
ASSERT(hCommWatchThread!=NULL);
isOpen = 1;
SendData("AT\r\n",strlen("AT\r\n"));
PurgeComm(m_hCom, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);
return isOpen;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -