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

Я новичок в Arduino, и у меня есть некоторые сомнения относительно того, как Arduino считывает данные. Предположим, у меня есть 3 переменные a,b,c. Мне нужны эти переменные в моем Arduino, чтобы что-то сделать. Поскольку все переменные считываются с помощью Serial.read(), как я могу различать их в своем Arduino?

Пример:

Переменная a: 2 Переменная b: 3 Переменная c: 4

Пример кода Arduino:

void loop() {
int a = Serial.read();
int b = Serial.read();
int c = Serial.read();

if(a == '0'){
digitalWrite(yellowLed, HIGH);
}

if(b == '0'){
digitalWrite(blueLed, HIGH);
}

if(c == '0'){
digitalWrite(redLed, HIGH);
}

В каждом цикле мой Arduino выполняет serial.read() 3 раза, если я отправляю только значение b из своего приложения, поскольку int a = Serial.read() выполняется первым, будет ли мое значение b присвоено a? Если да, то как я могу избежать этой проблемы и принудительно выполнить правильное назначение? Кроме того, если в каждом цикле Serial.read() ничего не читает, будут ли мои значения изменены на нулевые или нулевые?

, 👍1

Обсуждение

https://majko.co.uk/blog/reading-serial-arduino, @Juraj

разве вы не задавали недавно очень похожий вопрос - https://arduinoprosto.ru/q/59976/how-can-i-distinguish-values-sent-from-arduino, @Jaromanda X


2 ответа


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

0

Это классическая проблема, которая решается либо путем уникальной идентификации каждого значения, либо путем согласования заранее определенной последовательности данных. Однако можно сказать, что существует множество решений этой проблемы. что это только 2 примера.

В первом случае отправителю и получателю необходимо договориться, что все данные будут отправляться парами. Например, пара байтов, где первый идентифицирует данные, а второй — сами данные. В этом случае порядок данных не имеет значения. И можно отправить гораздо больше данных одного типа, чем другого. Это полезно использовать, когда скорость передачи данных нерегулярна и не обязательно должна быть высокой. Например, цены на акции.

Во втором случае отправитель и получатель должны договориться, что все данные будут отправлены в одной и той же последовательности, даже если данных для отправки нет. Такая схема может использовать специальный бит синхронизации для идентификации начала последовательности данных. Обычно, когда нет данных для отправки, отправляется ноль. Но если нули значат, то необходимо согласовать специальные нулевые символы. Это хорошо, когда скорость передачи данных является постоянной и должна быть высокой. Например, оцифрованный звук.

,

Думаю, я воспользуюсь первым вариантом. Но у меня есть еще одно сомнение, поскольку в каждом цикле мои переменные пытаются прочитать из Serial, если Serial пуст, их значение изменится на 0? если я использую Serial.avalaible() в операторе if, избавлюсь ли я от этой проблемы?, @Keka Bron

Serial.available() проверяет наличие новых данных. Используйте его, чтобы узнать, нет ли данных, и пропустить чтение данных для этой итерации., @st2000


0

Вот простой скетч, который подойдет для вашего примера со светодиодом:

const byte blueLED = 2;
const byte yellowLED = 3;

void setup(){
  Serial.begin(9600);
  pinMode(blueLED, OUTPUT);
  pinMode(yellowLED, OUTPUT);
}

void loop(){

  if(Serial.available()){

    switch(Serial.read()){
      case 'a':
        digitalWrite(yellowLED, HIGH);
        break;

      case 'b':
        digitalWrite(yellowLED, LOW);
        break;

      case 'c':
        digitalWrite(blueLED, HIGH);
        break;

      case 'd':
        digitalWrite(blueLED, LOW);
        break;
    }
  }
}

Если отправить букву a, загорится желтый светодиод. Отправка буквы b выключит желтый светодиод. Ничто не мешает вам отправить 2 письма одновременно, например ac. При этом загорятся оба светодиода.

,