#2 Re: Програмування Arduino » Чи є інструменти для перевірки наявності вивода у плати за номером? » 2025-08-06 11:54:31

Загальна ідея була така: експлуатація виробу планується на мега, де виводи використовуються як ціфрові... А ось обкатка, зачасту йде на нано чи уно, і при звернені до відсутніх віводів... - відбуваєтся богна що. Через окремі меркування, реалізувати відхилення звернень до відсутніх виводів на рівні верхнього керовання не можно. Тому й задав це питання, щоб не множити окремі скетчі до різних плат, а один раз закласти перевирку номерів....

#3 Re: Програмування Arduino » switch працює лише з повними рівняннями, чи можливо вказати діапазони? » 2025-08-06 11:44:03

jokeer пише:

Якщо відповідь не подобається, можна її проігнорувати smile

ні, я якраз питав про протилежний варіант  smile

#4 Програмування Arduino » Чи є інструменти для перевірки наявності вивода у плати за номером? » 2025-08-06 10:53:44

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

нано/уно/мега/... - різні плати мають різну кількість виводів (які, зокрема, мають особисту нумерацію).
Чи існують оператори коду, за допомогою яких, при наявности номера, можно б було виконати перевірку - чи є у плати, на яку записан цей скетч, реальний вивод за перевіряємим номером?

#6 Програмування Arduino » switch працює лише з повними рівняннями, чи можливо вказати діапазони? » 2025-08-06 08:13:10

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

switch  - це оператор, що перевіряє чи відповідає перемінна окремим значенням.
Чи можно у цьому операторі вказати умови перевірки відповідності до окремих діапазонів?
Наприклад, якщо пермінна є int х, то перевірити наступні віпадки: 1. х == 1; 2. х > 3 & x < 5; 3. x == 6; 4. x >= 8 ...?

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

dimich, дякую за варіант коду - дуже цікаво! З затиранням даних зрозуміло. А от що цікаво: код дає різну кількість отриманих груп для повідомлення 4/5 і для 4/5/

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

Мав меркування, що розділення на масив має буте швидше, ниж займатися розділом після отримання...
Но ті результати, що отримую та Ваші зауваження - підтвержують хибність моїх меркувань...

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

Загальні вимоги до  скетчу:
1 Якщо приходить повідомлення в вигляді цислового масива не визначеної довжини (від 1 до до 5, наприклад: 1/24/35 або 759/ або1/0/245/657/841 або...) треба занесті відповідні числа у масив rArr. Ділянки масиву, що не отримали новид даних, повинні отримати 0.
2. після отриманя числовиго массина та розкладання його у rArr, потрібно викликати зовнішний void.
3. ящо у повідомленні є символи, що не належать числовому масиву, всі значення rArr потрібно перетворити у 0  і перейти до очикування наступного сповіщення.

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

dimich пише:

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

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

#11 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

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

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

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

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

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

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

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

jokeR пише:

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

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

#15 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);
}

#16 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

#18 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} нічого не дає, а працює лише у тому місці, що я виклав.

#19 Програмування 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]);
    }
  }
}

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

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