Convertire String in numero

OK ora penso che dovremmo comprenderci, il tuo ragionamento è su caratteri ASCI ecco perchè esegui questo codice:

String NuPer = inputString.substring(2,4);

perchè il carattere 05 nel tuo esempio sono 30 e 35

mentre io ho parlato di byte in HEX perciò per farti capire A5 è un solo numero equivalente a 165 , e cosi 05, ecco perchè io per estrarre 05 devo scrivere:

String NuPer = inputString.substring(1,2);

e l'estrapolazione è corretta, ma la conversione da stringa a numero no. se con il codice atoi lo 0 viene eliminato, mi dovrebbe rimanere soltanto il 5, ma non è così perchè ottengo sempre 0.

la conversione da stringa a numero no. se con il codice atoi lo 0 viene eliminato, mi dovrebbe rimanere soltanto il 5

Stai facendo un poco di confusione, temo.
La atoi() converte un array di char in un integer, e fin qui ci siamo, si? Se tu hai accumulato singoli BYTE in inputString per quale motivo li vuoi gestire come stringhe, e addirittura l'ineffeiciente "String", che poi riconverti in char array, cercando poi di riconvertire chissà per quale motivo una stringa formata da un byte in un int?

Ripeto, lascia perdere le stringhe, le conversioni con atoi, ed il carattere \0, definisci inputString per quello che è ossia un buffer di byte (magari chiamala inputBuf giusto per linearità):

#define BUFLEN 128
byte inputBuf[BUFLEN];
int ptr = 0;  // Indice della prima posizione libera del buffer

accumula lì dentro i caratteri/byte che ricevi (incrementando anche "ptr"):

...
if (Serial.available() > 0)
  inputBuf[ptr++] = Serial.read();

quindi avrai il tuo valore 5 semplicemente facendo:

inputBuf[1]

Niente conversioni o cose strane. Ricevi dei byte e li tratti come byte.
E quando avrai gestito il pacchetto ricevuto, resetti il buffer semplicemente con:

  ptr = 0;

Ok ho modificato il mio codice per ricevere dei Byte come da te suggerito. Dal momento che termino la ricezione dopo aver ricevuto 0D0A, è corretto come ho scritto?

while (Serial.available() > 0) {
     inputString[ptr++] = Serial.read();
     
    if (inputString[ptr] == 13) {                               // Notifico ricevuto \n = 0D
      ricevuto_0D = true;
    }
    
    if (ricevuto_0D == true && inputString[ptr] == 10) {        // Termino ricezione quando arriva \n\r ossia 0D0A
      stringComplete = true;
    }
  }

ti farò sapere

Ciao docdoc, ti informo che ho modificato il codice come da te consigliato funziona correttamente, con la ricezione a byte ho risolto tanti problemi e il sw è diventato chiaro. Sono Contento e

TI RINGRAZIO TANTISSIMO :wink:

un saluto.

fabio60:
Ok ho modificato il mio codice per ricevere dei Byte come da te suggerito. Dal momento che termino la ricezione dopo aver ricevuto 0D0A, è corretto come ho scritto?

Si, è corretto. Ovviamente dato che parliamo di byte ricevuti, dovresti essere certo che il "pacchetto" di dati che vuoi acquisire non contenga MAI i valori 0D 0A (ossia "\r\n"). Tra l'altro generalmente i pacchetti binari non li si fa terminare da \r\n proprio per questo motivo (quelli sono i caratteri tipicamente usati come terminatore di riga di dati in formato testuale) ma se è così che li ricevi...

fabio60:
Ciao docdoc, ti informo che ho modificato il codice come da te consigliato funziona correttamente, con la ricezione a byte ho risolto tanti problemi e il sw è diventato chiaro.

Ottimo, sono contento anche io. Ciao!