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

📄 checkdlg.cpp

📁 通过发送AT命令实现发送和接受短信的功能
💻 CPP
字号:
  // CheckDlg.cpp : implementation file
//

#include "stdafx.h"
#include "SelfCheck.h"
#include "CheckDlg.h"
#include "SerialPort.h"
#include "ComPort.h"
#include "ComPorts.h"

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

/////////////////////////////////////////////////////////////////////////////
// CCheckDlg dialog
//LsComm::CComPort cs;
CComPorts cs;
int portnum = 1;
int band = 115200;

CCheckDlg::CCheckDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CCheckDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CCheckDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
}


void CCheckDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CCheckDlg)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CCheckDlg, CDialog)
	//{{AFX_MSG_MAP(CCheckDlg)
	ON_WM_CLOSE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CCheckDlg message handlers

BOOL CCheckDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here
	CListCtrl * lc = (CListCtrl*)GetDlgItem(IDC_STATUS);
	lc->InsertColumn(0, _T("系统消息"), LVCFMT_LEFT, 500);
	IsCancle = FALSE;
	hThread = AfxBeginThread((AFX_THREADPROC)DoPreparation, this);
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CCheckDlg::AddSYSMsg(CString msg)
{
	CListCtrl * lc = (CListCtrl*)GetDlgItem(IDC_STATUS);
	COleDateTime Now;
	Now = COleDateTime::GetCurrentTime();
	CString time;
	time.Format(_T("%.2d:%.2d:%.2d> %s"), Now.GetHour(), Now.GetMinute(), Now.GetSecond(), msg);
	lc->InsertItem(0, time);
}

DWORD WINAPI ReceivePrepare(LPVOID param);

void CCheckDlg::DoPreparation(CCheckDlg *pDlg)
{
	//portnum = 1;
	//band = 115200;
	char ret[64];
	char buffer[] = "AT+CSQ=?\r";
	char buffer1[] = "at+cmgf=1\r";
	char buffer2[] = "AT+CNMI=1,1,0,0,1\r";
	char buffer3[] = "AT+CGDCONT=1,\"IP\",\"CMNET\"\r";
	int count = 1;

	CString info;
	pDlg->AddSYSMsg(_T("正在打开串口"));
	info.Format(_T("串口号:%d, 波特率:%d "), portnum, band);
	pDlg->AddSYSMsg(info);
	
	//BOOL open = cs.Open(portnum, LsComm::CComPort::AutoReceiveBySignal, band);
	BOOL open = cs.Open(portnum, band);

 	if( !open )
	{
		pDlg->AddSYSMsg(_T("串口初始化错误,错误代码:002"));
		pDlg->AddSYSMsg(_T("请进入'地址'菜单查看'串口号'和'波特率'是否正确"));
		goto end;
	}
	else
	{
		pDlg->AddSYSMsg(_T("串口成功启动"));
//		pDlg->EndDialog(1);
	}
	
//	Sleep(1000);
//	pDlg->AddSYSMsg("正在检测GPRS设备");
//	cs.Output("AT\r",3);
//	Sleep(40);
//	memset(ret,0,sizeof(ret));
//	cs.GetInput(ret,64);
//	if( (strstr(ret,"ok")!=NULL)||(strstr(ret,"OK")!=NULL) )
//	{
//		pDlg->AddSYSMsg("GPRS设备检测正常");
//	}
//	else if( (strstr(ret,"error")!=NULL)||(strstr(ret,"ERROR")!=NULL) )
//	{	
//		pDlg->AddSYSMsg("GPRS设备检测异常");
//		return;
//	}
//	else
//	{
//		pDlg->AddSYSMsg("GPRS设备检测异常");
//		return;
//	}


	pDlg->prepared = FALSE;
	pDlg->AddSYSMsg(_T("正在检测GPRS设备"));

	pDlg->IsTerminated = FALSE;
	//Sleep(40);
	pDlg->AddSYSMsg(_T("正在检查外设状态(第1次)"));
	cs.Output("AT\r",3);
	pDlg->StartThread();
	
again:
	pDlg->hEvent = CreateEvent(NULL, TRUE, FALSE, _T("CheckGPRSState"));
	switch(WaitForSingleObject(pDlg->hEvent, 3000)) 
	{
	case WAIT_ABANDONED:
	case WAIT_TIMEOUT:
		++count;
		if (count > 3) 
		{
			pDlg->AddSYSMsg(_T("外设发生故障,或者没有打开,错误代码:003"));
			//pDlg->GetDlgItem(IDC_DIRECTENTER)->ShowWindow(SW_HIDE);
			pDlg->CloseThead();
			//AfxEndThread(0);
			//CloseHandle(pDlg->hEvent);
			//return;
		}
		else
		{
			CString info;
			info.Format(_T("正在检查外设状态(第%d次)"), count);
			pDlg->AddSYSMsg(info);
			goto again;
		}
		
		goto end;
		break;
	case WAIT_OBJECT_0:
		{
			if(!pDlg->prepared)
			{
				pDlg->AddSYSMsg(_T("外设发生故障,或者没有打开,错误代码:003"));
				pDlg->AddSYSMsg(_T("用户取消操作"));
				//CloseHandle(m_receiveThread);
				pDlg->CloseThead();
				//CloseHandle(pDlg->hEvent);
				goto end;
				//AfxEndThread(0);
				//pDlg->GetDlgItem(IDC_DIRECTENTER)->ShowWindow(SW_HIDE);
				//				Sleep(2000);
			}
			else
			{
				pDlg->AddSYSMsg(_T("外设工作正常"));
				pDlg->AddSYSMsg(_T("正在读取外设信息,等待1秒钟"));
				//CloseHandle(m_receiveThread);
				pDlg->CloseThead();
				Sleep(1000);
			}
		}
	}
	
	CloseHandle(pDlg->hEvent);
	//Sleep(1000);
//	pDlg->AddSYSMsg(_T("正在检测GPRS信号强度"));
	
//	memset(ret,0,sizeof(ret));
//	cs.Output(buffer,9);
//	Sleep(40);
//	cs.GetInput(ret,64);
//	if( (strstr(ret,_T("error"))!=NULL)||(strstr(ret,_T("ERROR"))!=NULL) )
//	{	
//		pDlg->AddSYSMsg(_T("GPRS信号强度检测异常"));
//	}
//	else if((strstr(ret,_T("+CSQ:"))!=NULL)||(strstr(ret,_T("+csq:"))!=NULL))
//	{
//		pDlg->AddSYSMsg(_T("GPRS信号强度如下:"));
//		int index1;
//		int index2;
//		CString strong(ret);
//		index1 = strong.Find(_T("<rssi>"),0);
//		index2 = strong.Find(_T("<ber>"),0);
//		CString a = strong.Mid(index1+5,index2);
//		CString b = strong.Right(index2+4);
//		if(a.Find(_T("0")) != -1)
//			pDlg->AddSYSMsg(_T("-113dBm or less"));
//		if(a.Find(_T("1")) != -1)
//			pDlg->AddSYSMsg(_T("-111dBm"));
//		if(a.Find(_T("31")) != -1)
//			pDlg->AddSYSMsg(_T("-51dBm or greater"));
//		if(a.Find(_T("99")) != -1)
//			pDlg->AddSYSMsg(_T("信号未知"));
//		else
//			pDlg->AddSYSMsg(_T("-109...-53dBm"));
//
//		pDlg->AddSYSMsg(_T("GPRS误码率如下"));
//		if(a.Find(_T("0")) != -1)
//			pDlg->AddSYSMsg(_T("误码率0,最低"));
//		if(a.Find(_T("1")) != -1)
//			pDlg->AddSYSMsg(_T("误码率1,很低"));
//		if(a.Find(_T("2")) != -1)
//			pDlg->AddSYSMsg(_T("误码率2,低"));
//		if(a.Find(_T("3")) != -1)
//			pDlg->AddSYSMsg(_T("误码率3,较低"));
//		if(a.Find(_T("4")) != -1)
//			pDlg->AddSYSMsg(_T("误码率4,较高"));
//		if(a.Find(_T("5")) != -1)
//			pDlg->AddSYSMsg(_T("误码率5,高"));
//		if(a.Find(_T("6")) != -1)
//			pDlg->AddSYSMsg(_T("误码率6,很高"));
//		if(a.Find(_T("7")) != -1)
//			pDlg->AddSYSMsg(_T("误码率7,最高"));
//		if(b.Find(_T("99")) != -1)
//			pDlg->AddSYSMsg(_T("误码率未知"));
//		else
//			pDlg->AddSYSMsg(_T("误码率未知"));
//	}

//	Sleep(1000);
	pDlg->AddSYSMsg(_T("正在设置GPRS短信息模式"));
	
	memset(ret,0,sizeof(ret));
	cs.Output("AT+CMGF=1\r",10);
	Sleep(40);
	cs.GetInput(ret,64);
	if( (strstr(ret,_T("ok"))!=NULL)||(strstr(ret,_T("OK"))!=NULL) )
	{
		pDlg->AddSYSMsg(_T("信息模式设置正确"));
	}
	else if( (strstr(ret,_T("error"))!=NULL)||(strstr(ret,_T("ERROR"))!=NULL) )
	{	
		pDlg->AddSYSMsg(_T("信息模式设置错误"));
	}
	else
	{
		pDlg->AddSYSMsg(_T("信息模式设置错误"));
	}

//	Sleep(1000);
//	pDlg->AddSYSMsg(_T("正在设置GPRS新消息提示模式"));
//
//	memset(ret,0,sizeof(ret));
//	cs.Output(buffer2,18);
//	Sleep(40);
//	cs.GetInput(ret,64);
//	if( (strstr(ret,_T("ok"))!=NULL)||(strstr(ret,_T("OK"))!=NULL) )
//	{
//		pDlg->AddSYSMsg(_T("新消息提示模式设置正确"));
//	}
//	else if( (strstr(ret,_T("error"))!=NULL)||(strstr(ret,_T("ERROR"))!=NULL) )
//	{	
//		pDlg->AddSYSMsg(_T("新消息提示模式设置错误"));
//	}
//	else
//	{
//		pDlg->AddSYSMsg(_T("新消息提示模式设置错误"));
//	}

	Sleep(1000);
	pDlg->AddSYSMsg(_T("正在设置GPRS上网"));
	
	memset(ret,0,sizeof(ret));
	cs.Output("AT+CGDCONT=1,\"IP\",\"CMNET\"\r",26);
	Sleep(40);
	cs.GetInput(ret,64);
	if( (strstr(ret,_T("ok"))!=NULL)||(strstr(ret,_T("OK"))!=NULL) )
	{
		pDlg->AddSYSMsg(_T("GPRS上网设置正确"));
	}
	else if( (strstr(ret,_T("error"))!=NULL)||(strstr(ret,_T("ERROR"))!=NULL) )
	{	
		pDlg->AddSYSMsg(_T("GPRS上网设置错误"));
	}
	else
	{
		pDlg->AddSYSMsg(_T("GPRS上网设置错误"));
	}
	
end:
	Sleep(1000);
//	::SendMessage(pDlg->GetSafeHwnd(), WM_CLOSE, 0 ,0);
	AfxEndThread(0);
}


void CCheckDlg::OnOK() 
{
	// TODO: Add extra validation here
	
//	::SendMessage(this->GetSafeHwnd(), WM_CLOSE, 0 ,0);
//	AfxEndThread(0);
//	CloseThead();
//	if(m_receiveThread != NULL)
//		delete m_receiveThread;
	if (hEvent) 
	{
		SetEvent(hEvent);
	}
	//CDialog::OnOK();
}

LRESULT CCheckDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
	// TODO: Add your specialized code here and/or call the base class
	
	return CDialog::WindowProc(message, wParam, lParam);
}

DWORD WINAPI ReceivePrepare(LPVOID param)
{
	char ret[64];
	// cs.WriteComm("AT\r",3);
	CCheckDlg * dlg = (CCheckDlg*)param;
	while(!dlg->IsTerminated)
	{
		//Sleep(1000);
		//AfxMessageBox("alive");
		memset(ret,0,sizeof(ret));
		cs.GetInput(ret,64);
		if( (strstr(ret,_T("ok"))!=NULL)||(strstr(ret,_T("OK"))!=NULL) )
		{
			//pDlg->AddSYSMsg("GPRS设备检测正常");
			dlg->prepared = TRUE;
			if (dlg->hEvent) 
			{
				SetEvent(dlg->hEvent);
				AfxEndThread(0);
			}
		}
//		dlg->prepared = TRUE;
//		SetEvent(dlg->hEvent);
	}
	return 0;
}

void CCheckDlg::StartThread()
{
	//m_receiveThread = AfxBeginThread((AFX_THREADPROC)ReceivePrepare, this);
	m_receiveThread = CreateThread(NULL, 0, ReceivePrepare, this, 0, NULL);
}

void CCheckDlg::CloseThead()
{
	if(m_receiveThread != NULL && IsTerminated == FALSE)
	{
		//CloseHandle(m_receiveThread);
		//delete m_receiveThread;
		//SuspendThread(m_receiveThread);
		//TerminateThread(m_receiveThread, 0);
		IsTerminated = TRUE;
		BOOL IsClose = CloseHandle(m_receiveThread);
	}
}

void CCheckDlg::OnClose() 
{
	// TODO: Add your message handler code here and/or call default
	if(m_receiveThread != NULL && IsTerminated == FALSE)
	{
		//CloseHandle(m_receiveThread);
		//delete m_receiveThread;
		//SuspendThread(m_receiveThread);
		//TerminateThread(m_receiveThread, 0);
		CloseHandle(m_receiveThread);
		IsTerminated = TRUE;
		//delete m_receiveThread;
	}
	CDialog::OnClose();
}

void CCheckDlg::OnCancel() 
{
	// TODO: Add extra cleanup here
//	::SendMessage(this->GetSafeHwnd(), WM_CLOSE, 0 ,0);
//	AfxEndThread(0);
	if(m_receiveThread != NULL && IsTerminated == FALSE)
	{
		//TerminateThread(m_receiveThread, 0);
		CloseHandle(m_receiveThread);
		IsTerminated = TRUE;
	}
	CDialog::OnCancel();
}

⌨️ 快捷键说明

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