📄 checkdlg.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 + -