errore nella comunicazione tra raspberry e arduino

Ciao a tutti,

ho un problema nella comunicazione Serial tramite cavo usb tra un raspberry Pi e un arduino nano. In effetti il mio sketch funziona, solo che dopo un po' di tempo di inattività, il primo comando inviato all'arduino blocca il sistema. In effetti la led sull'arduino si accende al passaggio delle informazioni, ma non sortisce alcun effetto.
Dal raspberry, utilizzando la libreria serial di wiringPi, invio una sequenza di informazioni byte per byte, l'arduino passa ogni byte ad una funzione che interpreta l'informazione in base al valore dell'indice di un contatore. La sequenza di inizio è 111111 e quella di fine 000000, quindi quando l'informazione è 1 ed il contatore ha un valore tra 0 e 5 vuol dire che c'è un inizio di sequenza. Il tempo di esecuzione della funzione non crea problemi anche perchè a parte un ciclo for ha un tempo di esecuzione lineare, infatti funziona perfettamente anche con un intervallo (dettato dal raspberry) di 20ms tra una sequenza di informazioni e l'altra. Sull'arduino utilizzo una libreria per la gestione di led con processore ws2811, e grazie a un interfaccia grafica html connessa ad un server nodejs posso cambiare istantaneamente il colore di una o più serie di leds su uno o più sistemi raspberry-arduino connessi in socket al node. Non capisco proprio perché dopo qualche ora di inattività la prima sequenza di informazioni blocca il sistema, nonostante l'integrità dell'informazione, e comunque anche se l'informazione fosse corrotta il sistema dovrebbe azzerare il contatore e attendere per una nuova sequenza di inizio.

Ecco il mio codice:

#include <FastLED.h>

#define NUM_LEDS5 12
#define NUM_LEDS6 30

#define DATA_PIN5 5
#define DATA_PIN6 6

#define MAX_LEDS 150

#define MAX_PIN 13

typedef struct str_leds{
  CRGB leds[MAX_LEDS];
  uint8_t num_led;
  uint8_t single;
  uint8_t multiple;
} str_leds;

static str_leds *pin[13] = {0};
static uint8_t colors[3];
static int counter = 0;
static uint8_t num_bandeau = 0;
static uint8_t bandeau_id[13] = {0};
static uint8_t bandeau_index = 0;
static uint8_t single_leds[13] = {0};
static uint8_t single_leds_index = 0;
static uint8_t multiple_leds[13] = {0};
static uint8_t multiple_leds_index = 0;
static uint8_t actual_single = 0;
static uint8_t actual_multiple = 0;
static uint8_t temp_single_index = 0;
static uint8_t tot_single = 0;
static uint8_t temp_multiple_index = 0;
static uint8_t tot_multiple = 0;
static uint8_t start = 0;
static uint8_t led_start = 0;
static uint8_t led_end = 0;
static uint8_t end_string = 0;

static uint8_t readed = 0;
static uint8_t i = 0;

void setup() {
  Serial.begin(9600);

  pin[DATA_PIN5] = (str_leds *)malloc(sizeof(str_leds));
  pin[DATA_PIN5]->leds[NUM_LEDS5] = {0};
  pin[DATA_PIN5]->num_led = NUM_LEDS5;

  pin[DATA_PIN6] = (str_leds *)malloc(sizeof(str_leds));
  pin[DATA_PIN6]->leds[NUM_LEDS6] = {0};
  pin[DATA_PIN6]->num_led = NUM_LEDS6;

  FastLED.addLeds<WS2811, DATA_PIN5, RGB>(pin[DATA_PIN5]->leds, NUM_LEDS5);
  FastLED.addLeds<WS2811, DATA_PIN6, RGB>(pin[DATA_PIN6]->leds, NUM_LEDS6);
}

void loop(){

  if(Serial.available()){

    readline(Serial.read(), 255);

  }

}

int readline(int readch, int len)
{
  i = 0;
     if((counter<=5)&&(readch==1)){
       counter++;
     }else if((counter>5)&&(counter<=8)){
       colors[counter-6] = readch;
       counter++;
     }else if((counter>8)&&(counter < len)){
                  if(counter==9){
                    num_bandeau = readch;
                  }else if(bandeau_index<num_bandeau){
                      bandeau_id[bandeau_index] = readch;
                      bandeau_index++;
                  }else if(single_leds_index<num_bandeau){
                      if(readch!=0){
                        pin[bandeau_id[single_leds_index]]->single = readch;
                        single_leds[tot_single] = bandeau_id[single_leds_index];
                        tot_single++;
                      }
                      single_leds_index++;
                  }else if(multiple_leds_index<num_bandeau){
                      if(readch!=0){
                        pin[bandeau_id[multiple_leds_index]]->multiple = readch;
                        multiple_leds[tot_multiple] = bandeau_id[multiple_leds_index];
                        tot_multiple++;
                      }
                      multiple_leds_index++;
                  }else if(actual_single<tot_single){

                      if((single_leds[actual_single])&&(pin[single_leds[actual_single]]->single)){

                        pin[single_leds[actual_single]]->leds[readch] = CRGB( colors[0], colors[1], colors[2]);

                        temp_single_index++;
                        if(temp_single_index==pin[single_leds[actual_single]]->single){
                          pin[single_leds[actual_single]]->single = 0;
                          actual_single++;
                          temp_single_index = 0;
                        }

                      }

                  }else if(actual_multiple<tot_multiple){

                      if((multiple_leds[actual_multiple])&&(pin[multiple_leds[actual_multiple]]->multiple)){
                        if(start==0){
                          start=1;
                          led_start = readch;

                        }else{
                          led_end = readch;
                          if((led_start<led_end)&&(led_start>=0)){
                            for(i=led_start; i<led_end; i++){
                              pin[multiple_leds[actual_multiple]]->leds[i] = CRGB( colors[0], colors[1], colors[2]);
                            }
                          }
                          start = 0;
                          temp_multiple_index++;

                          if(temp_multiple_index==pin[multiple_leds[actual_multiple]]->multiple){
                            pin[multiple_leds[actual_multiple]]->multiple = 0;
                            actual_multiple++;
                            temp_multiple_index = 0;
                          }

                        }
                      }
                  }else{

                      if(readch==0){
                        end_string++;
                      }else{
                        Serial.print("2");
                        softReset();
                        Serial.flush();
                        end_string = 0;
                        memset(colors, 0, sizeof colors);
                        counter = -1;
                        num_bandeau = 0;
                        memset(bandeau_id, 0, sizeof bandeau_id);

                        bandeau_index = 0;
                        memset(single_leds, 0, sizeof single_leds);
                        single_leds_index = 0;
                        memset(multiple_leds, 0, sizeof multiple_leds);
                        multiple_leds_index = 0;
                        actual_single = 0;
                        actual_multiple = 0;
                        temp_single_index = 0;
                        tot_single = 0;
                        temp_multiple_index = 0;
                        tot_multiple = 0;
                        start = 0;
                        led_start = 0;
                        led_end = 0;
                      }


                      if(end_string==6){
                        end_string = 0;
                        FastLED.show();
                        memset(colors, 0, sizeof colors);
                        counter = -1;
                        num_bandeau = 0;
                        memset(bandeau_id, 0, sizeof bandeau_id);

                        bandeau_index = 0;
                        memset(single_leds, 0, sizeof single_leds);
                        single_leds_index = 0;
                        memset(multiple_leds, 0, sizeof multiple_leds);
                        multiple_leds_index = 0;
                        actual_single = 0;
                        actual_multiple = 0;
                        temp_single_index = 0;
                        tot_single = 0;
                        temp_multiple_index = 0;
                        tot_multiple = 0;
                        start = 0;
                        led_start = 0;
                        led_end = 0;
                        Serial.print("1");
                        Serial.flush();
                      }

                  }
              counter++;
     }else{

       Serial.print("2");
       softReset();
       Serial.flush();
       end_string = 0;
       memset(colors, 0, sizeof colors);
       counter = 0;
       num_bandeau = 0;
       memset(bandeau_id, 0, sizeof bandeau_id);

       bandeau_index = 0;
       memset(single_leds, 0, sizeof single_leds);
       single_leds_index = 0;
       memset(multiple_leds, 0, sizeof multiple_leds);
       multiple_leds_index = 0;
       actual_single = 0;
       actual_multiple = 0;
       temp_single_index = 0;
       tot_single = 0;
       temp_multiple_index = 0;
       tot_multiple = 0;
       start = 0;
       led_start = 0;
       led_end = 0;
     }
}

E questo è quello che ho sul raspberry

p = strtok (&buf[2]," ");
                             
     while (p != NULL){
         serialPutchar(fd, atoi(p));
         p = strtok (NULL, " ");
     }

dove buf è l'array buffer della sequenza ricevuta da node

Di primo acchito, prova a usare freeRam() all'interno del codice Arduino per vedere quanta SRAM liberà hai. Tieni conto che la dimensione del codice, una volta compilato, è fissa, ma la SRAM tu la occupi anche dinamicamente e su Arduino Uno è solo di 2Kb.

Anche il NANO ha solo 2KByte di RAM.

Ma malloc funziona su Arduino???

Sei sicuro di usare Serial.flush(); in modo corretto? Serial.flush() - Arduino Reference Flush non svuota il buffer di entrata.

Ciao Uwe

Grazie per avermi risposto,
in effetti avevo già utilizzato la funzione freeRam() che mi riportava un valore sempre costante, pero' (non ho la "o" accentata, tastiera francese) non ho mai verificato il valore al momento del bloccaggio. Normalmente, visto che dichiaro le mie variabili statiche, non dovrei incorrere in questo errore. Malloc funziona a quanto pare, penso che avrei avuto problemi di allocazione già in partenza, e la funzione flush come da definizione "Waits for the transmission of outgoing serial data to complete" penso sia usata in maniera corretta visto che segue Serial.print(), pero' potrei sbagliarmi. Comunque quella che ho postato è la versione finale del mio codice, quasi identica a quella che bloccava, e per il momento sembra non baggare. E' in funzione da ieri sera.

malloc e new esistono e funzionano su arduino, ma esso ti odierà. In olrte son spesso vittme di bug

static str_leds *pin[13] = {0};

a parte sta mania di usare 0 al posto di NULL, che distrugge la leggibilità (lo stesso direi di typedef, davvero sono stupito dal numero di persone a cui pesa il sedere scrivere struct ogni volta, rimarcando cosa diavolo stai combiando), puoi inizializzarlo sul posto evitando la maledetta malloc:

static const str_leds *pin[] = {NULL, NULL, NULL, NULL, NULL, &(struct str_leds){}, &(struct str_leds){}, NULL, NULL, NULL, NULL, NULL, NULL};

come puoi vedere uso un pratico trucco per creare una istanza della struttura anonima inizializzata con tutti i valori a NULL (se puntatori) o 0 (se numerici), con

(struct str_leds){}

(ovviemente l'inizializzazione è ricorsiva; in pratica non è altro che mettere a 0 tutti i byte usati dalla struttura)

e poi ne estraggo il puntatore col classico &

notare bene: ho reso l'array CONST, tanto mi pare che non lo modifichi mai, così rispami 2*13 byte.

OK, faccio subito le correzioni. Ti ringrazio veramente, purtroppo non è che io sia proprio un programmatore in C, ti faro' sapere se funziona

ah, sono andato pesante perchè hai usato dei costrutti che non tutti usano nel C, e quindi ho dato per scontato lo sapessi usare bene.

prossima volta userò la vasellina xD

questi cambiamenti sono solo di "pulizia", per evitare di usare la malloc.

sinceramente ora che ci penso ho un sacco paura per quei "memset", dovrei conreollare bene quello che ne fai; in oltre è veramente enorme l'uso di ram che fai, a che percentuale sei?

Ciao,

ho fatto le modificazioni che mi hai detto, ma ottengo questo errore

leds.cpp:33:67: error: expected primary-expression before ‘struct’
leds.cpp:33:67: error: expected ‘)’ before ‘struct’
leds.cpp:33:89: error: expected primary-expression before ‘struct’
leds.cpp:33:89: error: expected ‘)’ before ‘struct’root@JadisJade71:~#

Per quanto riguarda l'utilizzazione della ram, il risultato di freeRam() è 692 alla fine della lettura.
Il memset sull'array colors potrei anche toglierlo in realtà

accidenti, ho controllato e le strutture/unizio anonime sono standard C11 (anche se GCC al pc pare supportarle lo stesso anche quando di defualt usava C99 -ora usa C11-) e arduiono non lo supporta (la 1.6.qualcosa dovrebbe), e anche il flag -fms-extensions non sembra funzionare. A mia discolpa se provi a PC funziona, e anche sugli ARM :slight_smile:

quindi risolvi in un modo un poco meno pulito:

struct str_leds{
  CRGB leds[MAX_LEDS];
  uint8_t num_led;
  uint8_t single;
  uint8_t multiple;
} str_leds_A, str_leds_B;

static const str_leds *pin[] = {NULL, NULL, NULL, NULL, NULL, &str_leds_A, &str_leds_B, NULL, NULL, NULL, NULL, NULL, NULL};

ma guarda tutti quei null, ognuno di essi sono 2 byte sprecati, e son brutti a vedere...senza contare che rischi di disallinearti dalle define DATA_PIN5 e DATA_PIN6.. risolviamo con una enum!

enum cardsuit {
   DATA_PIN5,
   DATA_PIN6
};

struct str_leds{
  //CRGB leds[MAX_LEDS];
  uint8_t num_led;
  uint8_t single;
  uint8_t multiple;
} str_leds_A, str_leds_B;

static const str_leds *pin[] = {
  &str_leds_A, 
  &str_leds_B
};

notare, altra cosa che non ti fa fare (ma pare perchè usa il comnpilatore c++ invece che il c) è

enum cardsuit {
   DATA_PIN5,
   DATA_PIN6,
   DATA_PIN8 = 9 //forziamo il valore 9 alla enum
};

struct str_leds{
  //CRGB leds[MAX_LEDS];
  uint8_t num_led;
  uint8_t single;
  uint8_t multiple;
} str_leds_A, str_leds_B;

static const str_leds *pin[] = {
  [DATA_PIN5] = &str_leds_A, 
  [DATA_PIN6] = &str_leds_B,
  [DATA_PIN8] = &str_leds_C, //dato data_pin8 è forzato a 8, viene creato un array di 9 elementi!
};

Ciao,

ho cercato di fare come mi hai detto tu, solo che sia nel secondo caso che nel terzo ricevo errori di compilazione, sulla enum non posso attribuire valori alle variabili, quindi per adesso ho lasciato quei null schifosi, ma senza usare la malloc. Io utilizzo la versione di arduino IDE 1.0.1 installata su raspberry.

Uno degli errori di compilazione è

sorry, unimplemented: non-trivial designated initializers not supported

ma ho cercato diverse combinazioni, e quella che mi permette di compilare comunque non attribuisce i valori 5 e 6 alle variabili DATA_PIN5 e DATA_PIN6. E non posso dichiarare l'array di strutture costante, mi da errore di compilazione.
Perché nella struct hai commentato CRGB leds[MAX_LEDS]; ?

Ho comunque eliminato i memset, prima mi servivano per fermarmi in un ciclo quando trovavo un valore uguale a 0, adesso non ne ho più bisogno. Ho anche eliminato alcune variabili che non mi servivano più e il ritorno di freeRam adesso è 706.

Purtroppo le mie conoscenze in C sono quelle di un esame passato molto tempo fa, e con un brutto voto. Se scrivo

enum cardsuit {
DATA_PIN5,
DATA_PIN6
};

come fa a sapere che le variabili valgono rispettivamente 5 e 6?
Se scrivo questo:

enum cardsuit {
DATA_PIN5 = 5,
DATA_PIN6 = 6
};

mi da errore (forse non si puo' neanche fare, non lo so)

Questo è il mio attuale codice:

#include <FastLED.h>

#define NUM_LEDS5 12
#define NUM_LEDS6 30

#define DATA_PIN5 5
#define DATA_PIN6 6

#define MAX_LEDS 150

struct str_leds{
  CRGB leds[MAX_LEDS];
  uint8_t single;
  uint8_t multiple;
} str_leds_A, str_leds_B;

static str_leds *pin[] = {NULL, NULL, NULL, NULL, NULL, &str_leds_A, &str_leds_B, NULL, NULL, NULL, NULL, NULL, NULL};

static uint8_t colors[3];
static int counter = 0;
static uint8_t num_bandeau = 0;
static uint8_t bandeau_id[13] = {0};
static uint8_t bandeau_index = 0;
static uint8_t single_leds[13] = {0};
static uint8_t single_leds_index = 0;
static uint8_t multiple_leds[13] = {0};
static uint8_t multiple_leds_index = 0;
static uint8_t actual_single = 0;
static uint8_t actual_multiple = 0;
static uint8_t temp_single_index = 0;
static uint8_t tot_single = 0;
static uint8_t temp_multiple_index = 0;
static uint8_t tot_multiple = 0;
static uint8_t start = 0;
static uint8_t led_start = 0;
static uint8_t led_end = 0;
static uint8_t end_string = 0;
static uint8_t i = 0;

void setup() {
  Serial.begin(9600);

  //pin[DATA_PIN5] = (str_leds *)malloc(sizeof(str_leds));
  pin[DATA_PIN5]->leds[NUM_LEDS5] = {0};

  //pin[DATA_PIN6] = (str_leds *)malloc(sizeof(str_leds));
  pin[DATA_PIN6]->leds[NUM_LEDS6] = {0};

  FastLED.addLeds<WS2811, DATA_PIN5, RGB>(pin[DATA_PIN5]->leds, NUM_LEDS5);
  FastLED.addLeds<WS2811, DATA_PIN6, RGB>(pin[DATA_PIN6]->leds, NUM_LEDS6);
}

void loop(){

  if(Serial.available()){
    readline(Serial.read(), 255);
  }
}

int readline(int readch, int len)
{
  i = 0;
     if((counter<=5)&&(readch==1)){
       counter++;
     }else if((counter>5)&&(counter<=8)){
       colors[counter-6] = readch;
       counter++;
     }else if((counter>8)&&(counter < len)){
                  if(counter==9){
                    num_bandeau = readch;
                  }else if(bandeau_index<num_bandeau){
                      bandeau_id[bandeau_index] = readch;
                      bandeau_index++;
                  }else if(single_leds_index<num_bandeau){
                      if(readch!=0){
                        pin[bandeau_id[single_leds_index]]->single = readch;
                        single_leds[tot_single] = bandeau_id[single_leds_index];
                        tot_single++;
                      }
                      single_leds_index++;
                  }else if(multiple_leds_index<num_bandeau){
                      if(readch!=0){
                        pin[bandeau_id[multiple_leds_index]]->multiple = readch;
                        multiple_leds[tot_multiple] = bandeau_id[multiple_leds_index];
                        tot_multiple++;
                      }
                      multiple_leds_index++;
                  }else if(actual_single<tot_single){

                      if((single_leds[actual_single])&&(pin[single_leds[actual_single]]->single)){

                        pin[single_leds[actual_single]]->leds[readch] = CRGB( colors[0], colors[1], colors[2]);

                        temp_single_index++;
                        if(temp_single_index==pin[single_leds[actual_single]]->single){
                          pin[single_leds[actual_single]]->single = 0;
                          actual_single++;
                          temp_single_index = 0;
                        }

                      }

                  }else if(actual_multiple<tot_multiple){

                      if((multiple_leds[actual_multiple])&&(pin[multiple_leds[actual_multiple]]->multiple)){
                        if(start==0){
                          start=1;
                          led_start = readch;

                        }else{
                          led_end = readch;
                          if((led_start<led_end)&&(led_start>=0)){
                            for(i=led_start; i<led_end; i++){
                              pin[multiple_leds[actual_multiple]]->leds[i] = CRGB( colors[0], colors[1], colors[2]);
                            }
                          }
                          start = 0;
                          temp_multiple_index++;

                          if(temp_multiple_index==pin[multiple_leds[actual_multiple]]->multiple){
                            pin[multiple_leds[actual_multiple]]->multiple = 0;
                            actual_multiple++;
                            temp_multiple_index = 0;
                          }

                        }
                      }
                  }else{

                      if(readch==0){
                        end_string++;
                      }else{
                        /*Serial.print("2");
                        Serial.flush();*/
                        end_string = 0;
                        //memset(colors, 0, sizeof colors);
                        counter = -1;
                        num_bandeau = 0;
                        //memset(bandeau_id, 0, sizeof bandeau_id);

                        bandeau_index = 0;
                        //memset(single_leds, 0, sizeof single_leds);
                        single_leds_index = 0;
                        //memset(multiple_leds, 0, sizeof multiple_leds);
                        multiple_leds_index = 0;
                        actual_single = 0;
                        actual_multiple = 0;
                        temp_single_index = 0;
                        tot_single = 0;
                        temp_multiple_index = 0;
                        tot_multiple = 0;
                        start = 0;
                        led_start = 0;
                        led_end = 0;
                      }


                      if(end_string==6){
                        end_string = 0;
                        FastLED.show();
                        //memset(colors, 0, sizeof colors);
                        counter = -1;
                        num_bandeau = 0;
                        //memset(bandeau_id, 0, sizeof bandeau_id);
                        bandeau_index = 0;
                        //memset(single_leds, 0, sizeof single_leds);
                        single_leds_index = 0;
                        //memset(multiple_leds, 0, sizeof multiple_leds);
                        multiple_leds_index = 0;
                        actual_single = 0;
                        actual_multiple = 0;
                        temp_single_index = 0;
                        tot_single = 0;
                        temp_multiple_index = 0;
                        tot_multiple = 0;
                        start = 0;
                        led_start = 0;
                        led_end = 0;
                        /*Serial.print("1");
                        Serial.print(freeRam());
                        Serial.flush();*/

                      }

                  }
              counter++;
     }else{
       /*Serial.print("2");
       Serial.flush();*/
       end_string = 0;
       //memset(colors, 0, sizeof colors);
       counter = 0;
       num_bandeau = 0;
       //memset(bandeau_id, 0, sizeof bandeau_id);
       bandeau_index = 0;
       //memset(single_leds, 0, sizeof single_leds);
       single_leds_index = 0;
       //memset(multiple_leds, 0, sizeof multiple_leds);
       multiple_leds_index = 0;
       actual_single = 0;
       actual_multiple = 0;
       temp_single_index = 0;
       tot_single = 0;
       temp_multiple_index = 0;
       tot_multiple = 0;
       start = 0;
       led_start = 0;
       led_end = 0;
     }
}

/*int freeRam ()
{
  extern int __heap_start, *__brkval;
  int v;
  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}*/

sorry, unimplemented: non-trivial designated initializers not supported

eh, infatti ho scritto che NON te la fa fare, ma in teoria il C dice che si pul. che noioso questo compilatore!! :smiling_imp:

E non posso dichiarare l'array di strutture costante, mi da errore di compilazione.

male, vuol dire che lo stai modificando da qualche parte (ne sono certo che funziona, questo) quindi visto, già un baco lhai beccato! hai cancellato la part di malloc?

Perché nella struct hai commentato CRGB leds[MAX_LEDS]; ?

perchè non ho installato la libreria fastLed o quel che serve

come fa a sapere che le variabili valgono rispettivamente 5 e 6?

infatti se non dici niente partono da 0 e vanno a crescere. Quindi han valore 0 e 1, e se al codice va bene, allora eviti di creare un array smisurato.

Se invece usi in qualche modo la posizione in modo hardcodato (non ho guardato) allora puoi dichiarare anche DATA_PIN0, DATA_PIN1, etc tanto le enum vanno in flash e non in ram (sono const per definizione).ncellato la parte di malloc=

Si ho tolto la chiamata a malloc.
Nella funzione readline modifico il valore delle variabili all'interno delle strutture, quindi effettivamente non puo' essere costante.
Per quanto riguarda i NULL, ho pensato che potrei creare una lista di strutture, ognuna con un ID, ad esempio

str_leds_A->id = 5,
...

|

str_leds_B->id = 6
...

|

str_leds_B->id = 7
...

e quando ho bisogno della serie di led numero 5, che è connessa al pin 5 dell'arduino, scorro la lista fino a trovarla. Solo che ho paura di avere dei problemi sul tempo di esecuzione visto che dovrei ogni volta effettuare una ricerca, accedere direttamente all'indirizzo della struttura tramite l'indice dell'array pin mi sembra molto più rapido.

Quello di cui avrei bisogno in realtà è questo (ti premetto che forse ho scritto una cazzata):

enum codesuit{
DATA_PIN5 = 5,
DATA_PIN6
}

struct str_leds{
CRGB leds[MAX_LEDS];
uint8_t single;
uint8_t multiple;
} str_leds_A, str_leds_B;

static str_leds *pin[] = {
[DATA_PIN5] = &str_leds_A,
[DATA_PIN6] = &str_leds_B
}

Solo che ottengo questo

two or more data types in declaration of ‘str_leds_A’
two or more data types in declaration of ‘str_leds_B’
etc.

Comunque ho avviato il processo ieri notte con il codice del mio ultimo post, e per adesso funziona, speriamo che non blocchi. Il problema è che blocca dopo n ore dall'ultimo utilizzo, all'inizio pensavo che ci fosse una specie di standby della porta USB, ma in realtà dopo il bloccaggio, anche se l'arduino non effettua alcuna azione, la led rossa si illumina comunque quando c'è un passaggio di dati. Pensi che la chiamata a malloc potesse causare questo problema? Comunque il fatto di aver tolto i memset puo' rivelarsi anche utilie penso

Nella funzione readline modifico il valore delle variabili all'interno delle strutture

no, l'array di puntato NON cambia mai. se poi cambiano i valori delle variabili puntate non centra nulla, l'importante è che non cerchi di modificare gli indirizzi puntati. riguarda bene cosa ti da errore!

unisci i 2 sistemi!

enum codesuit{
  DATA_PIN5,
  DATA_PIN6
}

struct str_leds{
  const uint8_t id; //quì metti l'id
  CRGB leds[MAX_LEDS];
  uint8_t single;
  uint8_t multiple;
} str_leds_A{5, {}, 0, 0}, str_leds_B{6, {}, 0, 0}; //quì inizializzo con gli id, non so se puoi usare const, in caso di errore toglilo.

static str_leds *pin[] = {
   &str_leds_A,
   &str_leds_B
}[quote]
Nella funzione readline modifico il valore delle variabili all'interno delle strutture
[/quote]

no, l'array di puntato NON cambia mai. se poi cambiano i valori delle variabili puntate non centra nulla, l'importante è che non cerchi di modificare gli indirizzi puntati. riguarda bene cosa ti da errore!


unisci i 2 sistemi!
[code]
enum codesuit{
  DATA_PIN5,
  DATA_PIN6
}

struct str_leds{
  const uint8_t id; //quì metti l'id
  CRGB leds[MAX_LEDS];
  uint8_t single;
  uint8_t multiple;
} str_leds_A{5, {}, 0, 0}, str_leds_B{6, {}, 0, 0}; //quì inizializzo con gli id, non so se puoi usare const, in caso di errore toglilo.

static str_leds *pin[] = {
   &str_leds_A,
   &str_leds_B
}

Ok, appena posso faccio le modifiche.

Comunque l'arduino continua a bloccarsi. Ogni tanto si sblocca accendendo le led con l'informazione che l'ha bloccato e riprende a funzionare. Non capisco proprio

non ho mica capito cosa intendi con il dire che si sblocca.

sinceramente non capisco nemmeno cosa vuoi fare con quel codice, il che non aiuta; probabilmente staiu scrivendo fuori da qualche array, e sul lungo andare la cosa ti frega.

In poche parole ho creato un' interfaccia grafica in html che mi permette di creare una rete di sensori, led, relay, etc. registrando tutti i parametri in un database. Questo database è letto da un server nodejs che comunica con un' altra interfaccia grafica (quella dell'utilizzatore) dalla quale oltre ai vari elementi, come pulsanti virtuali (creati dall'interfaccia admin) per attivare relay, immagini relative alla temperatura di un sensore, e cosi' via, ci sono anche delle palettes di colori con cursore che permettono di cambiare il colore di una o più serie di led. Il server node cattura l'informazione dall'utilizzatore tramite il modulo socket.io e ridistribuisce tramite socket udp l'informazione al raspbberry a cui l'azione è legata. Il raspberry poi a seconda dell'informazione puo' gestire gli apparecchi che sono attaccati a lui o ridistribuire altrove, tipo all'arduino.
L'arduino riceve un ciclo di informazioni in byte che generano l'azione finale, cioé quella di accendere determinati punti led su una o più serie di led

Sull'arduino il counter è quello che gestisce i vari livelli di trattamento dell'informazione
L'informazione è composta cosi'

111111 vuol dire che c'è un inizio, nel codice

if((counter<=5)&&(readch==1)){
    counter++;
}

dopo aver verificato che sto per ricevere una seria di informazioni, registro il mio colore, sono tre valori r g b, cioé con counter 6 7 8

else if((counter>5)&&(counter<=8)){
  colors[counter-6] = readch;  //counter-6 vale la prima volta 0, poi 1 e poi 2
  counter++;
}

dopo, quando il counter è compreso tra 8 e un numero di sicurezza per evitare che in caso di errore faccia un loop infinito, ricevo come informazione il numero di strip di leds da trattare

else if((counter>8)&&(counter < len)){
      if(counter==9){
          num_bandeau = readch;  //bandeau è strip in francese, mi sa che cambio nome
      }

poi, registro gli indici delle serie da trattare in un array. Ogni indice mi permetterà di chiamare l'array pin che contiene i parametri di ogni strip:

CRGB leds[MAX_LEDS] = l'array di colori di ogni led della serie
uint8_t single = numero di led da trattare singolarmente, quando non è per forza una catena, tipo
la led 1 - 5 - 10 - 12 - ..., è soltanto la quantità di led da trattare singolarmente,
servirà dopo
uint8_t multiple = numero di led da trattare in un ciclo perché si susseguono,
tipo le led da 1 fino a 100, è soltanto la quantità di cicli da trattare
servirà dopo

   else if(bandeau_index<num_bandeau){
      bandeau_id[bandeau_index] = readch;
      bandeau_index++;
   }

dopo ricevo un informazione su quante led trattare singolarente, e quante in un valori compresi tra x e y

   else if(single_leds_index<num_bandeau){
      if(readch!=0){
         pin[bandeau_id[single_leds_index]]->single = readch;
         single_leds[tot_single] = bandeau_id[single_leds_index];
         tot_single++;
      }
      single_leds_index++;
   }else if(multiple_leds_index<num_bandeau){
      if(readch!=0){
         pin[bandeau_id[multiple_leds_index]]->multiple = readch;
         multiple_leds[tot_multiple] = bandeau_id[multiple_leds_index];
         tot_multiple++;
      }
      multiple_leds_index++;
   }

Dopo, in base al numero di led da gestire singolarmente, e poi al numero di fourchettes tra due valori

   else if(actual_single<tot_single){

      if((single_leds[actual_single])&&(pin[single_leds[actual_single]]->single)){
         pin[single_leds[actual_single]]->leds[readch] = CRGB( colors[0], colors[1], colors[2]);
         temp_single_index++;
         if(temp_single_index==pin[single_leds[actual_single]]->single){
            pin[single_leds[actual_single]]->single = 0;
            actual_single++;
            temp_single_index = 0;
         }

      }

   }else if(actual_multiple<tot_multiple){

      if((multiple_leds[actual_multiple])&&(pin[multiple_leds[actual_multiple]]->multiple)){
         if(start==0){
            start=1;
            led_start = readch;
      }else{
         led_end = readch;
         if((led_start<led_end)&&(led_start>=0)){
            for(i=led_start; i<led_end; i++){
            pin[multiple_leds[actual_multiple]]->leds[i] = CRGB( colors[0], colors[1], colors[2]);
         }
      }
      start = 0;
      temp_multiple_index++;

      if(temp_multiple_index==pin[multiple_leds[actual_multiple]]->multiple){
         pin[multiple_leds[actual_multiple]]->multiple = 0;
         actual_multiple++;
         temp_multiple_index = 0;
      }

  }

Poi verifico che ci sia una chiusura della totalità dell'informazione con readch che è 6 volte consecutive 0, se i valori combaciano allora accendo le leds con FastLED.show(), nel caso contrario tutti i valori vengono reinizializzati, incluso counter e il ciclo ricomincia

}else{

                      if(readch==0){
                        end_string++;
                      }else{
                        /*Serial.print("2");
                        Serial.flush();*/
                        end_string = 0;
                        //memset(colors, 0, sizeof colors);
                        counter = -1;
                        num_bandeau = 0;
                        //memset(bandeau_id, 0, sizeof bandeau_id);

                        bandeau_index = 0;
                        //memset(single_leds, 0, sizeof single_leds);
                        single_leds_index = 0;
                        //memset(multiple_leds, 0, sizeof multiple_leds);
                        multiple_leds_index = 0;
                        actual_single = 0;
                        actual_multiple = 0;
                        temp_single_index = 0;
                        tot_single = 0;
                        temp_multiple_index = 0;
                        tot_multiple = 0;
                        start = 0;
                        led_start = 0;
                        led_end = 0;
                      }


                      if(end_string==6){
                        end_string = 0;
                        FastLED.show();
                        //memset(colors, 0, sizeof colors);
                        counter = -1;
                        num_bandeau = 0;
                        //memset(bandeau_id, 0, sizeof bandeau_id);
                        bandeau_index = 0;
                        //memset(single_leds, 0, sizeof single_leds);
                        single_leds_index = 0;
                        //memset(multiple_leds, 0, sizeof multiple_leds);
                        multiple_leds_index = 0;
                        actual_single = 0;
                        actual_multiple = 0;
                        temp_single_index = 0;
                        tot_single = 0;
                        temp_multiple_index = 0;
                        tot_multiple = 0;
                        start = 0;
                        led_start = 0;
                        led_end = 0;
                        /*Serial.print("1");
                        Serial.print(freeRam());
                        Serial.flush();*/
                      }

                  }
              counter++;
}

Dopodiché c'è la seconda eccezione, cioé il caso in cui counter > len o che la sequenza di inizio era errata

}else{
       /*Serial.print("2");
       Serial.flush();*/
       end_string = 0;
       //memset(colors, 0, sizeof colors);
       counter = 0;
       num_bandeau = 0;
       //memset(bandeau_id, 0, sizeof bandeau_id);
       bandeau_index = 0;
       //memset(single_leds, 0, sizeof single_leds);
       single_leds_index = 0;
       //memset(multiple_leds, 0, sizeof multiple_leds);
       multiple_leds_index = 0;
       actual_single = 0;
       actual_multiple = 0;
       temp_single_index = 0;
       tot_single = 0;
       temp_multiple_index = 0;
       tot_multiple = 0;
       start = 0;
       led_start = 0;
       led_end = 0;
     }
}

Per quanto possa sembrare bizzarro, non so se ci sono altre maniere per gestire un'informazione dinamica, e comunque funziona benissimo, ho fatto una funzione che lancia un'informazione ogni 40ms dal server node e non blocca mai, e nel caso di data corrotto ci sono comunque le eccezioni. Il problema sta quando non lo manipolo per un po' di tempo (anche 12 ore tipo), la prima informazione mi corrompe il sistema. Questa stessa informazione dopo n ore viene finalmente analizzata, infatti il colore delle led cambia inaspettatamente, ma solo quell'informazione e non tutte quelle che l'hanno seguita. All'inizio pensavo a un problema di bufferizzazione, ma avrebbe dovuto farmelo quando manipolo il sistema in maniera continua, e comunque il if(Serial.available()) dovrebbe svuotare il buffer

Dimenticavo di dire che ho due raspberry con due arduino connessi in usb, e il problema è lo stasso, quindi penso comunque che ci sia un problema nel codice