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

📄 maxoncomdlg.cpp

📁 使用RS232串口2
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	/************************************打开串口2*******************************/
	if(!m_mscomm2.GetPortOpen())
		m_mscomm2.SetPortOpen(TRUE);
	//else
	//	AfxMessageBox("Cannot Open Serial Port 2!");

	/****************************Programmed Position Mode************************/
	UpdateData(TRUE); //读取运动参数

	str0 = "s r0x24 0\r";            //Disable the amplifier.
	//"\r": Carriage return character 
	m_mscomm2.SetOutput(COleVariant(str0));
	Sleep(50);

	str1 = "s r0xc8 256\r";  //Value = 256, Relative move, trapezoidal profile 
	m_mscomm2.SetOutput(COleVariant(str1));                    			
	Sleep(50);
		
	m_dDistance = atof(m_sDistance);
	m_sDistance.Format("%.0f\r",m_dDistance);
	str2 = "s r0xca ";  //Relative move distance.
	strcpy(str_temp,str2);
	strcat(str_temp,m_sDistance);
	m_mscomm2.SetOutput(COleVariant(str_temp));
	Sleep(50);

	m_dVelocity = atof(m_sVelocity);
	m_sVelocity.Format("%.0f\r",m_dVelocity);
	str3 = "s r0xcb ";  //Trajectory maximum velocity.
	strcpy(str_temp,str3);
	strcat(str_temp,m_sVelocity);
	m_mscomm2.SetOutput(COleVariant(str_temp));
	Sleep(50);

	m_dAcceleration = atof(m_sAcceleration);
	m_sAcceleration.Format("%.0f\r",m_dAcceleration);
	str4 = "s r0xcc ";  //Trajectory maximum acceleration.
	strcpy(str_temp,str4);
	strcat(str_temp,m_sAcceleration);
	m_mscomm2.SetOutput(COleVariant(str_temp));
	Sleep(50);

	m_dDeceleration = atof(m_sDeceleration);
	m_sDeceleration.Format("%.0f\r",m_dDeceleration);
	str5 = "s r0xcd ";  //Trajectory maximum deceleration.
	strcpy(str_temp,str5);
	strcat(str_temp,m_sDeceleration);
	m_mscomm2.SetOutput(COleVariant(str_temp));
	Sleep(50);
}

void CMaxoncomDlg::OnBtnDisable()   //去使能
{
	KillTimer(1);
	m_sCurrent_Rt.Format("%d",0);
	m_sDeceleration_Rt.Format("%d",0);
	UpdateData(false);
	// TODO: Add your control notification handler code here
	/*************************************打开串口2******************************/
	if(!m_mscomm2.GetPortOpen())
		m_mscomm2.SetPortOpen(TRUE);
	//else
	//	AfxMessageBox("Cannot Open Serial Port 2!");
	/***********************************去使能放大器******************************/
	str10 = "s r0x24 0\r";            //t 0, abort a move in progress. 《ASCII_ProgrammersGuide》的第29/78页。
	m_mscomm2.SetOutput(COleVariant(str10));
	Sleep(100);
	/*************************************关闭串口2******************************/
	if(m_mscomm2.GetPortOpen())
		m_mscomm2.SetPortOpen(FALSE);		
}

BEGIN_EVENTSINK_MAP(CMaxoncomDlg, CDialog)
    //{{AFX_EVENTSINK_MAP(CMaxoncomDlg)
	ON_EVENT(CMaxoncomDlg, IDC_MSCOMM1, 1 /* OnComm */, OnOnCommMscomm1, VTS_NONE)
	ON_EVENT(CMaxoncomDlg, IDC_MSCOMM2, 1 /* OnComm */, OnOnCommMscomm2, VTS_NONE)
	//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()

void CMaxoncomDlg::OnOnCommMscomm1() 
{
	// TODO: Add your control notification handler code here
	
}

void CMaxoncomDlg::OnOnCommMscomm2() 
{
	// TODO: Add your control notification handler code here
	/********************************循环采集串口2数据*****************************/					
	VARIANT variant_inp;
	COleSafeArray safearray_inp;
	//LONG len,k;
	//BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
	if(m_mscomm2.GetCommEvent()==2)          //事件值为2表示接收缓冲区内有字符
	{
		variant_inp = m_mscomm2.GetInput();  //读缓冲区
		safearray_inp = variant_inp;         //VARIANT型变量转换为ColeSafeArray型变量
		len=safearray_inp.GetOneDimSize();   //得到有效数据长度
		for(k=0;k<len;k++)
			safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
	}
	strtemp0 = rxdata[0];
	strtemp1 = rxdata[1];
	strtemp2 = rxdata[2];
}

void CMaxoncomDlg::OnBtnStop() //“停止”按钮
{
	// TODO: Add your control notification handler code here
	/***********************************取消电机运动*****************************/
	str8 = "t 0\r";            //t 0, abort a move in progress. 《ASCII_ProgrammersGuide》的第29/78页。
	m_mscomm2.SetOutput(COleVariant(str8));
	Sleep(50);
	/**********************************去使能放大器******************************/
	str10 = "s r0x24 0\r";     //s r0x24 0: Disable the amplifier.
	m_mscomm2.SetOutput(COleVariant(str10));
	Sleep(50);
	KillTimer(1);  //关闭定时器1
	/***********************************关闭串口2********************************/
	if(m_mscomm2.GetPortOpen())
		m_mscomm2.SetPortOpen(FALSE);		
}

void CMaxoncomDlg::OnBtnStart() //“运转”按钮
{
	// TODO: Add your control notification handler code here
	KillTimer(1);
	/*************************************打开串口2******************************/
	if(!m_mscomm2.GetPortOpen())
		m_mscomm2.SetPortOpen(TRUE);
	//else
	//	AfxMessageBox("Cannot Open Serial Port 2!");
	/*************************************电机运转*******************************/
	str6 = "s r0x24 21\r";     //s r0x24 21: In servo mode, the position loop is driven by the trajectory generator.
	m_mscomm2.SetOutput(COleVariant(str6));
	Sleep(50);

	str6 = "t 1\r";           //t 1, initiate a move. 《ASCII_ProgrammersGuide》的第19/78页。
	m_mscomm2.SetOutput(COleVariant(str6));	
	Sleep(50);

	/**********************************采集串口2数据*****************************/									
	VARIANT variant_inp;
	COleSafeArray safearray_inp;
	//LONG len,k;
	//BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
	if(m_mscomm2.GetCommEvent()==2)          //事件值为2表示接收缓冲区内有字符
	{
		variant_inp = m_mscomm2.GetInput();  //读缓冲区
		safearray_inp = variant_inp;         //VARIANT型变量转换为ColeSafeArray型变量
		len=safearray_inp.GetOneDimSize();   //得到有效数据长度
		for(k=0;k<len;k++)
			safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
	}

	for(;;)
	{
		if((rxdata[0] == 111) & (rxdata[1] == 107))  //ok的ASCII码
			break;
	}
	Sleep(50);
	m_dDistance_Rt = 0;
	m_dCurrent_Rt = 0;
	SetTimer(1,100,NULL);
}

void CMaxoncomDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	if(positionorcurrent == TRUE) //检测距离
	{
		str0 = "g r0x32\r";   //Read actual position.
		m_mscomm2.SetOutput(COleVariant(str0));	
		//m_mscomm2.GetInput();
		//Sleep(50);
		for(;;)
		{
			if(rxdata[0] == 118)  //v的ASCII码是118。
			{
				if(m_dDistance > 0)
				{
					m_dDistance_Rt = m_dDistance_Rt + rxdata[2];  //正向运转时计算运动距离
				}
				else
				{
					m_dDistance_Rt = m_dDistance_Rt - rxdata[2];  //反向运转时计算运动距离
				}
				
				m_sDistance_Rt.Format("%.2f",m_dDistance_Rt);
				m_sCurrent_Rt.Format("%.2f",m_dCurrent_Rt/100);
				UpdateData(FALSE);
				
				//str0 = "g r0x18\r";  //速度
				//m_mscomm2.SetOutput(COleVariant(str0));	
				//Sleep(50);
				if(abs(m_dDistance_Rt) >= abs(m_dDistance))
				{
					KillTimer(1);  //关闭定时器1
					/***********************************取消电机运动******************************/
					str8 = "t 0\r";            //t 0, abort a move in progress. 《ASCII_ProgrammersGuide》的第29/78页。
					m_mscomm2.SetOutput(COleVariant(str8));
					//Sleep(50);
					/***********************************去使能放大器******************************/
					str10 = "s r0x24 0\r";     //s r0x24 0: Disable the amplifier.
					m_mscomm2.SetOutput(COleVariant(str10));
					//Sleep(50);
					
					//AfxMessageBox("m_dDistance_Rt >= m_dDistance");
					//KillTimer(1);
				}
			}
			positionorcurrent = FALSE;
			break;
		}
	}
	else //检测电流
	{
		str0 = "g r0x0c\r";   //Read actual current output from the amplifier.
		m_mscomm2.SetOutput(COleVariant(str0));	
		for(;;)
		{
			if(rxdata[0] == 118)  //v的ASCII码是118。
			{
				m_dCurrent_Rt = rxdata[2];
				m_sCurrent_Rt.Format("%.4f",m_dCurrent_Rt/100);
				UpdateData(FALSE);
				positionorcurrent = TRUE;
				break;
			}
			else if(abs(m_dDistance_Rt) >= abs(m_dDistance))
			{
				KillTimer(1);  //关闭定时器1
				/***********************************取消电机运动******************************/
				str8 = "t 0\r";            //t 0, abort a move in progress. 《ASCII_ProgrammersGuide》的第29/78页。
				m_mscomm2.SetOutput(COleVariant(str8));
				//Sleep(50);
				/***********************************去使能放大器******************************/
				str10 = "s r0x24 0\r";     //s r0x24 0: Disable the amplifier.
				m_mscomm2.SetOutput(COleVariant(str10));
				//Sleep(50);
			}
		}
	}
	CDialog::OnTimer(nIDEvent);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -