Variabili Globali all' interno di una funzione

Ciao a tutti, sono nuovo del forum ed anche su arduino sono un novizio, C lasciamolo perdere :slight_smile:

Sto cercando di realizzare un display a matrice di led che possa visualizzare sia la data in formato esteso che eventuali
messaggi passati via seriale.

Al momento mi sono bloccato nello gestire i messaggi inviati sulla seriale.
In pratica la stringa inviata sulla seriale viene correttamente gestita al primo passaggio, ma non viene
inserita in quella che per me dovrebbe essere un variabile display_mess_1
Finché resto nella funzione mon_txtu, una volta letto la stringa dalla seriale, me la restituisce con il serialprint.
Però se vado a richiamare la stessa funzione per fare la stampa della variabile la restituisce vuota.

So che sto sbagliando qualcosa, ma non riesco a capire dove.
Qualche suggerimento?

Ciao
Marco

#define MON_BUF_LEN 128
char mon_buf[MON_BUF_LEN];
char *mon_curr;
uint8_t mon_buf_cnt = 0;

char *display_mess_1;
char *display_mess_2;

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

void loop()
{  
  if ( Serial.available() )
  {
    char c;
    c = Serial.read();
    if ( mon_buf_cnt >= MON_BUF_LEN-1 || c == '\n' || c == '\r'  )
    {
      exec();
      mon_buf_cnt = 0;
      mon_buf[mon_buf_cnt] = '\0';
    }
    else
    {
      mon_buf[mon_buf_cnt] = c;
      mon_buf_cnt++;
      mon_buf[mon_buf_cnt] = '\0';
    }
  }
}


// *********************************************
// EXEC
// *********************************************

void exec()
{
  
  Serial.println(mon_buf);
  mon_curr = mon_buf;
  mon_cmd();
}

// *********************************************
// Ricerca Caratteri Comandi
// *********************************************
void mon_cmd(void)
{
  mon_skip_space();
  if ( *mon_curr == '\0' )
    return;
  else if ( mon_check('u') )
    mon_txtu();
  else if ( mon_check('t') )
    mon_txtt();  
  else
    ;   
}

void mon_skip_space(void)
{
  for(;;)
  {
    if ( *mon_curr == '\0' )
      break;
    if ( *mon_curr > ' ')
      break;    
    mon_curr++;
  }
}

uint8_t mon_check(char c)
{
  if ( *mon_curr != c ) 
    return 0;
  mon_curr++;
  mon_skip_space();
  return 1;
}
// *********************************************
// Esegue Comandi
// *********************************************

void mon_txtu(void)
{
    Serial.print(mon_buf_cnt);
    if ( mon_buf_cnt > 2)
    {
    Serial.println("entra if > 2");
    display_mess_1 = (mon_curr);
    display_mess_2 = display_mess_1;
    Serial.print("T1[");
    Serial.print(display_mess_1);
    Serial.print("]");
    Serial.println("Esce if > 2");
    
    }
    else
    {
    Serial.println("entra else > 2");
    Serial.print("O1[");
    Serial.print(display_mess_1);
    Serial.print("]");

    }
  
    //mess_1 = mon_curr;
    //Serial.print("T1[");
    //Serial.print(mess_1);
    //Serial.print("]");
    
    
}
void mon_txtt(void)
{
    *display_mess_2= *mon_curr;
    Serial.print("T2[");
    Serial.print(display_mess_2);
    Serial.print("]");
    
}

perchè usi i puntatori (*) se stai imparando?
inizia ad usare gli array
char display_mess_1[100];

e poi ai puntatori ci pensiamo..

risposta advanced:
i puntatori puntano ad un area di memoria, ma quale? all'inizio una a caso, che potrebbe contenere qualsiasi cosa, da una variabile a non essere utilizzata.(caso del tuo programma)
per poter USARE i puntatori (senza creare casini), prima bisogna INIZIALIZZARLI, ovvero dargli un indirizzo di ram, ed indicare che da quell'indirizzo X byte fanno parte della variabile puntata dal puntatore. Questa operazione si fa cimando la funzione malloc...
PROBLEMA: lo spazio mallocato, a differenza di una normale variabile, non viene liberato alla "morte" della variabile (in questo caso del puntatore), dovrai farlo a mano dicendo con la funzione free(), altrimenti quello spazio rimane inutilizzabile (salvo morte del programma, in pratica un reset), e viene definito "garbage", e quando occuperà tutta la ram farà crashare il tuo programma.

Grazie per la risposta,
sei stato chiarissimo
non ho usato il carattere (*) consapevolmente, non sapevo neppure indicasse un puntatore. :slight_smile:
Buona parte dello sketch l’ ho trovata in rete, in particolare *mon_curr fa parte del codice originale.
Si tratta di una libreria per la gestione del RTS DS1307

In base al tuo suggerimento, mi servirebbe copiare il contenuto di mon_curr nella mio array display_mess_1[100]. Corretto?

Ho provato, ma mi sa che sbaglio la sintassi, sempre che l’ operazione sia possibile.
display_mess_1=mon_curr
Adesso mi metto alla ricerca :slight_smile:

Ciao e grazie della dritta

gli array sono puntatori ma di lunghezza fissa e che non hanno sbatti di malloc e free, però facendo display_mess_1=mon_curr stai facendo uno scambio di prima area di memoria non di contenuto...
dovresti fare un for e per ogni elemento copiarlo nell'altro....

dai uno sguardo alle guide che trovi quì: Arduino Playground - HomePage

perfetto ora funziona.
ho usato un ciclo for per copiare i valori da un array all’ altro
ho ancora qualche problemino con la seriale, ma vado avanti :slight_smile:

Grazie ancora

#define MON_BUF_LEN 128
char mon_buf[MON_BUF_LEN];
char *mon_curr;
uint8_t mon_buf_cnt = 0;

char display_mess_1[MON_BUF_LEN];
char display_mess_2[MON_BUF_LEN];

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

void loop()
{  
  if ( Serial.available() )
  {
    char c;
    c = Serial.read();
    if ( mon_buf_cnt >= MON_BUF_LEN-1 || c == '\n' || c == '\r'  )
    {
      exec();
      mon_buf_cnt = 0;
      mon_buf[mon_buf_cnt] = '\0';
    }
    else
    {
      mon_buf[mon_buf_cnt] = c;
      mon_buf_cnt++;
      mon_buf[mon_buf_cnt] = '\0';
    }
  }
}


// *********************************************
// EXEC
// *********************************************

void exec()
{
  
  Serial.println(mon_buf);
  mon_curr = mon_buf;
  mon_cmd();
}

// *********************************************
// Ricerca Caratteri Comandi
// *********************************************
void mon_cmd(void)
{
  mon_skip_space();
  if ( *mon_curr == '\0' )
    return;
  else if ( mon_check('u') )
    mon_txtu();
  else if ( mon_check('t') )
    mon_txtt();  
  else
    ;   
}

void mon_skip_space(void)
{
  for(;;)
  {
    if ( *mon_curr == '\0' )
      break;
    if ( *mon_curr > ' ')
      break;    
    mon_curr++;
  }
}

uint8_t mon_check(char c)
{
  if ( *mon_curr != c ) 
    return 0;
  mon_curr++;
  mon_skip_space();
  return 1;
}
// *********************************************
// Esegue Comandi
// *********************************************

void mon_txtu(void)
{
    if ( mon_buf_cnt > 2)
    {
    for(int j = 0; j < mon_buf_cnt; j++) {
    display_mess_1 [j] = mon_buf[j+1];
    } 
    Serial.print("T1[");
    Serial.print(display_mess_1);
    Serial.print("]");
    
    }
    else
    {
    Serial.print("T1[");
    Serial.print(display_mess_1);
    Serial.print("]");

    }
   
}
void mon_txtt(void)
{
    if ( mon_buf_cnt > 2)
    {
    for(int j = 0; j < mon_buf_cnt; j++) {
    display_mess_2 [j] = mon_buf[j+1];
    } 
    Serial.print("T2[");
    Serial.print(display_mess_2);
    Serial.print("]");
    
    }
    else
    {
    Serial.print("T2[");
    Serial.print(display_mess_2);
    Serial.print("]");

    }
   
}