📄 温度采集dlg.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 + -