C++ класс. для cmsd-4.2
 

C++ класс. для cmsd-4.2

Автор andrewvorobey, 20 июня 2013, 14:51:43

« назад - далее »

andrewvorobey

Немного специфичный класс, предназначался для конкретных целей(в ущерб универсальности), думаю вы легко сможете переделать его под себя. Мучался долго, прежде чем написал стабильно работающий код.

p.s. прошу за качество кода-я еще студент, и навыков написания хорошего кода еще нет.


///.h
#pragma once
#include "Resource.h"
#include <string.h>
using namespace std;

//********************************************************************//
//********************************************************************//
//*********Класс для управления пошаговым Двигателем******************//
//********************************************************************//
//********************************************************************//
class Manipul
{
public:
   Manipul();
   ~Manipul();
   bool Start_Stop();
   bool setWay(int chek) ;
   bool setSpeed(int chek);
   bool getStatus() {return runStatus;}
   bool getWay() {return UpDown;}
   void BreakManipStatus(){runStatus=0;}
      
private:
   bool OpenCOM();
   bool CloseCOM();
   string NCOM;
   HANDLE hCom ;
   DCB dcb;


   bool WriteCOM(LPCVOID ,const unsigned int&);
   bool writeGo();
   bool writeStop();
   string Commands[10];

   bool ReadCOM(LPVOID , const unsigned int&);
   bool Read();
   bool ReadOne();
   bool SetStandartSettings();


   bool UpDown;//1 вверх, 0 вниз
   bool runStatus;//1-двигается, 0-стоит
} ;




///.cpp
//

#include "stdafx.h"
#include <conio.h>
#include <windows.h>
#include <conio.h>


Manipul::Manipul():runStatus(0)
{

   Commands[0]="LD1*";      //начать прошивку
   Commands[1]="BG*";      //указатель в начало
   Commands[2]="EN*";      //разрешает запустить обмотки двигателя.
   Commands[3]="AL1000*";   //ускорение
   Commands[4]="SD100*";   //конечная скоростть
   Commands[5]=="DL*";      //направление движения (DR*)
   Commands[6]="OF*";      //дробление шага (ON*)
   Commands[7]="MV*";      //кол-во шагов
   Commands[8]="ED*";      //завершение прошивки
   Commands[9]="ST1*";      //старт/стоп.
   NCOM="COM8";
   
   GetCommState(hCom, &dcb);
    dcb.BaudRate = CBR_9600;
    dcb.ByteSize = 8;
    dcb.Parity =  EVENPARITY ;

}

Manipul::~Manipul()
{

if (runStatus)    
   if(OpenCOM())writeStop();
}


bool Manipul::OpenCOM()
{
    hCom = CreateFile(NCOM.c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
     if (hCom != INVALID_HANDLE_VALUE)
          if (SetCommState(hCom, &dcb))
        {         
         SetCommMask(hCom,EV_RXCHAR);
         
            return 1;
        }

    return 0;
   
}

bool Manipul::CloseCOM()
{

      if (hCom != INVALID_HANDLE_VALUE)
     {
          CloseHandle(hCom);
         hCom = INVALID_HANDLE_VALUE;
         return true;
     }
     else
        return false;
}


bool Manipul::WriteCOM(LPCVOID outputData,
                     const unsigned int& sizeBuffer)
{
   unsigned long b;
   if(WriteFile(hCom,  outputData,  sizeBuffer,&b, NULL))
      return true;
   else return false;
}


bool Manipul::Start_Stop()
{   
   if (OpenCOM())
   {
      if(!runStatus)
         writeGo();
      
      else
      {
         writeStop();
         SetStandartSettings();
         
      
      }
      return 1;
   }
   return 0;

}

bool Manipul::SetStandartSettings()
{
      if(!OpenCOM())
         return false;
      setWay(1);
      setSpeed(4000);
         writeGo();

      if(!OpenCOM())
         return false;
      
         writeStop();
      return true;
}


bool Manipul::writeGo()
{
      for(int i=0;i<=9;i++)
      {
         WriteCOM((void*) Commands.c_str(),Commands.size()*sizeof(char));
         Read();
      }
      
   CloseCOM();
   runStatus=1;//флаг запуска
      return 1;
}

bool Manipul::writeStop()
{
   WriteCOM((void*) Commands[9].c_str(),Commands[9].size()*sizeof(char)); //стоп
   Read();   
   runStatus=0;//флаг остановлен
   CloseCOM();
   return 1;
}

bool Manipul::Read()
{
   if(ReadOne())
   ReadOne();
   return 1;
}

bool Manipul::ReadOne()
{
         char LastTextIn,TextIn=0;
   while(TextIn!='*')//каждая команда заканчивается звездочкой.   
      {
         if(TextIn==7 )
         return 0;
         
         if(TextIn=='4' && LastTextIn=='1')//ответ на команду остановки Е14*. Это помогает синхранизировать с ручным управлением.
            runStatus=0;
         LastTextIn=TextIn;
         ReadCOM((void*) &TextIn,1);
      }
      return 1;
}

bool Manipul::ReadCOM( LPVOID inputData, const unsigned int& sizeBuffer)
{
   
   unsigned long b;
  if (ReadFile(hCom,inputData, sizeBuffer,  &b,0))   return TRUE;
  else return FALSE;
   
}


bool Manipul::setSpeed(int chek)
{
   char BUF[10]; 
   wsprintf(BUF,TEXT("SD%d*"),chek);
   Commands[4]=BUF;
   return 1;
}

bool Manipul::setWay(int chek)
{   
   UpDown=chek;
   if (chek)  Commands[5]="DL*"; else  Commands[5]="DR*";
   return 1;
}