Buon giorno.
Sto impazzendo con l'uso di atoi.
Devo convertire una stringa (array di char) in un numero byte; praticamente in payload [] c'è un char.
Ha sempre funzionato, ma poi ho aggiunto pezzi di programma (che apparentemente non vanno ad inficiare) ed ora non funziona più
per farlo funzionare ho dovuto "scomporre" la funaione atoi ed ho agito così
Prima
for (byte i=0;i<2;i++){recive_lamp[i]=payload[i+25];Serial.println(recive_lamp[i]);}
lamp[11]=atoi(recive_lamp);
ora
for (byte i=0;i<2;i++){recive_lamp[i]=payload[i+25];Serial.println(recive_lamp[i]);}
lamp[11]=(recive_lamp[0]-'0')*10+revice_lamp[1]-'0';
altrimenti mi scriveva dei numeri a caso...
Come è possibile?
Può essere che avendo aggiunto righe di programma ed utilizzato molte variabili, il compilatore per l'uso di atoi sbagli l'allocazione di memoria??
payload è una stringa di caratteri lunga da cui estraggo ciò che mi interessa in posizioni precise.
Grazie
se ciò che vai a convertire è una stringa, terminata correttamente con 0x00, che rappresenta un numero che va da 0 a 255 NON c'è alcun problema.
Ovvero, la sequenza di caratteri 0x32 0x35 0x35 0x00 passata a atoi() ti ritornerà il numero 255 che puoi tranquillamnete mettere in un byte, mentre la sequenza di caratteri 0x31 0x32 0x35 0x35 0x00 passata ad atoi() ti ritornerà 1255 che, ovviamente, NON puoi mettere in un byte.
Già, grazie ragazzie dell'aiuto.
Guglielmo, non mettevo il terminatore e il sistema faceva un po' quello che voleva, giustamente....
Vi chiedo un'altra cosa, se possibile.
Vorrei convertire un array di tipo byte in un array char...nell'array byte c'è un codice alfanumerico di 8 byte.
grazie
Il tipo char, di default, NON è definito né signed né unsigned (va specificato come lo si vuole) ed occupa esattamente UN BYTE ... quindi ? ? ? Che vuoi convertire a fare una cosa che già occupa un byte in una che occupa un byte ?
E' solo un errore di trascrizione...
Si Guglielmo, hai ragione....
Ad ogni modo l'errore grande che facevo era quello di non mettere il terminatore'\0', si vede che all'inizio andava bene, poi aggiungendo programma atoi non sapeva più dove finire....
Faccio un'ultima domanda, anche se non c'entra con atoi:
Devo convertire un char ricevuto in una stringa da mandare a Nextion, ed ho soluzionato così:
String stringa;
for (byte i=0;i<16;i++){
stringa+=(char)payload[i+1];
}
myNex.writeStr("info.t0.txt",stringa);
Così funziona ma non volevo usare la String ma la string del C.
Qualche suggerimento??
... e quindi ti devi studiare BENE tutte le funzioni che trovi in <string.h> che fa parte di AVR libc, libreria automaticamente sempre inclusa dall'IDE di Arduino.
Ti do un'indicazione ... per quello che devi fare ... guarda strcat()
The strcat() function appends the src string to the dest string overwriting the '\0' character at the end of dest, and then adds a terminating '\0' character.
... ovvero si aspetta due stringhe classiche del 'C' e NON una stringa classica (stringa[]) ed un char (payload[i+1]); ti serve un passaggio in più per trasformare payload[i+1] da seplice char a stringa (ovvero metterlo in un array di due caratteri il cui secondo carattere è sempre 0x00).
Grazie Guglielmo, il solito terminatore che non mi entra in testa
Grazie.
Ho riscritto tutto il programma con il terminatore ed ora finalmente funziona....
Errore banale davvero
... e che è fondamentale! Tutte quelle funzioni che operano sulle stringhe classiche del 'C' lavorano partendo dall'inizio dell'array di char (quindi un puntatore) e vanno avanti, byte dopo byte, fino a quando non incontrano 0x00. Capisci bene che, se non lo metti, vanno avanti finché, in memoria, da qualche parte lo incontrano ... con le ovvie conseguenze ...