Arduino иногда не реагирует при чтении последовательных команд

Когда я отправляю шестнадцатеричные числа через компьютер на Arduino Leonardo, он иногда не реагирует, но последовательный монитор сообщает, что оно было отправлено. Мой код;

    void setup()
{
  Serial.begin(9600);
  pinMode(9, OUTPUT);
  pinMode(A0, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
}

void loop()
{
  delay(100); // Подождите 100 миллисекунд
  Serial.println(Serial.read());
  if (Serial.read() == 49) {
    Serial.println("left");
    analogWrite(9, 1023);
    digitalWrite(A0, HIGH);
    analogWrite(10, 1023);
    digitalWrite(11, LOW);
  }
  if (Serial.read() == 50) {
    Serial.println("right");
    analogWrite(9, 1023);
    digitalWrite(A0, HIGH);
    analogWrite(10, 1023);
    digitalWrite(11, LOW);
  }
  if (Serial.read() == 51) {
    Serial.println("backwards");
    analogWrite(9, 1023);
    digitalWrite(A0, LOW);
    analogWrite(10, 1023);
    digitalWrite(11, LOW);
  }
  if (Serial.read() == 52) {
    Serial.println("forwards");
    analogWrite(9, 1023);
    digitalWrite(A0, HIGH);
    analogWrite(10, 1023);
    digitalWrite(11, HIGH);
  }
  if (Serial.read() == 48) {
    Serial.println("stop");
    analogWrite(9, 0);
    digitalWrite(A0, LOW);
    analogWrite(10, 0);
    digitalWrite(11, LOW);
  }
}

Когда я отправляю числа 1,2,3,4 и 0, он читает, что делает команда. Контакты A0 и D11 управляют направлением контроллера двигателя, а контакты D9 и D10 — скоростью.

это какой-то беспорядок.

, 👍-1

Обсуждение

последовательный монитор печатает байт, отличный от того, который управляет двигателями, @jsotola


1 ответ


Лучший ответ:

3
Serial.println(Serial.read());
if (Serial.read() == 49) {

Вы делаете здесь два чтения, а не одно. Итак, вы читаете и отображаете, а затем читаете второй байт (не тот, который вы отобразили).

Было бы гораздо лучше:

int cmd = Serial.read();
Serial.println(cmd);
if (cmd == 49)  {
  ... do something ...
} else if (cmd == 50)  {
  .. do something else ...
}

И так далее.

Кроме того, зачем использовать цифры, если можно отображать символы ASCII? например.

int cmd = Serial.read();
Serial.println(cmd);
if (cmd == '1')  {
  ... do something ...
} else if (cmd == '2')  {
  .. do something else ...
}

Вы также можете рассмотреть возможность использования:

if (!Serial.available())
    return;

Таким образом, вы не будете проверять несуществующие последовательные данные.

Почему задержка?

,

Когда я сделал задержку, мне показалось, что это работает лучше., @Kyle_3_1415