📄 powerdlg.cpp
字号:
// PowerDlg.cpp : implementation file
//
#include "stdafx.h"
#include "TestForm.h"
#include "PowerDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define point 2 //一次显示的点数
#define dividerate 0.9 //用于判断过度过程试验中输出转速落在设定范围内的比例
/////////////////////////////////////////////////////////////////////////////
// PowerDlg dialog
PowerDlg::PowerDlg(CWnd* pParent /*=NULL*/)
: CDialog(PowerDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(PowerDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_strPowerSettings = _T("9600,n,8,1");
m_nPowerPort = 2; //效率仪串口端口号为2
m_bPowerReceive = FALSE;
m_bPowerRTflag = TRUE; //第一次读
m_nPowerRTime = 0; //第一组读数据计数初始化为0
m_nTotalnumber = 0; //读取的数据总数为0
m_nNumber = point; //每组读取的数据个数为512
m_nRdNumber=0;//每组所读取数据的个数
m_nReadNumber=1;//记录读数次数,用于判断一定读数次内某个量的平均值变化范围
m_dReadDatatime_start=0.0;//效率仪开始一次读取数据任务的系统时间
m_dReadDatatime_end=0.0;//效率仪结束一次读取数据任务的系统时间
m_bReadDatatime_start=TRUE;//效率仪开始一次读取数据任务的系统时间标志
m_bReadDatatime_end=TRUE;//效率仪结束一次读取数据任务的系统时间标志
m_bResepOn=FALSE;//进行过度过程试验
m_bOutputRate_timef=TRUE;//读取过度过程试验中输出转速上升起点系统时间标志
m_bOutputRate_timet=TRUE;//读取过度过程试验中输出转速上升终点系统时间标志
m_bOutputRate_timep=TRUE;//读取过度过程试验中输出转速峰值时的系统时间标志
m_bOutputRate_times=TRUE;//读取过度过程试验中输出转速稳定起点的系统时间标志
m_dOutputRate_set=0.0;//用于存放过度过程试验中输出转速的设定值
m_dOutputRate_ratef=0.0;//用于存放过度过程试验中输出转速的上升起点
m_dOutputRate_ratet=1.0;//用于存放过度过程试验中输出转速的上升终点
m_dOutputRate_stable=0.10;//用于存放过度过程试验中输出转速的稳定范围
m_nOutputRate_redn=1;//用于存放过度过程试验中输出转速的读数次数,
//用于判断一定读数次内其平均值变化范围
m_nOutputRate_addn=0;//在过度过程试验中,达到稳定值之后还需要读取数据的次数
}
void PowerDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(PowerDlg)
DDX_Control(pDX, IDC_LIPOWER_RDATA, m_cPowerRdata);
DDX_Control(pDX, IDC_POWER_MSCOMM, m_cPowerCom);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(PowerDlg, CDialog)
//{{AFX_MSG_MAP(PowerDlg)
ON_BN_CLICKED(IDC_BUPOWER_SET, OnBupowerSet)
ON_BN_CLICKED(IDC_BUPOWER_RECEIVE, OnBupowerReceive)
ON_BN_CLICKED(IDC_BUPOWER_STOP, OnBupowerStop)
ON_BN_CLICKED(IDC_BUPOWER_SAVE, OnBupowerSave)
ON_BN_CLICKED(IDC_BUPOWER_CLEAR, OnBupowerClear)
//手动添加,点击效率试验主控窗口开始按钮消息响应函数
ON_MESSAGE(WM_MOTDLGPORSTART_HIT,OnMotpowstarthit)
//手动添加,点击超载试验主控窗口开始按钮消息响应函数
ON_MESSAGE(WM_MOTDLGOVERSTART_HIT,OnMotoverstarthit)
//手动添加,点击过度过程试验主控窗口开始按钮消息响应函数
ON_MESSAGE(WM_MOTDLGRESPSTART_HIT,OnMotrespstarthit)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// PowerDlg message handlers
BEGIN_EVENTSINK_MAP(PowerDlg, CDialog)
//{{AFX_EVENTSINK_MAP(PowerDlg)
ON_EVENT(PowerDlg, IDC_POWER_MSCOMM, 1 /* OnComm */, OnOnCommPowerMscomm, VTS_NONE)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
////////////////////////////////////////////
BOOL PowerDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
CRect rect;
GetClientRect(&rect);
if (m_cPowerRdata.GetSafeHwnd())
m_cPowerRdata.SetWindowPos(NULL,rect.left,rect.top,344,
50,SWP_NOMOVE);
m_cPowerRdata.InsertColumn(0, "输出扭矩", LVCFMT_LEFT,85);
m_cPowerRdata.InsertColumn(1, "输出转速", LVCFMT_LEFT,85);
m_cPowerRdata.InsertColumn(2, "输入扭矩", LVCFMT_LEFT,85);
m_cPowerRdata.InsertColumn(3, "输入转速", LVCFMT_LEFT,85);
//串口设置
powsetDlg.m_nEncodsetPort = 2; //效率仪串口端口号设置为2
powsetDlg.m_nEncodsetBaud = 3; //效率仪串口波特率设置为9600
powsetDlg.m_nEncodsetData = 3; //效率仪串口数据位设置为8
powsetDlg.m_nEncodsetStop = 0; //效率仪串口停止位设置为1
powsetDlg.m_nEncodsetChek = 2; //效率仪串口校验位设置为无校验
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
// 打开串口
void PowerDlg::PowerOpenport()
{
//判断串口是否已打开,并将其关闭
if (m_cPowerCom.GetPortOpen())
m_cPowerCom.SetPortOpen(false);
//选择串口m_cPtestCom
m_cPowerCom.SetCommPort(m_nPowerPort);
if(!m_cPowerCom.GetPortOpen())
m_cPowerCom.SetPortOpen(TRUE);
else
AfxMessageBox("Can not open com port");
//设置串口属性
m_cPowerCom.SetSettings(m_strPowerSettings); //波特率9600,无校验,8个数据位,1个停止位
//参数36表示每当串口接收缓冲区中有多于或等于36个字符时将引发
//一个接收数据的OnComm事件
m_cPowerCom.SetRThreshold(35);
//读取数据的类型为二进制
m_cPowerCom.SetInputMode(1);
//“0”表示读取整个缓冲区内的数据
m_cPowerCom.SetInputLen(0);
//先预读缓冲区以清除残留数据
m_cPowerCom.GetInput();
}
//串口设置并打开串口
void PowerDlg::OnBupowerSet()
{
// TODO: Add your control notification handler code here
CString str = _T(",");
if (powsetDlg.DoModal() == IDOK)
{
//获取设置对话框的串口号
m_nPowerPort = powsetDlg.m_nEncodsetPort;
//获取并拼接设置对话框中的属性设置
m_strPowerSettings=powsetDlg.m_strEncodsetBaud+str+powsetDlg.m_strEncodsetChek+
str+powsetDlg.m_strEncodsetData+str+powsetDlg.m_strEncodsetStop;
}
PowerOpenport();
}
//开始接收串口数据
void PowerDlg::OnBupowerReceive()
{
// TODO: Add your control notification handler code here
m_bPowerReceive =TRUE;
/*///----------测试----------////
CTestFormApp *pApp=(CTestFormApp *)AfxGetApp();
pApp->pCTestFormDoc->nPowerNumber = m_nTotalnumber;
//pApp->pCTestFormDoc->pPowerInRate[0] =0;
*////----------测试----------////
//发送消息
//pApp->pCTestFormView->powerDrawDlg.SendMessage(WM_POWERDAQ_FINISH,0,0);
//pApp->pCTestFormView->respDrawDlg.SendMessage(WM_POWERDAQ_FINISH,0,0);
/*//////////////////---测试---///////////////////////
m_cPowerRdata.DeleteAllItems();
//将输出扭矩显示在列表控制框中
m_cPowerRdata.InsertItem(LVIF_TEXT|LVIF_STATE,
0, //要插入条目的索引号
"4.8", //第一栏要插入的字符串
LVIS_SELECTED|LVIS_FOCUSED,
LVIS_SELECTED|LVIS_FOCUSED,
0,
0);
// m_cPowerRdata.SetItemText(0,0,"12345678");
//将输出转速显示在列表控制框中
m_cPowerRdata.SetItemText(0,1,"7");//条目的索引号,
//第几栏(从0开始),要设置的字符串
//将输入扭矩显示在列表控制框中
m_cPowerRdata.SetItemText(0,2,"0.03");
//将输入转速显示在列表控制框中
m_cPowerRdata.SetItemText(0,3,"1200");
*///////////////////---测试---///////////////////////
}
//停止接收
void PowerDlg::OnBupowerStop()
{
// TODO: Add your control notification handler code here
if (m_bPowerReceive == TRUE) //如果串口是接收数据的状态
m_bPowerReceive = FALSE;
}
//保存数据
void PowerDlg::OnBupowerSave()
{
// TODO: Add your control notification handler code here
CTestFormApp *pApp=(CTestFormApp *)AfxGetApp();
double inrate,outrate;
double intorque,outtorque;
double powerdata;
CString filename;
CFileDialog m_FileSaveDialog(FALSE,
"xls|txt",
NULL,
OFN_HIDEREADONLY,
"(*.xls)|*.xls|(*.txt)|*.txt||",
this);
if (m_FileSaveDialog.DoModal() == IDOK)
{
filename = m_FileSaveDialog.GetFileName();
FILE *fp;
fp=fopen(filename,"w");
fprintf(fp,"输入转速\t输出转速\t输入转矩\t输出转矩\t效率\t\n");
for(int i=0;i<m_nRdNumber;i++)
//for(int j=0;j<28;j++)
{
inrate=pApp->pCTestFormDoc->pPowerInRate[i];
outrate=pApp->pCTestFormDoc->pPowerOutRate[i];
intorque=pApp->pCTestFormDoc->pPowerInTorque[i];
outtorque=pApp->pCTestFormDoc->pPowerOutTorque[i];
powerdata=pApp->pCTestFormDoc->pPowerData[i];
fprintf(fp,"%5.2f\t%5.2f\t%5.2f\t%5.2f\t%5.2f\t\n",inrate,outrate,intorque,outtorque,powerdata);
}
fclose(fp);
}
}
//清除效率仪主控串口中数据显示框内的数据
void PowerDlg::OnBupowerClear()
{
// TODO: Add your control notification handler code here
m_cPowerRdata.DeleteAllItems();
}
//串口事件响应函数
void PowerDlg::OnOnCommPowerMscomm()
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
long len,len1,k;
CString str;
CString inputRate,outputRate;
CString inputTorque,outputTorque;
double dinputRate,doutputRate;
double dinputTorque,dinputTorque1,dinputTorque2,doutputTorque;
double dpower;//效率值
char data2[2048];
char data3[2048];
CString strtemp;
CTestFormApp *pApp=(CTestFormApp *)AfxGetApp();
int hitnumber = pApp->m_nHitNumber;
if(m_bPowerReceive)
{
if(m_cPowerCom.GetCommEvent()==2)//事件值为2表示接收缓冲区内大于或等于
//SetRThreshold()所设定的字符
len1=m_cPowerCom.GetInBufferCount();
if(len1>35)
{
//if(m_bPowerRTflag) //第一次读
//{
m_nPowerRTime ++; //计数器加1
variant_inp = m_cPowerCom.GetInput(); //读缓冲区
//数据转换
safearray_inp = variant_inp;
//获得读取数据的个数
len = safearray_inp.GetOneDimSize();
//转换为BYTE型数组
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,data2+k);
//转换为Cstring型数组
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -