Spiegazione righe di comando

Salve ragazzi, alle prese con la sim800l sto cercando di far girare un programmino adattando quanto trovo in giro, solo che alcune righe di comandi non mi sono chiare e neanche trovo spiegazione. Per l’ennesima volta vi chiedo un aiutino visto che da solo non riesco ad andare oltre.
Vi posto alcune righe copiate da Sketch solo per avere alcune risposte relative ai comandi e non al programma. Vi ringrazio anticipatamente.
roberto
void loop(){

//Read the Number
Serial.print("\nEnter 10 digit Phone Number:"); //PERCHE \n
while(Serial.available()<=0); //ok questo è chiaro
cnt = Serial.readBytesUntil(’\n’,number, 11); //GIUSTO ma perchè \n e 11?
//cnt = Serial.readBytesUntil(number); //ERRATO se sostituisco la precedente riga con questa… perchè?
number[cnt] = ‘\0’; //COSA VUOL DIRE?
Serial.println(number);

roberto1949:
//Read the Number
Serial.print("\nEnter 10 digit Phone Number:"); //PERCHE \n

Perché manda "\n" ossia un "newline" o "a capo" prima della stringa. Equivale a:

Serial.println();
Serial.print("Enter 10 digit Phone Number:");

cnt = Serial.readBytesUntil('\n',number, 11); //GIUSTO ma perchè \n e 11?
//cnt = Serial.readBytesUntil(number); //ERRATO se sostituisco la precedente riga con questa.. perchè?

Ma guardare il reference di quello che usi, no eh? QUESTO.
Legge i caratteri ricevuti fino a che non riceve un \n (invio), fino a 11 caratteri che suppongo sia la dimensione della variabile "number" (quindi "char number[11]");.

number[cnt] = '\0'; //COSA VUOL DIRE?

Il carattere '\0' ossia un byte a zero, è il terminatore di stringa, quindi con quell'assegnazione ci si accerta che la stringa sia completa. Perché 11 e non 10? Perché se una stringa può avere massimo 10 caratteri, dovendo avere il terminatore '\0' in totale sono massimo 11 caratteri.

Mi viene il dubbio che tu non abbia mai programmato in C/C++... Prima di cimentarti nella programmazione di cose che non sai gestire devi fare un poco di studio, ed EVITARE di fare copia/incolla di cose che NON COMPRENDI. Va bene usare codice trovato in rete, ma, scusa se lo dico, non offenderti, se vuoi progredire ad un livello superiore all'ameba devi PRIMA cercare di CAPIRE almeno le basi del linguaggio, e POI potrai iniziare a chiederti come funziona un codice.

Salve,
grazie per la spiegazione. Non sbagli affatto quando pensi che non conosco il linguaggio C infatti
molti e molti anni fa mi sono cimentato nella programmazione ma con il linguaggio basic e
il dbase...senza contare che ho frequentato negli anni 70 un corso per la perforazione delle
schede .....
Poichè sono in pensione mi sono avventurato nel C/C++ ma apprendo i comandi cercando di realizzare nel contempo un progetto che serve per mie esigenze ancor prima di imparare le nozioni basilari. Sbaglio? faccio bene? non so! per ora vado avanti così leggendo forum e facendo affidamento anche nella vostra collaborazione.
Inoltre sul sito che mi hai indicato ho trovato spiegazioni ma non mi sono bastate anche perché prive di esempi. Cmq ancora grazie e alla prossima.
roberto

Salve ragazzi,
scusate ma non posso fare a meno di chiedervi una ulterione spiegazione. Vi posto alcune righe che sto sperimentando e gradirei che mi spiegaste il perchè di certi messaggi.

cnt = Serial.readBytesUntil("\n",number, 10); inserisco 4 caratteri
Serial.println("questo è il valore di number");
Serial.println(number);
Serial.println("questo è il valore di cnt"); mi restituisce "cnt" = 5
Serial.println(cnt);
Serial.println("sono alla riga 26");
number[cnt]='\0';

perché la variabile cnt mi restituisce sempre un carattere in più? anche qui centra il carattere di terminazione?

Grazie ancora e a presto.
roberto

Un consiglio: per "smanettare" in modo più comodo, prova a farti un account (gratuito) sul sito https://www.tinkercad.com/ dove puoi creare un circuito disegnandolo (puoi anche mettere solo Arduino) e poi scrivere e provare lì il codice grazie all'emulatore di circuiti e di Arduino (devi accedere col tuo account, poi vai su "Circuits")!
Dato che su quell'emulatore, a differenza di Arduino, puoi anche andare in "debug", con tanto di breakpoint e visualizzazione del contenuto delle variabili, secondo me riuscirai a velocizzare questa fase.

Venendo al tuo codice, la Serial.readBytesUntil() come descritto nel reference restituisce il numero di caratteri che ha letto e messo nel buffer (fino alla ricezione del terminatore, o quando ha ricevuto tutti i caratteri che hai indicato come lunghezza massima, o per timeout), se premi 4 caratteri e poi Invio, hai acquisito 5 caratteri per cui restituisce 5. Poi per rendere completa la stringa, ci va inserito anche il terminatore '\0' dopo i caratteri ricevuti e poiché gli array hanno indici che partono da 0, se metto '\0' in posizione 5 di fatto è il SESTO carattere, che chiude i byte che hai acquisito per poterli considerare una stringa (cosa che devi fare PRIMA di usarlo come stringa nel print()).

Salve,
sei stato abbastanza chiaro, e io intanto in attesa di una vostra risposta ho cominciato a consultare un manuale CC++ nel quale si dice appunto che ogni stringa è accompagnata dal carattere nullo di terminalizzazione. Ora è tutto chiaro.
Ho consultato il reference di cui parli ma sinceramente qualcosa mi sfugge.
Comunque superato questo ostacolo sto andando avanti e sinceramente ogni errore che l'editor mi segnala è una opportunità per conoscere nuove nozioni.
Grazie per la disponibilità e scusate se in avvenire continuerò a chiudervi una mano.
buona serata
roberto