Pagina 1 di 1

trasformare caratteri in interi

MessaggioInviato: 22 apr 2013, 0:05
da lcua31989
Ciao a tutti,

sto scrivendo un firmware in C per il PIC micro 16F1827 che comunica tramite RS232 ad un PC. Il PIC elabora i dati ricevuti (la temperatura) e fa partire una stufetta elettrica nel box se necessario. Ora la comunicazione via RS232 è funzionante, ma ho un problema su come convertire la temperatura. Qui entra in gioco il virtual terminal che, per impostare una temperatura di 21.5°C invia prima il '2' , l' '1' il carattere '.' e poi il '5'. Tutti questi dovrebbero essere caratteri quindi per trasformarli in interi si sottrare 48 da ogni numero inviato. Così però ottengo tre variabili con i rispettivi valori: decine=2, unità=1 e decimi=5. Queste tre distinte variabili, si devono salvare in una variabile di tipo float chiamata temp in rappresentazione decimale.

Come faccio a fare in modo che la mia variabile temp abbia il valore di 21.5 (o anche 21 scartando il decimale) avnedo le tre variabili con valori diversi?

E' possibile fare una cosa del genere?

Un grazie mille a tutti,
lcua31989

Re: trasformare caratteri in interi

MessaggioInviato: 22 apr 2013, 0:45
da fairyvilje
La libreria standard C mette a disposizione una funzione chiamata atof, ovvero alpha to float. Se non fosse disponibile occorre che tu la implementi. Controlla in tal caso possiamo riparlarne ;)

P.S. Più che su 3 variabili diverse lavora su un array...

Re: trasformare caratteri in interi

MessaggioInviato: 22 apr 2013, 1:14
da PietroBaima
Così potrebbe andarti bene, è quello che vuoi fare?

Codice: Seleziona tutto
#include <stdio.h>

int main (void)
{
   int n[]={2,1,5};
   float temp;
   
   temp=(float)n[0]*10+(float)n[1]+(float)n[2]/10;
   
   printf("%f\n",temp);
   
   return 0;
}


O_/
Pietro

Re: trasformare caratteri in interi

MessaggioInviato: 22 apr 2013, 4:07
da fairyvilje
Forse per questo contesto può anche bastare :D. Anzi forse bastava usare un razionale fixed point senza sprecare preziosa memoria.

Re: trasformare caratteri in interi

MessaggioInviato: 22 apr 2013, 10:16
da PietroBaima
Foto Utentefairyvilje, già :D è proprio quello che intendevo. Dovrebbe bastare, ma vediamo se va bene per l'OP.

Ciao,
Pietro.

Re: trasformare caratteri in interi

MessaggioInviato: 22 apr 2013, 12:44
da lcua31989
Ciao Pietro,

Il tuo codice mi sembra quello che spreca meno RAM al PIC micro.
Era proprio qiello che intendevo io.

Grazie,
Lcua31989

Re: trasformare caratteri in interi

MessaggioInviato: 28 apr 2013, 19:08
da IvanSB
PietroBaima ha scritto:Così potrebbe andarti bene, è quello che vuoi fare?

Codice: Seleziona tutto
#include <stdio.h>

int main (void)
{
   int n[]={2,1,5};
   float temp;
   
   temp=(float)n[0]*10+(float)n[1]+(float)n[2]/10;
   
   printf("%f\n",temp);
   
   return 0;
}


O_/
Pietro


Se sono "caratteri" as in 0 passato come '0' mancano delle sottrazioni.
Si può fare anche un solo cast.

Re: trasformare caratteri in interi

MessaggioInviato: 7 mag 2013, 10:20
da Shockwaver
IvanSB ha scritto:
PietroBaima ha scritto:Così potrebbe andarti bene, è quello che vuoi fare?

Codice: Seleziona tutto
#include <stdio.h>

int main (void)
{
   int n[]={2,1,5};
   float temp;
   
   temp=(float)n[0]*10+(float)n[1]+(float)n[2]/10;
   
   printf("%f\n",temp);
   
   return 0;
}


O_/
Pietro


Se sono "caratteri" as in 0 passato come '0' mancano delle sottrazioni.
Si può fare anche un solo cast.


Esatto, ipotizzando i valori come variabili char leggibili '2' '1' ecc (e ricordandosi del punto) verrebbe

Codice: Seleziona tutto
float temp = 0.0;
temp = (n[0] - '0') * 10 + (n[1] - '0') + ((float)n[3] - '0')/10);

Però se la seriale produce stringhe null terminated (o quanto meno ti facessi carico di appenderlo tu lo '\0')

suggerirei la:
Codice: Seleziona tutto
#include <stdio.h>
.
.
.
sscanf(n, "%f", &temp);

magari fai un controllo per vedere se va a buon fine.

O_/