ARDUINO Попеременный вывод значений куда либо.

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
Для начала массив надо немного переделать
uint8_t periodDisplay[6] = {6,2,2,2,2,255};
255 - это как бы конец, после которого не надо ничего отображать, вдруг у кого то 2 режима, тогда в массиве будет
{6,2,255,255,255,255}

Ну и пару функций для парсинга туда сюда (сразу говорю, что не проверял, нет ничего под рукой, в принципе всё должно работать, но может где то и косякнул)
C++:
String arrayToStr(uint8_t  *inp){
    uint8_t i=0;
    String s;
    while (inp[i]!=255){
        s += inp[i];
        i++;
        if (inp[i]!=255) s +=",";
    }
    return s;
}
void StrToArray(const String& str,uint8_t* outArr,int length){
    String s;
    s += str;
    s += ", ";
    for (int i=0;i<length-1;i++){
        if (s.length()>2){
            outArr[i]=(s.substring(0,s.indexOf(",")-1).toInt();
            s=s.substring(s.indexOf(",")+1);
        } else {
            outArr[i]=255;
        }
    }
    outArr[length-1]=255;
}
 
Изменено:
  • Лойс +1
Реакции: ASM

ASM

★★★★✩✩✩
26 Окт 2018
1,548
299
@DAK,
C++:
uint8_t periodDisplay[5] = {6,2,2,2,2};
String s;
String arrayToStr(uint8_t  *periodDisplay){
    uint8_t i=0;   
    while (periodDisplay[i]!=255){
        s += periodDisplay[i];
        i++;
        if (periodDisplay[i]!=255) s +=",";
    }
    return s;
}
C++:
String arrayToStr(uint8_t *periodDisplay);
GP.TEXT("periodDisplay", "", s);
так?)
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,222
1,291
Москва
число 255 должно присутствовать в массиве. Суть в том, что можно объявить такой массив длиннее чем используется. Допустим 30.
Тогда если из веб морды получить строку условно "1,2,3,4,5 " и распасить, то в конце в массив надо будет добавить последним 255, т.е. будет
{1,2,3,4,5,255, остальные неопределенные данные}
И тогда перебирая в цикле от 0 до 29 (по всем 30 ячейкам) и наткнувшись на 255 можно незамедлительно перейти на 0-ой элемент
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,222
1,291
Москва
вместо periodDisplay[ i ] надо String(periodDisplay[ i ]) в строке 6
при том раскладе , что сейчас (без Стринг) компилятор берет элемент массива как символ, а символ с кодом 6 , 2 и т.п. это непечатные символы, почти матерные
 

ASM

★★★★✩✩✩
26 Окт 2018
1,548
299
не помогает, в коде все равно
HTML:
id='periodDisplay' value=''
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,222
1,291
Москва
Так, а если просто вывести в монитор порта полученную строку ?
а вторая переменная в GP.TEXT("periodDisplay", "", s); что означает ?
 

ASM

★★★★✩✩✩
26 Окт 2018
1,548
299
Так, а если просто вывести в монитор порта полученную строку ?
так и решил
а вторая переменная в GP.TEXT("periodDisplay", "", s); что означает ?
GP.TEXT(имя, подсказка, текст);

сделал так
C++:
String s;
String arrayToStr(uint8_t  *periodDisplay){
    uint8_t i=0;
  
    while (periodDisplay[i]!=255){
        s += String (periodDisplay[i]);
        i++;
        if (periodDisplay[i]!=255) s +=",";
    }
    Serial.print("S1 ");
    Serial.println(s);
    return s;
    Serial.print("S2 ");
    Serial.println(s);
}
C++:
void setup() {
String arrayToStr(uint8_t  *periodDisplay);
Serial.print("S3 ");
Serial.println(s);
}
получаю
Код:
S3
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,222
1,291
Москва
Странно..
Вот этот кода (чуть изменил о чем говорил) полностью работает:
C++:
uint8_t periodDisplay[6] = {6,2,2,2,2,255};

String arrayToStr(uint8_t  *periodDisplay){
    String s;
    uint8_t i=0;   
    while (periodDisplay[i]!=255){
        s += String(periodDisplay[i]);
        i++;
        if (periodDisplay[i]!=255) s +=",";
    }
    return s;
}
void setup() {
  Serial.begin(115200);
  Serial.println(arrayToStr(periodDisplay));
}

void loop() {
  // put your main code here, to run repeatedly:

}
Вывод:
Код:
20:09:20.397 -> 6,2,2,2,2
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,222
1,291
Москва
Это только в твоем варанте. В начале функции arrayToStr надо либо обнулить переменную s либо сделать ее локальной, как у меня
 

ASM

★★★★✩✩✩
26 Окт 2018
1,548
299
Точно, сейчас же другая переменная используется на печать, можно вернуть тогда ее локально...
Завтра попробую)
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137

@Старик Похабыч, на сколько я знаю будет работать даже без String(); судя по порталу там всё так пашет, ничего не преобразуется...

@ASM, кажется что то сильно усложняешь, надо было просто вставить 2 функции, подключать их потом то в конструктор, то в актион.
 

ASM

★★★★✩✩✩
26 Окт 2018
1,548
299
кажется что то сильно усложняешь
понял, исправил)
а вот как обратно преобразовать?)
C++:
      String ord;
      portal.copyString("orderDisplay", ord);
      c.orderDisplay = StrToArray(ord);
нужны же три аргумента?)
C++:
void StrToArray(const String& str,uint8_t* outArr,int length){
    String s;
    s += str;
    s += ", ";
    for (int i=0;i<length-1;i++){
        if (s.length()>2){
            outArr[i]=(s.substring(0,s.indexOf(",")-1).toInt();
            s=s.substring(s.indexOf(",")+1);
        } else {
            outArr[i]=255;
        }
    }
    outArr[length-1]=255;
}
вынести аргументы в функцию?)
получается: incompatible types in assignment
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137

@ASM, конечно 3, надо длину массива. Можно и без. В функции посчитай количество запятых, потом очисти память по указателю. Далее в указателе разверни новый массив нужной длины и заполни его... Но я же специально не стал тебе такой вариант писать, ты же структуры юзаеешь.
 

ASM

★★★★✩✩✩
26 Окт 2018
1,548
299
@DAK, а по факту сама функция не может посчитать, сколько пришло запятых в строке?)
тут структуры не помешают, на крайний случай, если не будет работать со структурой, вынесу отдельно)

C++:
      char b;
      portal.copyStr("periodDisplay", b);
      char* a = &b;
      c.periodDisplay = *a;
что-то похожее может сделать?)
 
Изменено:

DAK

★★★✩✩✩✩
8 Окт 2020
517
137

@ASM,
Тебе написать функцию которая по двум переменным работает или ты сам будешь это делать? Можно всё, у меня есть подобные функции, но только н сейчас. Могу завтра с утра. Надо или сам сделаешь?
 

ASM

★★★★✩✩✩
26 Окт 2018
1,548
299
@DAK, я не осилю) выше написал отличный вариант, но там char в char*
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
@ASM, Рука лицо.
C++:
void StrToArray(const String& str,uint8_t* outArr){
    String s;
    s += str;
// Добавляем запятую для упрощения задачи
    s += ",";
    uint8_t n = 0;
// Считаем количество запятых (количествр переменных)
    for (uint8_t i=0; i < s.length(); i++){
        if (str[i] == ',') n++;
    }
// Удаляем массив по указателю
    delete [] outArr;
    outArr = nullptr;
// Создаём новый массив по указателю +1 (для маркера конца на 1 больше)
    outArr = new uint8_t[n+1];
// как и раньше, извлекаем - наполняем...
    for (int i=0;i<n-1;i++){
            outArr[i]=(s.substring(0,s.indexOf(",")-1).toInt();
            s=s.substring(s.indexOf(",")+1);
    }
    outArr[n]=255;
}
Как то так, гарантий нет, я не компилировал, если что код поправишь

UOD: Немного подкорректировал, должно работать
 
Изменено:
  • Лойс +1
Реакции: ASM

ASM

★★★★✩✩✩
26 Окт 2018
1,548
299
Как то так, гарантий нет, я не компилеровал, если что код поправишь
ладно, спасибо, у меня сейчас большая проблема) ругается жестко на библиотеку портала)
пойду проветрюсь, буду позже разбираться))
 

ASM

★★★★✩✩✩
26 Окт 2018
1,548
299
@DAK, сейчас с esp8266 занимаюсь) все работало) решил добавить свою функцию в код, выдало ошибку, вернул как было и посыпалось) сразу ругается на амперсанд при подключении библиотеки...
Сейчас подчищаю хвосты и переустановлю библиотеку и софт) версия 2.0.1 завелась у меня сегодня и компилировалась даже, но вижу хвосты от 2.0.0 и 2.0.0 beta

p.s. избавился от багов)
 
Изменено:

ASM

★★★★✩✩✩
26 Окт 2018
1,548
299
опять просит два аргумента)
пробовал вручную передавать
C++:
String prd;
portal.copyString("periodDisplay", prd);
c.periodDisplay = StrToArray(prd, 255);
ошибка конвертации int в uint*
C++:
uint8_t* out = 255;
c.periodDisplay = StrToArray(prd, out);
аналогично

если внести второй аргумент в функцию
C++:
void StrToArray(const String& str) {
  String s;
  uint8_t* outArr;
  s += str;
  // Добавляем запятую для упрощения задачи
  s += ",";
  uint8_t n = 0;
  // Считаем количество запятых (количествр переменных)
  for (uint8_t i = 0; i < s.length(); i++) {
    if (str[i] == ',') n++;
  }
  // Удаляем массив по указателю
  delete[] outArr;
  outArr = nullptr;
  // Создаём новый массив по указателю +1 (для маркера конца на 1 больше)
  outArr = new uint8_t[n + 1];
  // как и раньше, извлекаем - наполняем...
  for (int i = 0; i < n - 1; i++) {
            outArr[i]=(s.substring(0,s.indexOf(",")-1).toInt());
            s=s.substring(s.indexOf(",")+1);
  }
  outArr[n] = 255;
}
Код:
error: incompatible types in assignment of 'void' to 'uint8_t [6] {aka unsigned char [6]}'
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
Не, это через чур! Тебе в функцию надо передать указатель и строку. Функция строку переделает в массив.
надо так вызывать:
C++:
String prd;
portal.copyString("periodDisplay", prd);
StrToArray(prd, c.periodDisplay);
Я правда уже не совсем понимаю что ты пытаешься сделать..... c.periodDisplay должно быть uint8_t*, либо переделать типы в функции.... Нельзя же так, надо же понимать, что ты делаешь, если в функции нет return, то в саму функцию ничего не возвращается.