📄 coderdlg.cpp
字号:
// CoderDlg.cpp : implementation file
//
#include "stdafx.h"
#include "TestForm.h"
#include "CoderDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define MINIDATA 0.0005 //以度为单位的2秒的大小
/////////////////////////////////////////////////////////////////////////////
// CCoderDlg dialog
CCoderDlg::CCoderDlg(CWnd* pParent /*=NULL*/)
: CDialog(CCoderDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CCoderDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
/*整型变量初始化*/
m_nCoderRdTotaln=0; //编码器读取的数据个数初始化为0
m_nCoderRdOnen=0; //编码器读取的数据个数,记录单次读数个数初始化为0
m_nCoderRdn=0; //编码器每组读取的数据个数,用于判断一次数据的读取是否完成,初始化为0
m_nCoderRTime=0; //读取用于控制显示的数据次数初始化为0
m_nCoderPort= 1; //编码器端口初始化为1号端口
/*布尔变量初始化*/
m_bCoderRTflag=FALSE; //编码器交替读数标志初始化为FALSE
m_bCoderReceive=FALSE; //编码器接收状态标志初始化为停止接收状态
m_bCoderSetflag=FALSE; //编码器设置状态标志初始化为未设置状态
/*字符串变量初始化*/
m_strCoderSettings=_T("4800,n,8,1"); //编码器串口设置变量初始化
/*指针变量初始化*/
for (int i=0;i<1024;i++)
{
m_pCoderData[i]=0; //存放编码器每组读取的数据
m_pCoderDataposi[i]=0; //存放编码器每组读取数据的位置
}
/*刚度及回差试验变量初始化*/
m_bCoderRigon=FALSE; //未进行刚度及回差试验
m_bCoderRigload=FALSE; //未点击了加载按钮
m_bCoderRigcload=FALSE; //未点击了取消加载按钮
m_bCoderRigunload=FALSE; //未点击了卸载按钮
m_bCoderRigcunload=FALSE; //未点击了取消卸载按钮
m_bCoderRigFirstRD=TRUE; //刚度及回差试验读取第一个起始数据
m_nCoderRigSmtime=0; //编码器给刚度及回差主空窗口发送消息的次数
//串口设置
setDlg.m_nEncodsetPort = 1; //编码器端口号设置为1
setDlg.m_nEncodsetBaud = 2; //编码器波特率设置为4800
setDlg.m_nEncodsetData = 3; //编码器数据位设置为8
setDlg.m_nEncodsetStop = 0; //编码器停止位设置为1
setDlg.m_nEncodsetChek = 2; //编码器校验位设置为无校验
}
void CCoderDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CCoderDlg)
DDX_Control(pDX, IDC_LICODER_RDATA, m_cCoderRdata);
DDX_Control(pDX, IDC_CODER_MSCOMM, m_cCoderCom);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CCoderDlg, CDialog)
//{{AFX_MSG_MAP(CCoderDlg)
ON_BN_CLICKED(IDC_BUCODER_SET, OnBucoderSet)
ON_BN_CLICKED(IDC_BUCODER_RECEIVE, OnBucoderReceive)
ON_BN_CLICKED(IDC_BUCODER_STOPR, OnBucoderStopr)
ON_BN_CLICKED(IDC_BUCODER_SAVED, OnBucoderSaved)
ON_BN_CLICKED(IDC_BUCODER_CLEARD, OnBucoderCleard)
//手动添加,点击传动精度试验主控窗口开始按钮消息响应函数
ON_MESSAGE(WM_MOTDLGPRVSTART_HIT,OnMotprvstarthit)
//手动添加,点击启动力矩试验主控窗口开始按钮消息响应函数
ON_MESSAGE(WM_MOTDLGSTARTSTART_HIT,OnMotstartstarthit)
//手动添加,点击刚度及回差试验主控窗口开始按钮消息响应函数
ON_MESSAGE(WM_MOTDLGRIGSTART_HIT,OnMotrigstarthit)
//手动添加,点击刚度及回差试验主控窗口加载按钮消息响应函数
ON_MESSAGE(WM_MOTDLGRIGLOAD_HIT,OnMotrigloadhit)
//手动添加,点击刚度及回差试验主控窗口取消加载按钮消息响应函数
ON_MESSAGE(WM_MOTDLGRIGCLOAD_HIT,OnMotrigcloadhit)
//手动添加,点击刚度及回差试验主控窗口卸载按钮消息响应函数
ON_MESSAGE(WM_MOTDLGRIGUNLOAD_HIT,OnMotrigcunloadhit)
//手动添加,点击刚度及回差试验主控窗口取消卸载按钮消息响应函数
ON_MESSAGE(WM_MOTDLGRIGCUNLOAD_HIT,OnMotrigcunloadhit)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCoderDlg message handlers
BEGIN_EVENTSINK_MAP(CCoderDlg, CDialog)
//{{AFX_EVENTSINK_MAP(CCoderDlg)
ON_EVENT(CCoderDlg, IDC_CODER_MSCOMM, 1 /* OnComm */, OnOnCommCoderMscomm, VTS_NONE)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
////////////////////////////////////////////
BOOL CCoderDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
CRect rect;
GetClientRect(&rect);
//设置光电编码器数据显示框
if (m_cCoderRdata.GetSafeHwnd())
m_cCoderRdata.SetWindowPos(NULL,rect.left,rect.top,334,
50,SWP_NOMOVE);
m_cCoderRdata.InsertColumn(0, "原始数值", LVCFMT_LEFT,165);
m_cCoderRdata.InsertColumn(1, "转换后的数值(度)", LVCFMT_LEFT,165);
//串口设置
setDlg.m_nEncodsetPort = 1; //编码器端口号设置为1
setDlg.m_nEncodsetBaud = 2; //编码器波特率设置为4800
setDlg.m_nEncodsetData = 3; //编码器数据位设置为8
setDlg.m_nEncodsetStop = 0; //编码器停止位设置为1
setDlg.m_nEncodsetChek = 2; //编码器校验位设置为无校验
// CString str;
// for(int i=0;i<1;i++)
// {
// str.Format("%d",i+1);
// m_cCoderRdata.InsertItem(LVIF_TEXT|LVIF_STATE,
// i, //要插入条目的索引号
// str, //第一栏要插入的字符串
// LVIS_SELECTED|LVIS_FOCUSED,
// LVIS_SELECTED|LVIS_FOCUSED,
// 0,
// 0);
// m_cCoderRdata.SetItemText(i,1,"张三");//条目的索引号,第几栏(从0开始),要设置的字符串
//
// }
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
//打开串口
void CCoderDlg::CoderOpenport()
{
if (!m_bCoderSetflag)
{
//选择串口m_cCoderCom
m_cCoderCom.SetCommPort(m_nCoderPort);
if(!m_cCoderCom.GetPortOpen())
m_cCoderCom.SetPortOpen(TRUE);
else
AfxMessageBox("Can not open com port");
//设置串口属性
m_cCoderCom.SetSettings(m_strCoderSettings);//波特率4800,无校验,8个数据,1个停止位
//m_cCoderCom.SetSettings("4800,n,8,1");
//MessageBox(m_strCoderSettings);
//参数26表示每当串口接收缓冲区中有多于或等于26个字符时将引发
//一个接收数据的OnComm事件,26个字符中,肯定包含了一个完整的数据
m_cCoderCom.SetRThreshold(26);
//读取数据的类型为二进制
m_cCoderCom.SetInputMode(1);
//读取当前整个接收区的数据
m_cCoderCom.SetInputLen(0);
//先预读缓冲区以清除残留数据
m_cCoderCom.GetInput();
//串口处于设置状态
m_bCoderSetflag =TRUE;
}
}
//串口设置并打开
void CCoderDlg::OnBucoderSet()
{
// TODO: Add your control notification handler code here
CString str = _T(",");
if (setDlg.DoModal() == IDOK)
{
//获取设置对话框的串口号
m_nCoderPort = setDlg.m_nEncodsetPort;
//获取设置对话框的串口设置字符串
m_strCoderSettings=setDlg.m_strEncodsetBaud+str+setDlg.m_strEncodsetChek+str
+setDlg.m_strEncodsetData+str+setDlg.m_strEncodsetStop;
// MessageBox(m_strEncoderSettings);
}
//打开串口
CoderOpenport();
//m_bEncoderOpenflag = TRUE;
}
//开始接收串口数据
void CCoderDlg::OnBucoderReceive()
{
// TODO: Add your control notification handler code here
m_bCoderReceive = TRUE;
/*////////////////---测试---////////////////////////
m_cCoderRdata.DeleteAllItems();
m_cCoderRdata.InsertItem(LVIF_TEXT|LVIF_STATE,
0, //要插入条目的索引号
"$D-267.50.03.0", //第一栏要插入的字符串
LVIS_SELECTED|LVIS_FOCUSED,
LVIS_SELECTED|LVIS_FOCUSED,
0,
0);
m_cCoderRdata.SetItemText(0,1,"-267.867496666");
/*////////////////////////////////////////////
}
//停止接收串口数据
void CCoderDlg::OnBucoderStopr()
{
// TODO: Add your control notification handler code here
if (m_bCoderReceive == TRUE) //如果串口是接收数据的状态
m_bCoderReceive = FALSE;
}
//保存数据
void CCoderDlg::OnBucoderSaved()
{
// TODO: Add your control notification handler code here
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");
for(int i=0;i<4;i++)
for(int j=0;j<28;j++)
{
fprintf(fp,"%d\t%lf\t%lf\t\n",i,j,j+1);
}
fclose(fp);
}
}
//清除编码器主控窗口中数据显示框内数据
void CCoderDlg::OnBucoderCleard()
{
// TODO: Add your control notification handler code here
m_cCoderRdata.DeleteAllItems();
}
//串口事件响应函数
void CCoderDlg::OnOnCommCoderMscomm()
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
long len,k,j;
char *data, *data1;
char data2[1024];
//存放读取字符串起始位置、有效字符串长度变量
long m_lStrStartpos, m_lStarttoEnd;
//存放度、分、秒及最后一位的字符串变量
CString strSignflag,strAngle,strCent, strSecond,strLast;
//存放一组原始、转换后字符串变量
CString m_strReceive,m_strTurn;
//存放符号、度、分、秒及最后一位的数值变量
double dSignflag,dAngle,dCent, dSecond,dLast;
//存放第一、二次读取数据的数值变量
double dFirstdata,dSeconddata;
CTestFormApp *pApp=(CTestFormApp *)AfxGetApp();
int hitnumber = pApp->m_nHitNumber;//树型控件点击号
if(m_bCoderReceive)
{
if(m_cCoderCom.GetCommEvent()==2)//事件值为2表示接收缓冲区内大于或等于
//SetRThreshold()所设定的字符
len=m_cCoderCom.GetInBufferCount();
if(len>26)
{
if(m_bCoderRTflag) // 第一次读数
{
m_nCoderRTime++; //读数计数加1
variant_inp = m_cCoderCom.GetInput(); //读缓冲区
data=(char*)(unsigned char*)variant_inp.parray->pvData;
k=0;
data1=data;
while(k<len)
{
data2[k]= * data1;
k++;
data1++;
}
//查找已读取字符串中的起始字符
for (k=0;k<len;k++)
{
if(data2[k]=='$')
{
m_lStrStartpos=k;
m_lStarttoEnd=len-k;
if (m_lStarttoEnd>12)
{
if((data2[m_lStrStartpos+13]>='0') //判断最后一位是不是数字
&&(data2[m_lStrStartpos+13]<='9'))
{
for(j=0;j<14;j++)
m_strReceive +=data2[m_lStrStartpos+j];
m_strReceive +='\0';
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -