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
trasformare caratteri in interi
Moderatore:
Paolino
8 messaggi
• Pagina 1 di 1
1
voti
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...
P.S. Più che su 3 variabili diverse lavora su un array...
"640K ought to be enough for anybody" Bill Gates (?) 1981
Qualcosa non ha funzionato...
Lo sapete che l'arroganza in informatica si misura in nanodijkstra?
Qualcosa non ha funzionato...
Lo sapete che l'arroganza in informatica si misura in nanodijkstra?
-

fairyvilje
15,0k 4 9 12 - G.Master EY

- Messaggi: 3047
- Iscritto il: 24 gen 2012, 19:23
4
voti
Così potrebbe andarti bene, è quello che vuoi fare?
Pietro
- 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;
}
Pietro
-

PietroBaima
90,7k 7 12 13 - G.Master EY

- Messaggi: 12206
- Iscritto il: 12 ago 2012, 1:20
- Località: Londra
1
voti
Forse per questo contesto può anche bastare
. Anzi forse bastava usare un razionale fixed point senza sprecare preziosa memoria.
"640K ought to be enough for anybody" Bill Gates (?) 1981
Qualcosa non ha funzionato...
Lo sapete che l'arroganza in informatica si misura in nanodijkstra?
Qualcosa non ha funzionato...
Lo sapete che l'arroganza in informatica si misura in nanodijkstra?
-

fairyvilje
15,0k 4 9 12 - G.Master EY

- Messaggi: 3047
- Iscritto il: 24 gen 2012, 19:23
0
voti
Ciao,
Pietro.
-

PietroBaima
90,7k 7 12 13 - G.Master EY

- Messaggi: 12206
- Iscritto il: 12 ago 2012, 1:20
- Località: Londra
0
voti
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;
}
![]()
Pietro
Se sono "caratteri" as in 0 passato come '0' mancano delle sottrazioni.
Si può fare anche un solo cast.
-

IvanSB
- Messaggi: 14
- Iscritto il: 25 mar 2013, 17:14
0
voti
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;
}
![]()
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.

Ultima modifica di
lillo il 7 mag 2013, 10:24, modificato 1 volta in totale.
Motivazione: Non quotare tutto per rispondere al messaggio precedente ;)
Motivazione: Non quotare tutto per rispondere al messaggio precedente ;)
Anyone who has never made a mistake has never tried anything new
Two things are infinite: universe and human stupidity, and I'm not sure about the former
You did not really understand something unless you can explain it to your grandmother
A. Einstein
Two things are infinite: universe and human stupidity, and I'm not sure about the former
You did not really understand something unless you can explain it to your grandmother
A. Einstein
-

Shockwaver
770 1 5 11 - Expert

- Messaggi: 859
- Iscritto il: 3 mar 2010, 18:56
8 messaggi
• Pagina 1 di 1
Torna a Firmware e programmazione
Chi c’è in linea
Visitano il forum: Nessuno e 9 ospiti

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)

pigreco]=π