Использование классов при передаче данных с ПК

denis2507
Offline
Зарегистрирован: 24.08.2016

Доброго времени суток! Наверно, немного не точно сформулировал заголовок, заранее извиняюсь, не сообразил, как правильно записать (Arduino начал изучать недавно, да и в программировании в целом не блещу).

Есть один класс, который служит для управления шаговым двигателем. При его "активации", нужно указать параметры "скорость" и "расстояние" . Задаются они в следующем виде:

ServRotate sr1(100, 10);

Причем это строка должна быть прописана вне петли (loop), иначе работать отказывается.

В петле просто прописывается:

sr1.Update();

И все замечательно работает. НО, нужно с ПК передавать эти самые "скорость, расстояние" и запустить работу класса по команде. С запускам по команде проблем нет, а вот с вводом данных - есть. Так как строка записывается вне петли, а данные считываются в петле, то запихнуть их в эту строку нельзя, точнее, запихнуть то можно, но строка не прочитается, так как находится вне петли. Голову сломал уже, и гугление не принесло ни капли понимания, как решить эту проблему. Надеюсь, вы, добрые люди, поможете разрбраться, заранее спасибо:)

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

прекращай эту дурь с петлями

denis2507
Offline
Зарегистрирован: 24.08.2016

Но как иначе?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Варианта два:

1. Смотрите, есть ли у класса ServRotate методы для установки параметров "скорость" и "расстояние". Если есть - юзайте их;

2. Создавать объект класса ServRotate динамически, при помощи оператора new:

ServRotate* myServ = NULL;

void loop()
{
   if(пришли_параметры)
  {
     delete myServ;
    myServ = new ServRotate(скорость, расстояние);
  }

    if(myServ)
       myServ->Update();
}

 

denis2507
Offline
Зарегистрирован: 24.08.2016

По поводу первого варианта: Класс писал сам по шаблону из одной статьи, так что может в нем проще что изменить, не совсем понимаю, что значит ваша формулировка, но, подозреваю, что вы имеете ввиду эту часть:

 public:
  ServRotate(float newSpd, float newDist)
  {
    spd = newSpd;
    dist = newDist;
    distIter = dist/0.175; //одна итерация = 0.175 мм. 
    distIterNew=0;

    pinMode(10, OUTPUT);
    pinMode(12, OUTPUT);

    
    iter=1;
    previousMillis = 0;
    updateMillis = spd; // время, через которое идет новый импульс

Далее просто идет  void Update(), в котором расписывается применение этих данных

А со вторым вариантом тоже попробую разрбраться.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Если класс писали сами - добавьте туда публичный метод установки параметров, и всё:

class ServoUpdate
{
public:
   void setSpeedAndDistance(float speed, float distance)
   {
      spd = speed;
      dist = distance;
   }
};

И вызывайте его, когда надо:

ServoUpdate myServ(10,100);

void loop()
{
    if(параметры пришли)
   {
      myServ.setSpeedAndDistance(скорость, дистанция);
   }
}

 

denis2507
Offline
Зарегистрирован: 24.08.2016

Спасибо, всё получилось :)