Вызов и выполнение функции до след команды

Здравствуйте. Помогите!) Всю голову уже сломал. Шаговый мотор имеет несколько режимов работы. По Serial передается переменная, на основании этой переменной выбирается функция. Но функция должна работать до передачи другой переменной, а в моем случае работает только на долю секунды: один шаг мотора, я подозреваю. Второй день гуглю, все бестолку.

#define SMOOTH_ALGORITHM
#include <GyverStepper.h>
GStepper<STEPPER2WIRE> stepper(6400, 4, 3, 2);
int speed;

void setup() {
  Serial.begin(9600);
}
void loop() {
  speed = Serial.read ();
  switch (speed) {
    case 's': Slow ();
    break;
    case 'f': Fast ();
    break;
  }
}
    
void Slow () {
  stepper.setRunMode(FOLLOW_POS);
  stepper.setMaxSpeed(400);
  stepper.setAcceleration(500);
  if  (!stepper.tick()) {
        static bool dir;
        dir = !dir;
        stepper.setTarget(dir ? -400 : 400);
      }
}

void Fast () {
  stepper.setRunMode(FOLLOW_POS);
  stepper.setMaxSpeed(2000);
  stepper.setAcceleration(2000);
  if  (!stepper.tick()) {
        static bool dir;
        dir = !dir;
        stepper.setTarget(dir ? -400 : 400);
      }
}

Перед 10, прежде чем читать значение из Serial, нужно проверить готовность самого Serial.

Что о этом методе пишет автор?

Да, я просто упрощал код как мог, чтобы найти проблему. С проверкой готовности поведение такое же.

Сообщает о (не)работе движка. То бишь возвращает true, если мотор в движении.

Может потому, что Serial.read () возвращает -1 при пустом приемном буфере?

Не могу найти: что с этим делать? Везде в других скетчах Serial.read и находил.

Для начала надо хотя бы просто вывести то что считалось …
и поместить отладочные сообщения в каждую из функций …

Это не основной его функционал. Читайте описание тщательней - когда и сколько раз следует его вызывать.

Вам же сказали - прежде чем считать байт из Сериал, надо проверить, а есть ли он там, байт этот? - а вы отмахнулись…

А в целом, весь код никуда не годится вовсе. Поэтому у вас и получается, что мол, “пробовал исправлять - не помогло”. Тут не одна ошибка, и минимум пара десятков.
Проще этот код выкинуть и написать заново нормальный. Изучив внимательно прежде, как работают с Сериал и как управлять двигателем.

1 лайк