?? 溫度采集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_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);
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 + -