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

📄 temphumsystemdlg.cpp

📁 这是一个用于工控的上位机系统
💻 CPP
字号:
// TempHumSystemDlg.cpp : implementation file
//

#include "stdafx.h"
#include "TempHumSystem.h"
#include "TempHumSystemDlg.h"

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

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTempHumSystemDlg dialog

CTempHumSystemDlg::CTempHumSystemDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CTempHumSystemDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CTempHumSystemDlg)
	m_f = _T("");
	m_h = _T("");
	m_t = _T("");
	m_name = _T("");
	n_Tem_C = 0;//摄氏温度
	n_Tem_F = 0;//华式温度
	n_Hum_C = 0;//摄氏露点
	n_Hum_F = 0;//华式露点
	n_Leak = 0;//湿度
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CTempHumSystemDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CTempHumSystemDlg)
	DDX_Control(pDX, IDC_MSCOMM, m_com);
	DDX_Text(pDX, IDC_EDIT_F, m_f);
	DDX_Text(pDX, IDC_EDIT_H, m_h);
	DDX_Text(pDX, IDC_EDIT_T, m_t);
	DDX_Text(pDX, IDC_TXT, m_name);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CTempHumSystemDlg, CDialog)
	//{{AFX_MSG_MAP(CTempHumSystemDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON_START, OnButtonStart)
	ON_BN_CLICKED(IDC_BUTTON_SETCOM, OnButtonSetcom)
	ON_WM_TIMER()
	ON_BN_CLICKED(IDC_BUTTON_RENAME, OnButtonRename)
	ON_BN_CLICKED(IDC_CHECK_CHART, OnCheckChart)
	ON_BN_CLICKED(IDC_CHECK_LOG, OnCheckLog)
	ON_BN_CLICKED(IDC_CHECK_EMAIL, OnCheckEmail)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTempHumSystemDlg message handlers

BOOL CTempHumSystemDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
	GetDlgItem(IDC_BUTTON_RENAME)->EnableWindow(false);
	m_name = "Computer Room";

	((CButton *)GetDlgItem(IDC_RADIO_CELCIUS))->SetCheck(TRUE);//选上
	((CButton *)GetDlgItem(IDC_RADIO_FAHRENHEIT))->SetCheck(FALSE);//不选上
	InitMSComm();
	UpdateData(false);
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CTempHumSystemDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CTempHumSystemDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CTempHumSystemDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CTempHumSystemDlg::OnButtonStart() 
{
	// TODO: Add your control notification handler code here
	CString str;
	if(GetDlgItemText(IDC_BUTTON_START,str),str == "Open") {
		SetDlgItemText(IDC_BUTTON_START,"Close");
		GetDlgItem(IDC_BUTTON_SETCOM)->EnableWindow(false);
		GetDlgItem(IDC_BUTTON_RENAME)->EnableWindow(true);
		m_com.SetPortOpen(true);//打开串口
		m_t = "Checking...";
		m_h = "Checking...";
		m_f = "Checking...";
		UpdateData(false);
		SetTimer(1, 1000, NULL);
	}
	else {
		SetDlgItemText(IDC_BUTTON_START,"Open");
		GetDlgItem(IDC_BUTTON_SETCOM)->EnableWindow(true);
		GetDlgItem(IDC_BUTTON_RENAME)->EnableWindow(false);
		m_com.SetPortOpen(false);//打开串口
		m_t = "";
		m_h = "";
		m_f = "";
		UpdateData(false);
		KillTimer(1);
	}
}

void CTempHumSystemDlg::OnButtonSetcom() 
{
	// TODO: Add your control notification handler code here
	CDialog_SetCom comm;
	comm.DoModal();
	InitMSComm();
}

BEGIN_EVENTSINK_MAP(CTempHumSystemDlg, CDialog)
    //{{AFX_EVENTSINK_MAP(CTempHumSystemDlg)
	ON_EVENT(CTempHumSystemDlg, IDC_MSCOMM, 1 /* OnComm */, OnMscomm, VTS_NONE)
	//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()

void CTempHumSystemDlg::OnMscomm() 
{
	// TODO: Add your control notification handler code here
	UpdateData(true);

    VARIANT variant_inp;
    COleSafeArray safearray_inp; 
	LONG len,k;
    extern unsigned char m1,m2,m3,m4,m5,m6;

	extern unsigned char ComData[];
	extern int ComDatacount;

	unsigned char hexdata;
	CString TemperatureS;
	CString TemperatureH, TemperatureL;//温度
	CString strT;

	CString HumidityH, HumidityL;//湿度
	CString strH;

	CString LeaksourceS;
	CString LeaksourceH, LeaksourceL;//漏点
	CString strL;

	CString Symbol;
    CString p[5];
    BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
    CString strtemp1,strtemp2;
    if(m_com.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
	{
		variant_inp=m_com.GetInput(); //读缓冲区
        safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
        len=safearray_inp.GetOneDimSize(); //得到有效数据长度
        for(k=0;k<len;k++) 
			safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
        for(k=0;k<len;k++) //将数组转换为Cstring型变量
		{
			BYTE bt=*(char*)(rxdata+k); //字符型
			strtemp1.Format("%02X ",bt); //将字符以十六进制方式送入临时变量strtemp存放,注意这里加入一个空隔
			strtemp2.Format("%02d",bt); //将字符以十进制方式送入临时变量strtemp存放
            hexdata=atoi(strtemp2);
			ComData[ComDatacount] = hexdata;	
			if(ComDatacount < 11) {		
				//ComData[ComDatacount] = tempdata;
				if(ComDatacount++ == 10 && ComData[0] == 0xf7
					&& ComData[4] == 0xfa && ComData[7] == 0xfb) {
					if( ((CButton *)GetDlgItem(IDC_RADIO_FAHRENHEIT))->GetCheck() ) {
						float tempdata = (float)ComData[2] + ((float)ComData[3])/100;
						if(ComData[1] == 1)
							tempdata *= -1;
						tempdata = 32 + tempdata*(9/5);
						this->n_Tem_F = tempdata;
						Symbol = "℉";
						strT.Format(_T("%0.00f %s"), tempdata, Symbol);
						m_t = strT;

						tempdata = (float)ComData[5] + ((float)ComData[6])/100;
						tempdata = 32 + tempdata*(9/5);
						this->n_Hum_F = tempdata;
						strH.Format(_T("%0.00f %s"), tempdata, Symbol);
						m_h = strH;;
					}
					else {
						Symbol = "℃";
						if(ComData[1] == 0)
							TemperatureS = "+";
						else
							TemperatureS = "-";
						TemperatureH.Format(_T("%x"), ComData[2]);
						TemperatureL.Format(_T("%x"), ComData[3]);
						this->n_Tem_C = (float)ComData[2] + ((float)ComData[3])/100;
						strT.Format(_T("%s%s.%s %s"), TemperatureS, TemperatureH, TemperatureL, Symbol);
						m_t = strT;

						HumidityH.Format(_T("%x"), ComData[5]);
						HumidityL.Format(_T("%x"), ComData[6]);
						this->n_Hum_C = (float)ComData[5] + ((float)ComData[6])/100;
						strH.Format(_T("%s.%s %s"), HumidityH, HumidityL, Symbol);
						m_h = strH;
					}

					Symbol = "%";
					LeaksourceH.Format(_T("%x"), ComData[9]);
					LeaksourceL.Format(_T("%x"), ComData[10]);
					this->n_Leak = (float)ComData[9] + ((float)ComData[10])/100;
					if(ComData[8] == 0)
						LeaksourceS = "+";
					else { 
						LeaksourceS = "-";
						this->n_Leak *= -1;
					}
					strL.Format(_T("%s%s.%s %s"), LeaksourceS, LeaksourceH, LeaksourceL, Symbol);
					m_f = strL;
					//ComDatacount = 0;
				}
				//ComDatacount++;
			}
			else 
				ComDatacount = 0;
		}
	}
	UpdateData(false);
}

void CTempHumSystemDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	extern BOOL OnLogRecord;
	extern int LogTime;
	extern int LogTimeCount;
	extern CString strfilepath;
	CString str, strtime;
	//CStdioFile file;
	CFile file;
	CTime t;
	CString strtemp;
	t = CTime::GetCurrentTime();
	strtime = t.Format( "%y-%m-%d %H:%M:%S" );
	if(OnLogRecord) {
		if(++LogTimeCount == LogTime) {
			str = strtime;
			strtemp.Format(_T("\t\t%0.2f\t%0.2f\t\t%0.2f\t\t\t%0.2f\t%0.2f\r\n"), this->n_Tem_C, this->n_Tem_F, this->n_Leak, this->n_Hum_C, this->n_Hum_F);
			str += strtemp; 
			LogTimeCount = 0;  
			file.Open(strfilepath, CFile::modeWrite|CFile::modeRead);
			//file.Open(strfilepath, CStdioFile::modeCreate|CStdioFile::modeWrite);
			file.SeekToEnd();//指针到文件结尾
			//file.WriteString(str); 
			file.Write(str, str.GetLength());
			file.Close();
		}
	}
	CDialog::OnTimer(nIDEvent);
}

void CTempHumSystemDlg::InitMSComm(void) 
{
	//初始化串口
	CString bodrate;//波特率
	CString jiaoyan;//校验位
	CString databit;//数据位
	CString stopbit;//停止位
	short c1;//串口位 	
	int ii[6];
	CString n;  
	CString p[6];   
	int i;
	char *pBuf;
	DWORD dwFileLen;
	CFile file("comset.ini",CFile::modeRead);
	dwFileLen=file.GetLength();
	pBuf=new char[dwFileLen+1];  
	pBuf[dwFileLen]=0;
	file.Read(pBuf,dwFileLen);
	file.Close();
	n=pBuf;
	p[0]=n.Mid(0,1);   
	p[1]=n.Mid(1,1); 
	p[2]=n.Mid(2,1);   
	p[3]=n.Mid(3,1); 
	p[4]=n.Mid(4,1);  
	for(i = 0; i < 5; i++) {    
		ii[i]=atoi(p[i]);
	}
	switch(ii[0]) {     //串口号	
		case 0:  c1=1; break; 
		case 1:  c1=2; break;  
		case 2:  c1=3; break;  
		case 3:  c1=4; break;  
		case 4:  c1=5; break;  
		case 5:  c1=6; break; 
		case 6:  c1=7; break;  
		case 7:  c1=8; break; 
		case 8:  c1=9; break;  
		case 9:  c1=10; break; 
		case 10:  c1=11; break;  
		case 11:  c1=12; break; 
		default:  c1=1;  break;
	};
	switch(ii[1]) {     //波特率
	  	case 0: bodrate="19200"; break; 
		case 1: bodrate="14400"; break;  
		case 2: bodrate="9600"; break;  
		case 3: bodrate="4800"; break;  
		case 4: bodrate="2400"; break;  
		case 5: bodrate="1800"; break;  
		default:  bodrate="9600";  break;
	}; 
	switch(ii[2]) {      //校验位设置	   	 
		case 0:   jiaoyan="o";    break;//奇 
		case 1:   jiaoyan="e";    break;//偶  
		case 2:   jiaoyan="n";    break;//无  
		default:  jiaoyan="n";    break;
	}; 
	switch(ii[3]) {     //数据位设置	   	
		case 0: databit="9"; break; 
		case 1: databit="8"; break;  
		case 2: databit="7"; break;  
		case 3: databit="6"; break;  
		case 4: databit="5"; break;  
		case 5: databit="4"; break;  
		default:  databit="8";  break;
	};	   
	switch(ii[4]) {      //数据位设置	   	
		case 0: stopbit="2"; break; 
		case 1: stopbit="1"; break;   
		default: stopbit="1";  break;
	};
	delete [] pBuf;
	m_com.SetCommPort(c1);               //选择COM1
    m_com.SetInBufferSize(4096);         //设置输入缓冲区的大小,字节
	m_com.SetOutBufferSize(4096);         //接收区           
	m_com.SetInputMode(1);               //输入二进制数据
	m_com.SetSettings(bodrate+","+jiaoyan+","+databit+","+stopbit);   //串口参数设置
	m_com.SetRThreshold(1);            //为1表示有一个字符引发事件
	m_com.SetInputLen(0);
}

void CTempHumSystemDlg::OnButtonRename() 
{
	// TODO: Add your control notification handler code here
	//GetDlgItem(IDC_TXT)->SetWindowText("这里写你要显示的文字"); 
	CDialogRename name;
	name.DoModal();
	extern CString n_Name;
	m_name = n_Name;
	UpdateData(false);
}

void CTempHumSystemDlg::OnCheckChart() 
{
	// TODO: Add your control notification handler code here
	
}

void CTempHumSystemDlg::OnCheckLog() 
{
	// TODO: Add your control notification handler code here
	static BOOL isWorking = TRUE;//判断CheckBox是否在工作
	extern BOOL OnLogRecord;//是否打开日记记录数据
	CString strname;
	CTime t;
	CString str_time;
	UpdateData(true);
	if(isWorking) {	
		strname = m_name;
		t = CTime::GetCurrentTime();	
		str_time = t.Format( "_%y%m%d%H%M%S.txt" );
		strname += str_time;

		CFileDialog dlg(false, NULL, "D:\\"+strname, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
			"txt Files(*.txt)|*.txt|", NULL);
		if(dlg.DoModal()!= IDOK) {
			AfxMessageBox("No datafile selected,logging disabled");
			((CButton*)(GetDlgItem(IDC_CHECK_LOG)))->SetCheck(FALSE); //IDC_CHECK is ID for control 
			return;
		}
		extern CString strfilepath;//获取数据文件的文件路径
		strfilepath = dlg.GetPathName();
		//CStdioFile file;     
		CFile file;
		file.Open(strfilepath, CFile::modeWrite|CFile::modeCreate);
		CString str;
		str = "\ttime\t\tTemp\t(℃)\t(℉)\tHumidity(%)\tDew Point\t(℃)\t(℉)\r\n";
		file.Write(str, str.GetLength());
		file.Close();
		isWorking = FALSE;
		OnLogRecord = TRUE;
		CDialogTimeset timeset;
		timeset.DoModal();	
	}
	else {
		isWorking = TRUE;
		OnLogRecord = FALSE;
	}
}

void CTempHumSystemDlg::OnCheckEmail() 
{
	// TODO: Add your control notification handler code here
	CDialogEmailsetup emailset;
	emailset.DoModal();
}

⌨️ 快捷键说明

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