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

📄 温度采集dlg.cpp

📁 基于18B20的温度采集系统
💻 CPP
字号:
// 温度采集Dlg.cpp : implementation file
//

#include "stdafx.h"
#include "Windows.h"
#include "温度采集.h"
#include "温度采集Dlg.h"
#include "Series.h"
#include "pen.h"
#include "valuelist.h"
#include "page.h"
#include "axes.h"
#include "axis.h"
#include "toollist.h"
#include "tools.h"
#include "annotationtool.h"
#include "export.h"
#include "scroll.h"

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

/////////////////////////////////////////////////////////////////////////////
// CMyDlg dialog

CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CMyDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CMyDlg)
	m_IntervalTime = 0;
	m_longHigh = 0;
	m_longLow = 0;
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CMyDlg)
	DDX_Control(pDX, IDC_COMBO_BAUD, m_ctrlBaud);
	DDX_Control(pDX, IDC_COMBO_EXACT, m_ctrlExact);
	DDX_Control(pDX, IDC_LIST_RESULT, m_ctrlListResult);
	DDX_Control(pDX, IDC_COMBO_COMPORT, m_ctrlComPort);
	DDX_Control(pDX, IDC_TCHART1, m_ctrlChart);
	DDX_Text(pDX, IDC_EDIT_interval, m_IntervalTime);
	DDV_MinMaxInt(pDX, m_IntervalTime, 1, 600);
	DDX_Control(pDX, IDC_MSCOMM1, m_ctrlComm);
	DDX_Control(pDX, IDC_TEEPREVIEWER1, m_ctrlPrintPreview);
	DDX_Text(pDX, IDC_EDIT_HIGH, m_longHigh);
	DDV_MinMaxLong(pDX, m_longHigh, -55, 125);
	DDX_Text(pDX, IDC_EDIT_LOW, m_longLow);
	DDV_MinMaxLong(pDX, m_longLow, -55, 125);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
	//{{AFX_MSG_MAP(CMyDlg)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON_BEGIN, OnButtonBegin)
	ON_CBN_SELCHANGE(IDC_COMBO_COMPORT, OnChangeComport)
	ON_WM_TIMER()
	ON_EN_CHANGE(IDC_EDIT_interval, OnChangeInterval)
	ON_BN_CLICKED(IDC_SAVE, OnSave)
	ON_BN_CLICKED(IDC_BUTTON_CLEAR, OnButtonClear)
	ON_CBN_SELCHANGE(IDC_COMBO_BAUD, OnChangeComboBaud)
	ON_CBN_SELCHANGE(IDC_COMBO_EXACT, OnSelchangeExact)
	ON_EN_KILLFOCUS(IDC_EDIT_HIGH, OnKillfocusEditHigh)
	ON_EN_KILLFOCUS(IDC_EDIT_LOW, OnKillfocusEditLow)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyDlg message handlers

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

	// 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

	BeginTime = COleDateTime::GetCurrentTime();
    COleDateTime tempTime ;
    tempTime = BeginTime; 
	MinTemp	= 500;

	m_ctrlListResult.AddString("欢迎使用温度采集软件...");
	m_ctrlListResult.AddString("通信端口COM1   19200bps");
	m_ctrlListResult.AddString("采集间隔: 1S  采集精度:   ");
	m_ctrlListResult.AddString("高温警告: 20   低温警告: -5");
	m_longHigh = 25;	//初始化最高温度警告值
	m_longLow  = -5;		//初始化最低温度警告值
	
	m_ctrlChart.Series(0).SetTitle("温度");
	m_ctrlChart.Series(1).SetTitle("高温界限");
	m_ctrlChart.Series(2).SetTitle("低温界限");
	m_ctrlChart.Series(3).SetTitle("零点");
	m_ctrlChart.Series(0).Clear();
	m_ctrlChart.Series(1).Clear();
	m_ctrlChart.Series(2).Clear();
	m_ctrlChart.Series(3).Clear();
	m_ctrlChart.GetAxis().GetLeft().SetMaximum(m_longHigh + 10);
	m_ctrlChart.GetAxis().GetLeft().SetMinimum(m_longLow - 10);
	//m_ctrlChart.GetAxis().GetBottom().SetAutomatic(FALSE);	//取消底部坐标轴的自动滚动
	//m_ctrlChart.GetPage().SetMaxPointsPerPage(10);		//设置最多显示20个点

    BeginTime.SetTime(0,0,0);
    BeginTime.SetDate(tempTime.GetYear(),tempTime.GetMonth(),tempTime.GetDay());
    COleDateTimeSpan tmSpan = COleDateTimeSpan(0,0,1,0);

	gather_times = 0;
	m_IntervalTime = 1;
	SetTimer(1,1000,NULL);

	UpdateData(FALSE);
	m_ctrlExact.SetCurSel(0);	//分辨率设为12位AD,即0.0623度

	m_ctrlComPort.SetCurSel(0);	//设为COM1
	m_ctrlBaud.SetCurSel(2);	//设为19200bps
	
	m_ctrlComm.SetCommPort(1);			//选择COM1
	m_ctrlComm.SetInputMode(1);			//输入方式为二进制
	m_ctrlComm.SetInBufferSize(1024);	//设置输入缓冲区大小
	m_ctrlComm.SetOutBufferSize(1024);	//设置输出缓冲区大小

	m_ctrlComm.SetSettings("19200,n,8,1");//波特率为19200,无校验,8个数据位,1个停止位
	//参数1表示每当串口接收缓冲区有多于或等于1个字符时
	//将引发一个接收数据的OnComm事件
	if (!m_ctrlComm.GetPortOpen())
		m_ctrlComm.SetPortOpen(TRUE);
	GetDlgItem(IDC_BUTTON_BEGIN)->SetWindowText("停止采集");
	m_ctrlComm.SetRThreshold(2);
	m_ctrlComm.SetInputLen(0);	//设置当前接收区数据长度为0
	m_ctrlComm.GetInput();		//先预读缓冲区以清除残留数据
	exact = 0x12;		//12位精度
	CString str_temp;
	str_temp.Format("%c", exact);
	m_ctrlComm.SetOutput((COleVariant)str_temp);

	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CMyDlg::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 CMyDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

BEGIN_EVENTSINK_MAP(CMyDlg, CDialog)
    //{{AFX_EVENTSINK_MAP(CMyDlg)
	ON_EVENT(CMyDlg, IDC_MSCOMM1, 1 /* OnComm */, OnComm, VTS_NONE)
	//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()

void CMyDlg::OnComm() 
{
	VARIANT variant_inp;
	COleSafeArray safearray_inp;
	LONG len,k;
	BYTE rxdata[1024];	//设置BYTE数组
	CString strtemp;
	CString tempraturedata;
	
	if (m_ctrlComm.GetCommEvent()==2)
	{	//事件值为2表示接收缓冲区内有字符
		variant_inp = m_ctrlComm.GetInput();	//读缓冲区
		safearray_inp = variant_inp;	//VARIANT型变量转换为ColeSafeArray型变量
		len = safearray_inp.GetOneDimSize();	//得到有效数据长度
		for (k=0; k<len; k++)
		{
			safearray_inp.GetElement(&k,rxdata+k);	//转换为BYTE型数组
		}
		double temperature;

		if ((rxdata[1] & 0x80)==0x80)
		{
			temperature = (-1) * rxdata[0]*0.0625 + (rxdata[1]&0x0F)*16;
		}
		else	//12位AD转换得到0.0625的分辨率
		{
			temperature = rxdata[0]*0.0625 + (rxdata[1]&0x0F)*16;
		}

		len = atoi(tempraturedata);
		CurTime = COleDateTime::GetCurrentTime();
		CString CsTime ;
		CsTime = CurTime.Format("%H:%M:%S");
		//m_ctrlChart.GetAxis().GetBottom().SetMaximum(gather_times);
		//m_ctrlChart.GetAxis().GetBottom().SetMinimum(gather_times-40);
		m_ctrlChart.Series(0).AddXY(gather_times,temperature,CsTime,gather_times);
		m_ctrlChart.Series(1).AddXY(gather_times,m_longHigh,"",gather_times);
		m_ctrlChart.Series(2).AddXY(gather_times,m_longLow,"",gather_times);
		m_ctrlChart.Series(3).AddXY(gather_times,0,"",gather_times);
				
		CString str_TempList;
		CsTime = CurTime.Format("%H时%M分%S秒");
		str_TempList.Format("%02d.   %s   %.4f℃", gather_times, CsTime, temperature);
		
		m_ctrlListResult.AddString(str_TempList);
		m_ctrlListResult.SetCurSel(m_ctrlListResult.GetCount()-1);
		
		gather_times++;
	}
}

void CMyDlg::OnButtonBegin() 
{
	if (m_ctrlComm.GetPortOpen())
	{
		m_ctrlComm.SetPortOpen(FALSE);
		GetDlgItem(IDC_BUTTON_BEGIN)->SetWindowText("开始采集");
	}
	else
	{
		m_ctrlComm.SetPortOpen(TRUE);
		GetDlgItem(IDC_BUTTON_BEGIN)->SetWindowText("停止采集");
	}
}

void CMyDlg::OnChangeComport() 
{
	if (m_ctrlComm.GetPortOpen())
	{
		m_ctrlComm.SetPortOpen(FALSE);	//串口已打开则关闭串口
		GetDlgItem(IDC_BUTTON_BEGIN)->SetWindowText("开始采集");
	}

	switch(m_ctrlComPort.GetCurSel())
	{
		case 0:	m_ctrlComm.SetCommPort(1);
				break;
		case 1:	m_ctrlComm.SetCommPort(2);
				break;
		case 2: m_ctrlComm.SetCommPort(3);
				break;
		default:
				break;
	}
	if (!m_ctrlComm.GetPortOpen())		//串口未打开则打开串口
	{
		m_ctrlComm.SetPortOpen(TRUE);
		GetDlgItem(IDC_BUTTON_BEGIN)->SetWindowText("停止采集");	
	}
}

void CMyDlg::OnTimer(UINT nIDEvent) 
{
	//定时时间到发送读温度指令
	if (m_ctrlComm.GetPortOpen())
	{
		CString command="1";
		m_ctrlComm.SetOutput((COleVariant)(command));
		CDialog::OnTimer(nIDEvent);
	}
}

void CMyDlg::OnChangeInterval() 
{
	UpdateData(TRUE);
	long time;
	CString temp;
	temp.Format("修改采集间隔: %d S", m_IntervalTime);
	m_ctrlListResult.AddString(temp);
	m_ctrlListResult.SetCurSel(m_ctrlListResult.GetCount()-1);
	time = m_IntervalTime*1000;
	SetTimer(1,time,NULL);
}

BOOL CMyDlg::DestroyWindow() 
{
	KillTimer(1);
	return CDialog::DestroyWindow();
}

void CMyDlg::OnSave() 
{
	//显示文件保存对话框
	CurTime = COleDateTime::GetCurrentTime();
	CString CsTime ;
	CsTime = "温度记录__" + CurTime.Format("%m月%d日%H时%M分%S秒") + ".txt";
	CFileDialog dlg(FALSE, "txt", CsTime,OFN_HIDEREADONLY  | OFN_OVERWRITEPROMPT,"Text Files & Bmp Files (*.txt *.bmp)|");
	if ( dlg.DoModal()!=IDOK )
		return;
	//获取文件的绝对路径
	CString sFileName=dlg.GetPathName();
	CString bmppath = sFileName + "温度记录__" + CurTime.Format("%m月%d日%H时%M分%S秒") + ".bmp";
	m_ctrlChart.GetExport().SaveToBitmapFile(bmppath);
	CStdioFile out;
	//打开文件
	out.Open(sFileName, CFile::modeCreate | CFile::modeWrite);
	//保存文件
	int nCount = m_ctrlListResult.GetCount();
	CString str;
	for (int i=0; i<nCount; i++)
	{
		m_ctrlListResult.GetText(i,str);
		str += '\n';
		out.WriteString(str);
	}
	//关闭文件
	out.Close();
}

void CMyDlg::OnButtonClear() 
{
	m_ctrlChart.Series(0).Clear();
	m_ctrlChart.Series(1).Clear();
	m_ctrlChart.Series(2).Clear();
	gather_times = 0;
	m_ctrlListResult.ResetContent();
	UpdateData(FALSE);
}

/***************改变串口波特率****************/
void CMyDlg::OnChangeComboBaud() 
{	
	UpdateData(TRUE);
	CString BaudSet;

	if (m_ctrlComm.GetPortOpen())
	{
		m_ctrlComm.SetPortOpen(FALSE);
		GetDlgItem(IDC_BUTTON_BEGIN)->SetWindowText("开始采集");
	}

	switch(m_ctrlBaud.GetCurSel())
	{
		case 0:	BaudSet = "4800,n,8,1";
				break;
		case 1:	BaudSet = "9600,n,8,1";
				break;
		case 2:	BaudSet = "19200,n,8,1";
				break;
		case 3:	BaudSet = "38400,n,8,1";
				break;
		default:
				break;
	}
	
	m_ctrlComm.SetSettings(BaudSet);
	if (!m_ctrlComm.GetPortOpen())
	{
		m_ctrlComm.SetPortOpen(TRUE);
		GetDlgItem(IDC_BUTTON_BEGIN)->SetWindowText("停止采集");
	}
}

void CMyDlg::OnSelchangeExact() 
{
	CString str_temp;
	switch (m_ctrlExact.GetCurSel())
	{
	case 0:	exact = 0x12;
			str_temp.Format("%c", exact);
			m_ctrlComm.SetOutput((COleVariant)str_temp);
			m_ctrlListResult.AddString("修改采集分辨率为0.0625℃");
			break;
	case 1:	exact = 0x11;
			str_temp.Format("%c", exact);
			m_ctrlComm.SetOutput((COleVariant)str_temp);
			m_ctrlListResult.AddString("修改采集分辨率为0.125℃");
			break;
	case 2:	exact = 0x10;
			str_temp.Format("%c", exact);
			m_ctrlComm.SetOutput((COleVariant)str_temp);
			m_ctrlListResult.AddString("修改采集分辨率为0.25℃");
			break;
	case 3:	exact = 0x09;
			str_temp.Format("%c", exact);
			m_ctrlComm.SetOutput((COleVariant)str_temp);
			m_ctrlListResult.AddString("修改采集分辨率为0.5℃");
			break;
	default:
			break;
	}
}

void CMyDlg::OnKillfocusEditHigh() 
{
	UpdateData(TRUE);
	if ((m_longHigh>=-55) && (m_longHigh<=125))
	{
		m_ctrlChart.Series(1).Clear();
		m_ctrlChart.Series(1).AddXY(0,m_longHigh,"",gather_times);
		m_ctrlChart.Series(1).AddXY(0,m_longHigh,"",0);
		m_ctrlChart.Series(1).AddXY(gather_times,m_longHigh,"",gather_times);
	}	
}

void CMyDlg::OnKillfocusEditLow() 
{
	UpdateData(TRUE);
	if ((m_longLow>=-55) && (m_longLow<=125))
	{
		m_ctrlChart.Series(2).Clear();
		m_ctrlChart.Series(2).AddXY(0,m_longLow,"",gather_times);
		m_ctrlChart.Series(2).AddXY(0,m_longLow,"",0);
		m_ctrlChart.Series(2).AddXY(gather_times,m_longLow,"",gather_times);
	}
}

⌨️ 快捷键说明

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