Buonasera a tutti.
Ho un piccolo dubbio per quanto riguarda la lettura di una stringa dalla seriale. Che differenza c'è tra leggere la stringa tramite l'istruzione Serial.readString() e invece creare un array di caratteri tramite l'istruzione Serial.read()?
Non sono sicuro, quindi forse Serial.readString() restituisce un oggetto String o un puntatore a questo tipo. Questo implica allocazione dinamica di memoria RAM.
Mentre un array di char ha dimensione statica, cioè viene riservata memoria a tempo di compilazione (di questo ne sono certo).
Ciao.
Con Serial.read(), leggendo un carattere alla volta, hai un maggior controllo sulla stringa da comporre.
Ad esempio, potresti ignorare taluni caratteri di controllo come Carriage Return (0x0D) e Line Feed (0x0A).
Cercando un pò su internet ho scritto queste righe di codice:
#define MAX_BUFFER 64
char buffer[MAX_BUFFER];
int elemento_buffer;
void loop()
{
while((Serial.available())>0) { // se c'è qualche byte da leggere, allora...
char carattere=Serial.read(); // ...leggi byte
if(carattere=='\r') continue;
if(carattere=='\n')
{
buffer[elemento_buffer]=0; // inserisco un carettere NULL per indicare la fine dell'array
analizza_stringa(); // analizzo l'array
elemento_buffer=0; // resetto l'indice dell'array
break; // esco dal ciclo while
}
buffer[elemento_buffer]=carattere; // creo l'array di caratteri
elemento_buffer++; // incremento l'indice del buffer
if(elemento_buffer==MAX_BUFFER) // se si raggiunge il limite di byte del buffer allora...
{
elemento_buffer=MAX_BUFFER-1; // ...sovrascrivi quello precedente
}
}
}
Secondo voi, funziona correttamente?
P.S. E' necessario il break per uscire dal while?
C'è da vedere cosa fa la funzione analizza_stringa. Potresti trarre vantaggio da un post di astrobeed, dove mostra come evitare il parser di stringhe.
P.S. E' necessario il break per uscire dal while?
In questo caso break evita l'esecuzione di questa porzione di codice:
buffer[elemento_buffer]=carattere; // creo l'array di caratteri
elemento_buffer++; // incremento l'indice del buffer
if(elemento_buffer==MAX_BUFFER) // se si raggiunge il limite di byte del buffer allora...
{
elemento_buffer=MAX_BUFFER-1; // ...sovrascrivi quello precedente
}
Visto che loop è appunto un ciclo il while verrà valutato ad ogni ciclo.
Ciao.
MauroTec:
C'è da vedere cosa fa la funzione analizza_stringa. Potresti trarre vantaggio da un post di astrobeed, dove mostra come evitare il parser di stringhe.
In questo caso break evita l'esecuzione di questa porzione di codice:buffer[elemento_buffer]=carattere; // creo l'array di caratteri
elemento_buffer++; // incremento l'indice del buffer
if(elemento_buffer==MAX_BUFFER) // se si raggiunge il limite di byte del buffer allora...
{
elemento_buffer=MAX_BUFFER-1; // ...sovrascrivi quello precedente
}
Visto che loop è appunto un ciclo il while verrà valutato ad ogni ciclo. Ciao.
Grazie per la risposta. La stringa in ingresso è del tipo: N120 G1 X126 Y45 Z2 (Stringa tipica del G-Code)
Tramite la funzione analizza_stringa eseguo un parser per ricavare i numeri associati alle lettere ed eseguo delle operazioni in base appunto a questi numeri (con uno switch).
Qual'è questo post di astrobeed per evitare il parser della stringa? Non riesco a trovarlo.
Il post di astrobeed è questo: Codificatore/decodificatore dati seriali. - Software - Arduino Forum
Comunque mi sembra una buona idea continuare per la strada che hai intrapreso, comunque il post di astrobeed leggilo, perché è spiegato bene ed è istruttivo, inoltre prima o poi ti servirà.
Ciao.