Помощь в коде

Catskin
Offline
Зарегистрирован: 14.01.2016

Помогите пожалуйста! Задача такая, машинка на ардуино с управлением с телефона через геймпад. Проблема:Есть код, но он не работает. К примеру, вбиваю в консоль w, должно откликнутся словом forward, и конечно же поехать, но , не тут то было. С помощью Serial.println (Serial.read()); мониторю ввод, видно ,команды идут, но в if() почему то не работают.

 

void loop(){
 int in = Serial.read()+1;
Serial.println (Serial.read());
  if(Serial.available()){
    if(in == 'w'){
      Forward();
      Serial.println("Forward");
    }
    if(in == 's'){
      Reverse();
      Serial.println("Reverse");
    }
    if(in == 'a')turnLeft();
    if(in == 'd')turnRight();
}
Serial.println (Serial.read());
}

 

P.S. - Forward();Reverse();turnLeft();turnRight(); - заранее созданные функции, название которых достаточно обьясняет их предназначение

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Четвертую строчку вырежьте и вставьте между void loop(){ и int in =...., и всё заработает) P.S. ещё замените int на char.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

В дополнении к вышесказанному. Строка 2, убрать +1. И в строке 3 в Сериал выводится не переменная, а следующее значение из Сериал.

Radjah
Offline
Зарегистрирован: 06.08.2014
vde69
Offline
Зарегистрирован: 10.01.2016

ну еще добавлю, что "w" и "W" разные (не смотря, что клавиша одна), а так-же есть еще русская раскладка.... это я к тому, что надо смотреть чего комп шлет а не какую клавишу нажимал :)

Catskin
Offline
Зарегистрирован: 14.01.2016

Если я использую switch, то код будет обрабатывать только одно нажатие за цикл.
Именно поэтому я if использовал.
Но спасибо.

Catskin
Offline
Зарегистрирован: 14.01.2016

Ну за этим я следил)

Catskin
Offline
Зарегистрирован: 14.01.2016

Yarik.Yar пишет:

Четвертую строчку вырежьте и вставьте между void loop(){ и int in =...., и всё заработает) P.S. ещё замените int на char.

Спасибо большое.
Можете обьяснить, почему так ?
Ведь переменная находилась  в том же классе, в той же функции.
Насколько я понимаю, if должна была иметь полный доступ к ней.

Radjah
Offline
Зарегистрирован: 06.08.2014

Catskin пишет:
Если я использую switch, то код будет обрабатывать только одно нажатие за цикл. Именно поэтому я if использовал. Но спасибо.
У тебя 4 if и один символ, который пройдет только одну проверку из 4-х. Бредогон выключай.

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Страна советов...

void loop()
{
 int in = Serial.read();
 Serial.println (in);
 if(in == 'w'){Forward(); Serial.println("Forward");}
 else if(in == 's'){Reverse();Serial.println("Reverse");}
 else if(in == 'a')turnLeft();
 else if(in == 'd')turnRight();
}

 

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Catskin пишет:

Yarik.Yar пишет:

Четвертую строчку вырежьте и вставьте между void loop(){ и int in =...., и всё заработает) P.S. ещё замените int на char.

Спасибо большое.
Можете обьяснить, почему так ?
Ведь переменная находилась  в том же классе, в той же функции.
Насколько я понимаю, if должна была иметь полный доступ к ней.

Так потому, что ветка if(Serial.available())... выполнится только тогда, когда есть символ в UART-буфере. А вы этот символ считываете, потом, если он есть, будет выполнен весь остальной код...но его в буфере нет, вы его уже считали! Поэтому if далее и не выполнялся))