#26 Re: Програмування Arduino » Чому повідомлення не вдається розкласти в масив без затримки часу » 2025-08-05 13:35:34

dimich пише:

Спробую ще раз. У вашій програмі дві помилки, через які програма не працює як очікується...

Ваша старанність друкувати заслуговує на окрему повагу! Але чи не простіше було б просто надрукувати уривок коду, що дійсно працює?

#27 Re: Програмування Arduino » Чому повідомлення не вдається розкласти в масив без затримки часу » 2025-08-05 13:29:54

dimich пише:

Ніяку затримку зменшувати не треба, бо її там взагалі не має бути.

!? як що закоментувати позначений рядок - маю наступну відповідь, при однаковому сповіщєнні 147/258/369/321/654 , отримую наступний результат:
147_258_369_321_654
147_258_369_321_654
147_258_369_321_654
147_58_369_321_654
147_258_369_0_654
147_258_369_321_654
147_258_369_0_654
0_258_369_321_654
147_258_369_321_654
147_258_369_1_654
147_258_369_321_654
147_258_9_321_654
147_258_369_321_54
147_258_369_321_654

#28 Re: Програмування Arduino » Чому повідомлення не вдається розкласти в масив без затримки часу » 2025-08-05 11:18:54

jokeR пише:
filat18 пише:
jokeR пише:

Ось наприклад я взяв такий код ....

ось тут я не розумію, як цей код пов'язон читанням повідоилень і як  він реагує на закінчення повідомлення?

Це відноситься до експлуатації undefined behavior. Вам просто повезло що байти удачно розмістились.

як це відстежити на етапі випробування коду?

#29 Re: Програмування Arduino » Чому повідомлення не вдається розкласти в масив без затримки часу » 2025-08-05 10:03:28

jokeR пише:

Ось наприклад я взяв такий код ....

ось тут я не розумію, як цей код пов'язон читанням повідоилень і як  він реагує на закінчення повідомлення?

#31 Re: Програмування Arduino » Чому повідомлення не вдається розкласти в масив без затримки часу » 2025-08-05 09:30:58

Ось варіат коду, що в мене стабільно працює:

int rArr[5] = {0};
int rIndex = 0;

void setup() {
  Serial.begin(250000);
  for (int i = 0; i < 5; i++) {
    rArr[i] = 0;
  }
  rArr[1] = 1;
  rIndex = 0;
}

void loop() {
  String textcom = ""; // переменная для сбора текста из сом-порта    
  while (Serial.available() > 0) {
    int inChar = Serial.read();    
    if ((inChar == '/') || (inChar == 'n')){
      if (textcom != ""){
        rArr[rIndex ] = textcom.toInt();
        textcom = "";
        delay(1); // ------------ чому без цього радка результат не стабільний????
      }
      rIndex++;   
    }else{
      textcom += (char)inChar;
    }
    if (inChar == 'n') {
      String text = String(rArr[0]) + "_" + String(rArr[1]) + "_" + String(rArr[2]) + "_" + String(rArr[3]) + "_" + String(rArr[4]); 
      Serial.println(text);
      for (int i = 0; i < 5; i++) {
        rArr[i] = 0;
      }
      rArr[1] = 1;
      rIndex = 0;
    }
  }
  delay(1);
}

#32 Re: Програмування Arduino » Чому повідомлення не вдається розкласти в масив без затримки часу » 2025-08-05 09:16:46

Було багато різнопланових зауважень без глобальної прив'язки. Ось код - як я зрозумів запропоновані редагування:

int rArr[10] = {0};
int rIndex = 0; 

void setup() {
  Serial.begin(250000); 
  rIndex = 0;
}

void loop() {
  while (Serial.available() > 0) {
    int inChar = Serial.read();
    rArr[rIndex] *= 10;
    rArr[rIndex] += inChar - '0';
    rIndex++;
    if (inChar == 'n') {
      Serial.println(rArr[0]);
      Serial.println(rArr[1]);
      Serial.println(rArr[2]);
      Serial.println(rArr[3]);
      Serial.println(rArr[4]);
      Serial.println(rArr[5]);      
      Serial.println(rArr[6]);
      for (int i = 0; i < 10; i++) {
        rArr[i] = 0;
      }
      rIndex = 0;
    }
  }  
  delay(1);
}

Звіт по праці цього коду ніяк не пов'язаний відправленним повідомленням...  sad

#34 Re: Програмування Arduino » Чому повідомлення не вдається розкласти в масив без затримки часу » 2025-08-04 09:28:44

Зауваження про rArr[10] = {0}? Ініциалізація виконується до setup, а у loop - виконую стирання. Випробую виконати стирання після вдалого считування:
    if (inChar == 'n') {
      Serial.println(rArr[0]);
      Serial.println(rArr[1]);
      Serial.println(rArr[2]);
      rArr[10] = {0};
    }
Зверну увагу на те, що затримка часу після rArr[10] = {0} нічого не дає, а працює лише у тому місці, що я виклав.

#35 Програмування Arduino » Чому повідомлення не вдається розкласти в масив без затримки часу » 2025-08-04 06:56:50

filat18
відповідей: 40

Проводив перевірку на платі UNO.
Плата отримує повідомлення у вигляді числового масиву не визначеної довжини (приклад: 2/954/67). Код, що використовується, працює тільки якщо використовую рядок затримки часу - якщо цей рядок закоментувати, то дані не потрапляють в масив.

int rArr[10]; // = {0}; 
int rIndex; // = 0; 

void setup() {
  Serial.begin(250000); 
}

void loop() {
  String textcom = "";
  rArr[10] = {0};
  rArr[1] = 1;
  rIndex = 0;
  while (Serial.available() > 0) {
    int inChar = Serial.read();

    delay(1);  //-------------???

    if ((inChar == 47) || (inChar == 'n')){ // 47  - код "/"
      rArr[rIndex ] = textcom.toInt();
      textcom = "";
      rIndex++;   
    }else{
      textcom += (char)inChar;
    }
    if (inChar == 'n') {
      Serial.println(rArr[0]);
      Serial.println(rArr[1]);
      Serial.println(rArr[2]);
    }
  }
}

Чому це відбувається і як прискорити роботу коду?

Підвал форуму