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

📄 +

📁 Visual C++串口通信开发入门与编程实践
💻
字号:
//Operation.cpp:implementation file
#include "stdafx.h"
#include "TEST.h"
#include "Operation.h"
#include "motocom.h"
#include "PMovj.h"
#include "Message.h"
#ifdef _DEBUG
  #define new DEBUG_NEW
  #undef THIS_FILE
  static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//COperation dialog
COperation::COperation(CWnd *pParent /*=NULL*/): CDialog(COperation::IDD,
  pParent)
{
  //{{AFX_DATA_INIT(COperation)
  m_nSpeed = 0.0;
  m_nStepPulse = 0.0;
  m_nCodeOpt =  - 1;
  m_bSmooth = FALSE;
  m_nPulseS1 = 0.0;
  m_nPulseB1 = 0.0;
  m_nPulseS = 0.0;
  m_nPulseB = 0.0;
  m_nPulseL = 0.0;
  m_nPulseR = 0.0;
  m_nPulseT = 0.0;
  m_nPulseU = 0.0;
  m_nPulseL1 = 0.0;
  m_nPulseR1 = 0.0;
  m_nPulseT1 = 0.0;
  m_nPulseU1 = 0.0;
  m_nSelPulse =  - 1;
  //}}AFX_DATA_INIT
}

void COperation::DoDataExchange(CDataExchange *pDX)
{
  CDialog::DoDataExchange(pDX);
  //{{AFX_DATA_MAP(COperation)
  DDX_Control(pDX, IDC_StepPulse, m_nStepCtrl);
  DDX_Control(pDX, IDC_BUTTON_U2, m_nButtonU2);
  DDX_Control(pDX, IDC_BUTTON_U1, m_nButtonU1);
  DDX_Control(pDX, IDC_BUTTON_T2, m_nButtonT2);
  DDX_Control(pDX, IDC_BUTTON_T1, m_nButtonT1);
  DDX_Control(pDX, IDC_BUTTON_S2, m_nButtonS2);
  DDX_Control(pDX, IDC_BUTTON_S1, m_nButtonS1);
  DDX_Control(pDX, IDC_BUTTON_R2, m_nButtonR2);
  DDX_Control(pDX, IDC_BUTTON_R1, m_nButtonR1);
  DDX_Control(pDX, IDC_BUTTON_L2, m_nButtonL2);
  DDX_Control(pDX, IDC_BUTTON_L1, m_nButtonL1);
  DDX_Control(pDX, IDC_BUTTON_B2, m_nButtonB2);
  DDX_Control(pDX, IDC_BUTTON_B1, m_nButtonB1);
  DDX_Control(pDX, IDC_CodeOptClear, m_nCodeOptClear);
  DDX_Control(pDX, IDCANCEL, m_nCancel);
  DDX_Control(pDX, IDC_SETPOS, m_nSetPos);
  DDX_Control(pDX, IDC_CodeOpt, m_nCodeOptCtrl);
  DDX_Text(pDX, IDC_SPEED, m_nSpeed);
  DDX_Text(pDX, IDC_StepPulse, m_nStepPulse);
  DDX_Text(pDX, IDC_CodeOpt, m_nCodeOpt);
  DDX_Text(pDX, IDC_PulseS1, m_nPulseS1);
  DDX_Text(pDX, IDC_PulseB1, m_nPulseB1);
  DDX_Text(pDX, IDC_nPulseS, m_nPulseS);
  DDX_Text(pDX, IDC_nPulseB, m_nPulseB);
  DDX_Text(pDX, IDC_nPulseL, m_nPulseL);
  DDX_Text(pDX, IDC_nPulseR, m_nPulseR);
  DDX_Text(pDX, IDC_nPulseT, m_nPulseT);
  DDX_Text(pDX, IDC_nPulseU, m_nPulseU);
  DDX_Text(pDX, IDC_PulseL1, m_nPulseL1);
  DDX_Text(pDX, IDC_PulseR1, m_nPulseR1);
  DDX_Text(pDX, IDC_PulseT1, m_nPulseT1);
  DDX_Text(pDX, IDC_PulseU1, m_nPulseU1);
  DDX_Radio(pDX, IDC_nSelPulse, m_nSelPulse);
  //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(COperation, CDialog)
//{{AFX_MSG_MAP(COperation)
ON_BN_CLICKED(IDC_BUTTON_S1, OnButtonS1)ON_BN_CLICKED(IDC_BUTTON_S2, OnButtonS2)
  ON_BN_CLICKED(IDC_BUTTON_B1, OnButtonB1)ON_BN_CLICKED(IDC_BUTTON_B2,
  OnButtonB2)ON_BN_CLICKED(IDC_BUTTON_L1, OnButtonL1)ON_BN_CLICKED
  (IDC_BUTTON_L2, OnButtonL2)ON_BN_CLICKED(IDC_BUTTON_R1, OnButtonR1)
  ON_BN_CLICKED(IDC_BUTTON_R2, OnButtonR2)ON_BN_CLICKED(IDC_BUTTON_T1,
  OnButtonT1)ON_BN_CLICKED(IDC_BUTTON_T2, OnButtonT2)ON_BN_CLICKED
  (IDC_BUTTON_U1, OnButtonU1)ON_BN_CLICKED(IDC_BUTTON_U2, OnButtonU2)
  ON_BN_CLICKED(IDC_CodeOptClear, OnCodeOptClear)ON_BN_CLICKED(IDC_SETPOS,
  OnSetpos)ON_BN_CLICKED(IDC_nSelAngle, OnSelAngle)ON_BN_CLICKED(IDC_nSelPulse,
  OnSelPulse)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//COperation message handlers
BOOL COperation::OperateS(double pulse)
{
  UpdateData(TRUE);
  p[0] = pulse; //给S轴赋予,其他轴归0;
  p[1] = 0;
  p[2] = 0;
  p[3] = 0;
  p[4] = 0;
  p[5] = 0;
  p[6] = 0;
  p[7] = 0;
  p[8] = 0;
  p[9] = 0;
  p[10] = 0;
  p[11] = 0;
  ToolNo = 0;
  Velocity = m_nSpeed;
  rc = BscPMovj(dlg.Handle, Velocity, ToolNo, p);
  return TRUE;
}

double COperation::OnButtonS1() //S轴正向运行
{
  //TODO:Add your control notification handler code here
  UpdateData(TRUE);
  OnSelect();
  if ((refs *(*PULSES + m_nStepPulse)) <= 264460)
  //判断是否超出运动极限
  {
    dlg.OnOpenCom();
    OperateS(refs *(*PULSES + m_nStepPulse));
    if (rc == 0)
    {
      OnSetposS1(); //显示进度条
      *PULSES = (*PULSES + m_nStepPulse); //显示脉冲数
      m_nCodeOptCtrl.Clear();
      m_nCodeOpt = rc;
      UpdateData(FALSE);
    }
    else
    {
      OnSetposS1();
      *PULSES = (*PULSES + m_nStepPulse);
      m_nCodeOptCtrl.Clear();
      m_nCodeOpt = rc;
      UpdateData(FALSE);
      AfxMessageBox("S1 failed!");
    }
    dlg.CloseCom(); //释放通信句柄;
  }
  else
  //超出极限,要求重新输入;
  {
    AfxMessageBox("所输入的值已超过允许范围,请重新输入!");
  }
  return  *PULSES;
}

double COperation::OnButtonS2() //S轴反向运行;
{
  //TODO:Add your control notification handler code here
  UpdateData(TRUE);
  OnSelect();
  if ((refs *(*PULSES - m_nStepPulse)) >=  - 264460)
  //判断是否超出运动极限;
  {
    dlg.OnOpenCom();
    OperateS(refs *(*PULSES - m_nStepPulse));
    if (rc == 0)
    {
      OnSetposS2();
      *PULSES = (*PULSES - m_nStepPulse);
      m_nCodeOptCtrl.Clear();
      m_nCodeOpt = rc;
      UpdateData(FALSE);
    }
    else
    {
      OnSetposS2();
      *PULSES = (*PULSES - m_nStepPulse);
      m_nCodeOptCtrl.Clear();
      m_nCodeOpt = rc;
      UpdateData(FALSE);
      AfxMessageBox("S2 failed!");
    }
    dlg.CloseCom();
  }
  else
  {
    AfxMessageBox("所输入的值已超过允许范围,请重新输入!");
  }
  return  *PULSES;
}

void COperation::OnCancel()
{
  //TODO:Add extra cleanup here
  CDialog::OnCancel();
}

void COperation::OnCodeOptClear()
{
  //TODO:Add your control notification handler code here
  m_nCodeOpt =  - 1;
  UpdateData(FALSE);
}

BOOL COperation::OnInitDialog() //单步操作(Coperation)类的初始化
{
  CDialog::OnInitDialog();
  //TODO:Add extra initialization here
  GetDlgItem(IDC_STATIC_PULSE)->ShowWindow(SW_SHOW);
  GetDlgItem(IDC_STATIC_ANGLE)->ShowWindow(SW_HIDE);
  refs = 1;
  refl = 1;
  refu = 1;
  refr = 1;
  refb = 1;
  reft = 1;
  PULSES = &m_nPulseS;
  PULSEB = &m_nPulseB;
  PULSER = &m_nPulseR;
  PULSEU = &m_nPulseU;
  PULSET = &m_nPulseT;
  PULSEL = &m_nPulseL;
  m_uiRangeFrom = 0;
  m_uiRangeToS = 264460; //15557个脉冲等于10度S轴
  m_uiRangeToL = 208320; //13444个脉冲等于10度L轴
  m_uiRangeToU = 255400; //13444个脉冲等于10度U轴
  m_uiRangeToR = 159980; //8888个脉冲等于10度R轴
  m_uiRangeToB = 181800; //8080个脉冲等于10度B轴
  m_uiRangeToT = 149500; //4155个脉冲等于10度T轴
  CWnd *pWnd = GetDlgItem(IDC_PROG_S1);
  CRect rcs1;
  pWnd->GetWindowRect(&rcs1);
  ScreenToClient(rcs1);
  m_Progress1.Create(WS_BORDER | WS_VISIBLE | WS_CHILD | PBS_SMOOTH, rcs1, this,
    IDC_PROGR ESS1);
  m_Progress1.SetRange(0, 20000);
  return TRUE; //return TRUE unless you set the focus to a control
  //EXCEPTION:OCX Property Pages should return FALSE
}

void COperation::OnSetpos()
{
  //TODO:Add your control notification handler code here
  dlg.OnOpenCom(); //回到初始位置;
  OperateS(0);
  m_Progress1.SetPos(0);
  m_Progressb1.SetPos(0);
  m_Progressl1.SetPos(0);
  m_Progressr1.SetPos(0);
  m_Progressu1.SetPos(0);
  m_Progresst1.SetPos(0);
  m_nPulseS1 = 0;
  m_nPulseB1 = 0;
  m_nPulseR1 = 0;
  m_nPulseU1 = 0;
  m_nPulseT1 = 0;
  m_nPulseL1 = 0;
  *PULSES = 0;
  *PULSEL = 0;
  *PULSEU = 0; //指针回零;
  *PULSER = 0;
  *PULSEB = 0;
  *PULSET = 0;
  dlg.CloseCom();
  UpdateData(FALSE);
}

void COperation::OnSetposS1()
{
  if ((*PULSES + m_nStepPulse) >= 0)
  //判断脉冲,显示彩色进度条;
  {
    m_uiPos = (int)(20000 *refs *(*PULSES + m_nStepPulse) / 264460);
  }
  else
  {
    m_uiPos =  - (int)(20000 *refs *(*PULSES + m_nStepPulse) / 264460);
  }
  m_Progress1.SetPos(m_uiPos);
  m_nPulseS1 = (refs *(*PULSES + m_nStepPulse));
  UpdateData(FALSE);
}

void COperation::OnSetposS2()
{
  if ((*PULSES - m_nStepPulse) >= 0)
  {
    m_uiPos = (int)(20000 *refs *(*PULSES - m_nStepPulse) / 264460);
  }
  else
  {
    m_uiPos =  - (int)(20000 *refs *(*PULSES - m_nStepPulse) / 264460);
  }
  m_Progress1.SetPos(m_uiPos);
  m_nPulseS1 = (refs *(*PULSES - m_nStepPulse));
  UpdateData(FALSE);
}

void COperation::OnSelect() //选择脉冲或角度模式
{
  switch (m_nSelPulse)
  {
    case 1:
      OnSelPulse();
    case 2:
      OnSelAngle();
    default:
      break;
  } //switch
}

void COperation::OnSelAngle() //初始化角度模式
{
  //TODO:Add your control notification handler code here
  GetDlgItem(IDC_STATIC_PULSE)->ShowWindow(SW_HIDE);
  GetDlgItem(IDC_STATIC_ANGLE)->ShowWindow(SW_SHOW);
  refs = 1555;
  refl = 1344;
  refu = 1344;
  refr = 888;
  refb = 808;
  reft = 415;
}

void COperation::OnSelPulse() //初始化脉冲模式
{
  //TODO:Add your control notification handler code here
  GetDlgItem(IDC_STATIC_PULSE)->ShowWindow(SW_SHOW);
  GetDlgItem(IDC_STATIC_ANGLE)->ShowWindow(SW_HIDE);
  refs = 1;
  refl = 1;
  refu = 1;
  refr = 1;
  refb = 1;
  reft = 1;
}

⌨️ 快捷键说明

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