Problemi con array e cicli for

buongiorno,
ho due Arduino mkr che comunicano via seriale, uno dei due riceve i dati via LoRa da alcuni sensori e li invia al secondo via seriale per essere elaborati.
nell'arduino che riceve riempio un array di char ma il problema più grande sembra svuotarlo!
avrei bisogno di separare i dati contenuti nell'array in alcune variabili, ma appena uso un ciclo for per mettere mano all'array tutto si blocca!, devo mettere persino l'arduino in boot per poterlo riprogrammare.


char dati[60];
int i=0;
bool test=false;
String prova;



void setup() {
  Serial.begin(115200);
  Serial1.begin(115200);
  delay(1500); 
}

void loop() {
   i=0;
   while(Serial1.available()) {
    dati[i]=(char) Serial1.read();
    Serial.print(dati[i]);
    test=true;
    i++;
  }
  
  if (test==true){
    test=false;
    Serial.println("");
  }
  for(int j=0; j=<10; j++){
    prova=+ dati[j];
    delay(1);
  }
  Serial.println(prova);

}

non so veramente dove sbattere la testa...
grazie in anticipo

In questo ciclo:

... NON controlli mai il valore dell'indice i. Se, per qualche strano motivo, ricevi più 60 caratteri l'indice dell'array va oltre il limite e sporchi la memoria con risultati imprevedibili. Prova a stampare anche il valore di i e vedi a quanto arriva ... :roll_eyes:

Altra cosa ... se eviti di usare la classe String è ancora meglio ...

Guglielmo

sono sicurissimo di non superare i 60 caratteri!
eh non saprei come non usarla la classe string...

aggiungendo <= non si blocca più, solo che dentro la variabile prova ora ho i valori in ascii decimali, e non so come tradurli :frowning:

NON puoi essere "sicurissimo" ... in quel tipo di cicli, con array, il controllo sull'indice è obbligatorio per evitare spiacevoli sorprese!

... semplicemente STUDIANDO ... abbiamo detto 1000 volte di usare le funzioni che mette a disposizione la AVR libc (sempre automaticamente inclusa e resa disponibile) ed, in particolare, quelle che si trovano in <string.h> dove c'è tutto quello che serve.

... anche perché j =< 10 è una forma errata ... :roll_eyes:

... in che senso? Se stampi "prova" cosa ti stampa?

Guglielmo

stampo: 8444495453535354575454

invece che: T,16555696

Anche questa forma non è propriamente corretta. Prova con +=

1 Like

ho provato ma senza variazioni

In ogni caso, anche li, la forma corretta per concatenare è += ...
... vogliamo studiarli i reference o no ?

Guglielmo

char dati[60];
int i=0;
bool test=false;
String prova;



void setup() {
  Serial.begin(115200);
  Serial1.begin(115200);
  delay(1500); 
}

void loop() {
   i=0;
   prova="";
   while(Serial1.available()) {
    dati[i]=(char) Serial1.read();
    Serial.print(dati[i]);
    test=true;
    i++;
  }

  
  if (test==true){
    test=false;
    Serial.println("");
   for(int j=0; j<=10; j++){
    prova=+ dati[j];
    Serial.print(prova);
    delay(1);
  }
  Serial.println("");
  }
  

}

Così non ci sono più equivoci

A parte il =+ che è rimasto e non so perché funzioni, cosa vedi se stampi dati?

questo

Prima prova:

  1. correggi quel =+ in += che è la forma corretta.

  2. eventualmente prova a mettere prova += (char) dati[j]; anche se non dovrebbe servire ... :roll_eyes:

Guglielmo

provato, non è cambiato nulla

Vedi 8444495453535354575454 sia stampando dati che prova?

se stampo vedo:

dati=T,16555696
prova=8444495453535354575454

Guarda, ho provato al volo questo codice:

char pippo[60] = "ABCDERFGHIJKLMNO";
String pluto;
int i;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  for (i=0; i<10; i++) {
    pluto += pippo[i];
  }
  Serial.println (pluto);

}

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

}

... fa esattamente quello che dovrebbe fare (stampa ABCDEFGHI) ... quindi ... copia ed incolla ESATTAMENTE il codice che stai usando perché c'è qualche cosa che non quadra ... :roll_eyes:

Guglielmo

AAAhhhhh gpb01 che usa la classe string... adesso lo dico a tutti...

@nocentini invece di Serial.print dentro il while prova a mettere un unico Serial.println subito fuori dal while. Stampa la stessa cosa?

:joy: :joy: :joy: ... solo per questa prova, mai usata altrimenti (anche perché i compilatori XC di Microchip, che in prevalenza uso, sono 'C' e NON 'C++' e quindi non ce l'ho proprio :wink:)

Guglielmo

Mi viene un dubbio ... non è che su MKR (ATSAMD21, quindi ARM) il char di base è unsigned e lo tratta come un numero? :roll_eyes:

Non toccherà mettere signed char dati[60]; ? :thinking:

Guglielmo

Condivido in pieno, sistema il codice che poi parliamo di Serial.available(). Non è questo il modo di collezionare i dati.

Ciao.