Проблемы с оператором switch...case

PavelMrm

✩✩✩✩✩✩✩
29 Июл 2025
2
0
Оформи код соответствующим тэгом, см. Правила
Доброго времени суток!
Совсем недолго в теме ардуино и программирования в целом, поэтому мой вопрос может показаться очень глупым, но необходим совет и помощь в решении проблемы.
Делаю проект, в котором ардуино должен управлять больше 10 реле, интерфейс на processing. Каждый шаг согласно видео с "Заметки ардуинщика" по написанию интерфейса для ардуино. В скетче используется оператор switch...case. 10 реле ( case 0-9) отрабатывают штатно, не забивают друг друга. При срабатывании case 10 и 11 невозможно полностью управлять реле из 0-9, а именно - например, при включении реле из case 10 остальные тоже можно включить, но выключить их уже не получается, пока не будет команды на выключение реле из case 10.

Скетч из IDE

#include "Parser.h"
int relePin1 = 2;
int relePin2 = 3;
int relePin3 = 4;
int relePin4 = 5;

void setup() {
Serial.begin(57600);
pinMode(relePin1, OUTPUT);
pinMode(relePin2, OUTPUT);
pinMode(relePin3, OUTPUT);
pinMode(relePin4, OUTPUT);
}

void loop() {
if (Serial.available() > 0){
char buf[50];
Serial.readBytesUntil(';', buf, 50);
Parser data(buf, ',');
int ints[15];
data.parseInts(ints);

switch (ints[0]) {
case 0: digitalWrite(relePin1, ints[1]);
break;
case 1: digitalWrite(relePin2, ints[1]);
break;
case 2: digitalWrite(relePin3, ints[1]);
break;
case 3: digitalWrite(relePin4, ints[1]);
break;
case 4: digitalWrite(13, ints[1]);
break;
case 5: digitalWrite(13, ints[1]);
break;
case 6: digitalWrite(13, ints[1]);
break;
case 7: digitalWrite(13, ints[1]);
break;
case 8: digitalWrite(13, ints[1]);
break;
case 9: digitalWrite(13, ints[1]);
break;
case 10: digitalWrite(13, ints[1]);
break;
case 11: digitalWrite(13, ints[1]);
break;
}
}

Кусок кода из processing и весь код в целом повторяет код из видео.

void toggle1(int val) {
serial.write("0,"+ val +";");
}
void toggle11(int val) {
serial.write("10,"+ val +";");
}

Заранее огромное спасибо за помощь!
 

poty

★★★★★★✩
19 Фев 2020
3,507
997
@PavelMrm, скорее всего buf выделяется в уже заполненной предыдущим чтением области памяти. Попробуйте очистить buf перед чтением.
 

bort707

★★★★★★✩
21 Сен 2020
3,234
945
@PavelMrm,
Во-первых, чтобы правильно работать со строкой в 50 символов, буфер должен иметь длину 51 байт.

Во-вторых, не забывайте добавлять терминатор в конце строки.

И в третьих, мы не знаем что там у вас в файле Parser.h - может он умеет извлекать только одиночные цифры. Это обьяснило бы, почему варианты 0-9 у вас работают, а 10 и 11 уже нет.
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
648
192
@PavelMrm,
У Гайвера в уроках добавляется ноль в конец данных в буфере. Вы не добавляете. Возможно в этом причина.

Код из урока
C++:
    int amount = Serial.readBytesUntil(';', str, 150);
    str[amount] = NULL;
ПС код надо вставлять используя значок </> Если пишите, что делали все по уроку, то желательно давать ссылку на текстовый вариант урока.
 

PavelMrm

✩✩✩✩✩✩✩
29 Июл 2025
2
0
@Bruzzer, сравнил сейчас код с гитхаба со своим, действительно пропустил строчку...и не полностью дописал другую.
Спасибо, надеюсь, причина была только в этом.