@ajlhimik

Абсурдное выполнение условных операторов 3 раза в Arduino nanov3, как исправить?

5b202045c4af9916535399.png
первая строка выходит при старте, 2-я когда ввожу цыфру, а остальные 3 откуда? по логике программы вообше только 1 раз должно входит в if по тому что я ровняю ети 2 переменных (xBase i xBase0) и во всех случаях так происходит когда использую Serial и Software Serial (через блутус) тожэ самое, и тожэ строго 3 раза( 2 раза лишние)

код вот
const int baza = 5;
const int col = 6;
const int emi = A5;
int xBaza = 0;
int xCol = 255;
//int xEmi = 0;
int xBaza0 = 0;

void setup() {
  Serial.begin(9600);
  pinMode(baza, OUTPUT); 
  pinMode(col, OUTPUT); 
}

void loop() {
  analogWrite(col, xCol);
  xBaza = Serial.read();
  if(xBaza != xBaza0) {
    xBaza0 = xBaza;
    analogWrite(baza, xBaza);
    writes();
  }
}

void writes(void) {
  Serial.print(analogRead(emi));
  Serial.write("  baza: ");
  Serial.print(xBaza);
  Serial.write("  colector: ");
  Serial.print(xCol);
  Serial.write('\n');
}
  • Вопрос задан
  • 214 просмотров
Пригласить эксперта
Ответы на вопрос 3
void loop() {
  analogWrite(col, xCol);
  xBaza = Serial.read();
  if(xBaza != xBaza0) {
    xBaza0 = xBaza;
    analogWrite(baza, xBaza);
    writes();
  }
}

1. Попадаете в условие, выполняете действия. После чего идете на второй круг. в переменной сидит, например 50, которое вы присваиваете.
2. Снова читаете, но уже чтение порта возвращает вам -1, если не ошибаюсь, если не прочитано ни одного символа.
Сравниваем: -1 не равно 50 и вы опять в условии. Выполняется вывод и присваивание переменной значения -1.
После этого обе переменные становятся -1 и вы не попадаете в условие. Т.к. при попытке чтения порта результат -1 и в переменной тоже -1.

И читаете Вы не цифру, а ее ASCII код.

Возможно поможет if(xBaza != xBaza0 && xBaza != -1) {
Ответ написан
Комментировать
@kalapanga
В первую очередь Вы должны убедиться, что в скетче получаете из порта то, что ожидаете. То есть то, что "вводите" в мониторе порта. Для этого закомментируйте пока весь Ваш if, а вместо него сразу после строки xBaza = Serial.read(); напечатайте значение xBaza в монитор порта. Должно всё проясниться.
Ответ написан
Комментировать
makarenya
@makarenya
программист
https://www.arduino.cc/en/Serial/Read
А точнее абзац

Returns
the first byte of incoming serial data available (or -1 if no data is available) - int

метод read() возвращает прочитанные данные, если таковые есть и -1 - если данных нет.

Исправьте код на следующий

void loop() {
  analogWrite(col, xCol);
  xBaza = Serial.read();
  if(xBaza >= 0 && xBaza != xBaza0) {
    xBaza0 = xBaza;
    analogWrite(baza, xBaza);
    writes();
  }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы