При отправке в сериал порт данных и последющем их парсинге, почему-то заменяется первое значение на 0

Vladislavv

✩✩✩✩✩✩✩
5 Мар 2024
5
0
C++:
void parsing() {
  if (serial.available()) {
    Parser data(serial.buf, ',');  // отдаём парсеру
    int ints[3];           // массив для численных данных
    data.parseInts(ints);   // парсим в него

    switch (ints[0]) {      // свитч по ключу
      case 0:
      {
        Serial.println("case 0");
        Serial.println(ints[0]);
        Serial.println(ints[1]);
        Serial.println(ints[2]);
        if (ints[1] >= (moveX / 50) ){
          for (int i = (moveX / 50); i <= ints[1] - 1; i++) {
            digitalWrite(dirXPin, LOW);
            digitalWrite(dirYPin, HIGH);
            run();
            moveX += 50;
            // Serial.println("x=");
            // Serial.println(moveX / 50);
          }
        }
        else{//if (ints[1] < (moveX / 50) ){
          for (int i = (moveX / 50); i >= ints[1] + 1; i--) {
            digitalWrite(dirXPin, HIGH);
            digitalWrite(dirYPin, LOW);
            run();
            moveX -= 50;
            // Serial.println("x=");
            // Serial.println(moveX / 50);
          }
        }
        if (ints[2] >= (moveY / 50) ){
          for (int i = (moveY / 50); i <= ints[2] - 1; i++) {
            digitalWrite(dirYPin, HIGH);
            digitalWrite(dirXPin, HIGH);
            run();
            moveY += 50;
            // Serial.println("y=");
            // Serial.println(moveY / 50);
          }
        }
        else{// if (ints[2] < (moveY / 50) ){
          for (int i = (moveY / 50); i >= ints[2] + 1; i--) {
            digitalWrite(dirYPin, LOW);
            digitalWrite(dirXPin, LOW);
            run();
            moveY -= 50;
            // Serial.println("y=");
            // Serial.println(moveY / 50);
          }
        }             
        break;   
      }
      case 1:
      {
        Serial.println("case 1");
        Serial.println(ints[0]);
        Serial.println(ints[1]);
        Serial.println(ints[2]);
        servo.write(ints[1]);
        break;
      }
      case 2:
        break;
      case 3:
        break;
    }
  }
}
при отправке в порт 1,90,0; происходит следующее
Снимок экрана 2024-03-05 113539.png
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,974
633
45
Попробуйте перед парсингом данных вывести содержимое, желательно в HEX. Скорее всего мусор попадает.
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
476
137
Желательно исключить передачу значения 0 для парсинга.
Т.к. функция парсинга возвращяет 0 и в случае ошибки, или отсутствия данных. И без дополнительных проверок не понятно - это переданное значение или признак ошибки.
 

Vladislavv

✩✩✩✩✩✩✩
5 Мар 2024
5
0
дело в том что я отправил 1,90,0 только 1 раз, а выдало мне 1,90,0 2 раза а потом выдало 0,90,0
 

poty

★★★★★★✩
19 Фев 2020
3,237
942
@Vladislavv, а с чего Вы взяли, что к моменту срабатывания available у Вас в buf находится полная переданная строка?
 

Vladislavv

✩✩✩✩✩✩✩
5 Мар 2024
5
0
@poty, а она может передаться не полностью? если да, то почему?
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,974
633
45
@Vladislavv, Serial.available() - Arduino Reference
Откуда буфер знает сколько нужно принять байт? Вам нужно самому определять конец передаваемых данных, например по символу конца строки.
Поэтому я и попросил вас сделать вывод буфера перед обработкой.
 

poty

★★★★★★✩
19 Фев 2020
3,237
942
@Vladislavv, где? в приведённом коде её нет!
@Vladislavv, таймаут, наличие символов после символа ; (например, перевод каретки), сбои в передаче данных... Вы же не проверяете на корректность принятых данных. Что в памяти оказалось, то и используете. И вывести полученные данные в "сыром виде" не хотите.
 
  • Лойс +1
Реакции: Геннадий П