Как назначить две или более переменные, поступающие из приложения
Я новичок в 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()
ничего не читает, будут ли мои значения изменены на нулевые или нулевые?
@Keka Bron, 👍1
Обсуждение2 ответа
Лучший ответ:
Это классическая проблема, которая решается либо путем уникальной идентификации каждого значения, либо путем согласования заранее определенной последовательности данных. Однако можно сказать, что существует множество решений этой проблемы. что это только 2 примера.
В первом случае отправителю и получателю необходимо договориться, что все данные будут отправляться парами. Например, пара байтов, где первый идентифицирует данные, а второй — сами данные. В этом случае порядок данных не имеет значения. И можно отправить гораздо больше данных одного типа, чем другого. Это полезно использовать, когда скорость передачи данных нерегулярна и не обязательно должна быть высокой. Например, цены на акции.
Во втором случае отправитель и получатель должны договориться, что все данные будут отправлены в одной и той же последовательности, даже если данных для отправки нет. Такая схема может использовать специальный бит синхронизации для идентификации начала последовательности данных. Обычно, когда нет данных для отправки, отправляется ноль. Но если нули значат, то необходимо согласовать специальные нулевые символы. Это хорошо, когда скорость передачи данных является постоянной и должна быть высокой. Например, оцифрованный звук.
Думаю, я воспользуюсь первым вариантом. Но у меня есть еще одно сомнение, поскольку в каждом цикле мои переменные пытаются прочитать из Serial, если Serial пуст, их значение изменится на 0? если я использую Serial.avalaible() в операторе if, избавлюсь ли я от этой проблемы?, @Keka Bron
Serial.available() проверяет наличие новых данных. Используйте его, чтобы узнать, нет ли данных, и пропустить чтение данных для этой итерации., @st2000
Вот простой скетч, который подойдет для вашего примера со светодиодом:
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
. При этом загорятся оба светодиода.
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Использовать все контакты как цифровые входы/выходы
- Float печатается только 2 десятичных знака после запятой
- Arduino как USB HID
- Serial1' was not declared in this scope
- Очень простая операция Arduino Uno Serial.readString()
- AT-команда не отвечает на последовательный монитор
https://majko.co.uk/blog/reading-serial-arduino, @Juraj
разве вы не задавали недавно очень похожий вопрос - https://arduinoprosto.ru/q/59976/how-can-i-distinguish-values-sent-from-arduino, @Jaromanda X