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

📄 coderdlg.cpp

📁 一个用于无刷直流电动机的驱动与控制程序.里面所用的采集卡的型号为MC08.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -