Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Da float a string in C

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Da float a string in C

Messaggioda Foto Utentelcua31989 » 30 lug 2013, 0:29

Salve,

ancora vi chiedo un aiutino in programmazione, perché non riesco a convertire i float in stringa. Ovvero io leggo da un sensore di temperatura un valore che viene convertito mediante una determinata formula. Il problema è che questa funzione ritorna un float come ci si dovrebbe aspettare. Io dovrei inviare ad un modulo con RS232 tale valore. Ho provato a fare come segue, ma non funziona; vengono inviati caratteri a caso.

Codice: Seleziona tutto

void main()
{
  unsigned short int decimale=0, unita=0, decine=0;
  unsigned int number_stored=0, conv_temp=0;
  float threshold_temp=11.1, temp=11.1;
  char mex[]={'t','=','x','x','.','x'};

  conv_temp = temp*10;

  decimale = conv_temp%10;
  unita = (((conv_temp - decimale)/10)%10)
  decine =(((conv_temp - decimale)-(unita*10))/100)
}


Cosa c'è di sbalgliato? Avete qualche altro suggerimento?

Saluti,
lcua31989
Avatar utente
Foto Utentelcua31989
58 1 1 7
Frequentatore
Frequentatore
 
Messaggi: 194
Iscritto il: 28 nov 2012, 23:37

0
voti

[2] Re: da float a string in C

Messaggioda Foto UtenteDirtyDeeds » 30 lug 2013, 8:53

lcua31989 ha scritto:Cosa c'è di sbalgliato?


Mancano un paio di punti e virgola, è scritto abbastanza male e in più non viene generata nessuna stringa. Se non completi il codice come facciamo a dirti cosa c'è che non va?

lcua31989 ha scritto:Avete qualche altro suggerimento?


Se c'è e hai spazio usa la sprintf (o la snprintf).

PS: la temperatura è sempre positiva?
It's a sin to write sin instead of \sin (Anonimo).
...'cos you know that cos ain't \cos, right?
You won't get a sexy tan if you write tan in lieu of \tan.
Take a log for a fireplace, but don't take log for \logarithm.
Avatar utente
Foto UtenteDirtyDeeds
55,9k 7 11 13
G.Master EY
G.Master EY
 
Messaggi: 7012
Iscritto il: 13 apr 2010, 16:13
Località: Somewhere in nowhere

0
voti

[3] Re: da float a string in C

Messaggioda Foto Utentelcua31989 » 30 lug 2013, 10:52

Codice: Seleziona tutto
void main()

unsigned short int decimale=0, unita=0, decine=0; 
unsigned int number_stored=0, conv_temp=0; 
float threshold_temp=11.1, temp=11.1; 
char mex[]={'t','=','x','x','.','x'}; 

conv_temp = temp*10; 
decimale = conv_temp%10; 
unita = (((conv_temp - decimale)/10)%10);
decine = (((conv_temp - decimale)-(unita*10))/100);
mex [5] = decimale+48;
mex [3] = unita+48;
mex [2] = decine+48;
Uart1_Write_Text (mex);
}


Il problema è che la sprintf o la snprintf mi occupano troppo spazio nella ram e sono molto limitato. La funzione legge sia valori positivi che negativi, ma nella realtà la temperatura è sempre positiva e non inferiore a 5 gradi. Questo perché il termostato principale ha la funzione antigelo.

Ciao
lcua31989
Avatar utente
Foto Utentelcua31989
58 1 1 7
Frequentatore
Frequentatore
 
Messaggi: 194
Iscritto il: 28 nov 2012, 23:37

0
voti

[4] Re: da float a string in C

Messaggioda Foto UtenteDirtyDeeds » 30 lug 2013, 10:58

Scusa ma l'argomento della funzione

Codice: Seleziona tutto
Uart1_Write_Text (mex);


non deve essere una stringa terminata con il carattere '\0'?

Il tuo vettore mex[] non è terminato. Se vuoi terminarlo devi inizializzarlo come

Codice: Seleziona tutto
char mex[] = "t=xx.x";
It's a sin to write sin instead of \sin (Anonimo).
...'cos you know that cos ain't \cos, right?
You won't get a sexy tan if you write tan in lieu of \tan.
Take a log for a fireplace, but don't take log for \logarithm.
Avatar utente
Foto UtenteDirtyDeeds
55,9k 7 11 13
G.Master EY
G.Master EY
 
Messaggi: 7012
Iscritto il: 13 apr 2010, 16:13
Località: Somewhere in nowhere

0
voti

[5] Re: Da float a string in C

Messaggioda Foto Utentelcua31989 » 30 lug 2013, 12:35

Ciao,

ho provato come DirtyDeeds ma non funziona ugualmente. Pare che l'operazione % porti qualche errore, ma non capisco il perché.

saluti,
lcua31989
Avatar utente
Foto Utentelcua31989
58 1 1 7
Frequentatore
Frequentatore
 
Messaggi: 194
Iscritto il: 28 nov 2012, 23:37

0
voti

[6] Re: Da float a string in C

Messaggioda Foto UtenteDirtyDeeds » 30 lug 2013, 13:15

Riporta i valori che ottieni delle diverse variabili.
It's a sin to write sin instead of \sin (Anonimo).
...'cos you know that cos ain't \cos, right?
You won't get a sexy tan if you write tan in lieu of \tan.
Take a log for a fireplace, but don't take log for \logarithm.
Avatar utente
Foto UtenteDirtyDeeds
55,9k 7 11 13
G.Master EY
G.Master EY
 
Messaggi: 7012
Iscritto il: 13 apr 2010, 16:13
Località: Somewhere in nowhere

1
voti

[7] Re: Da float a string in C

Messaggioda Foto UtentePaolino » 30 lug 2013, 13:18

Ma il codice che hai scritto è implementato esattamente così nel micro?

Prova con:

Codice: Seleziona tutto
void main()

unsigned short int decimale=0, unita=0, decine=0;
unsigned int number_stored=0, conv_temp=0; 
float threshold_temp=11.1, temp=11.1; 
char mex[]={'t','=','x','x','.','x'}; 

conv_temp = temp*10; 
decimale = conv_temp%10; 
unita = (((conv_temp - decimale)/10)%10);
decine = (((conv_temp - decimale)-(unita*10))/100);
mex [5] = decimale+48;
mex [3] = unita+48;
mex [2] = decine+48;
Uart1_Write_Text (mex);

while(1); /* AGGIUNGI QUESTA RIGA */

}


Che micro stai usando? Puoi andare in modo debug e vedere quanto vale la variabile conv_temp?

Ciao.

Paolo.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong

-------------------------------------------------------------

PIC Experience - http://www.picexperience.it
Avatar utente
Foto UtentePaolino
32,6k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 4226
Iscritto il: 20 gen 2006, 11:42
Località: Vigevano (PV)

0
voti

[8] Re: Da float a string in C

Messaggioda Foto UtenteDirtyDeeds » 30 lug 2013, 13:22

Comunque che la stringa debba essere terminata con il carattere nullo è chiaramente indicato nel manuale della libreria: Uart1_Write_Text.

Lo stesso manuale, però, dice anche che prima di usare questa funzione è necessario richiamare Uart1_Init.
It's a sin to write sin instead of \sin (Anonimo).
...'cos you know that cos ain't \cos, right?
You won't get a sexy tan if you write tan in lieu of \tan.
Take a log for a fireplace, but don't take log for \logarithm.
Avatar utente
Foto UtenteDirtyDeeds
55,9k 7 11 13
G.Master EY
G.Master EY
 
Messaggi: 7012
Iscritto il: 13 apr 2010, 16:13
Località: Somewhere in nowhere

0
voti

[9] Re: Da float a string in C

Messaggioda Foto Utentelcua31989 » 30 lug 2013, 14:45

ciao,

DirtyDeeds ha scritto:Che micro stai usando? Puoi andare in modo debug e vedere quanto vale la variabile conv_temp?


Sto usando un PIC 16F1827. Purtroppo non credo che mikroc abbia la modalità di debug.

Paolino ha scritto:Lo stesso manuale, però, dice anche che prima di usare questa funzione è necessario richiamare Uart1_Init.


Questo è un pezzo di programma, la Uart1_Init(9600) la richiamo dalla funzione picSetup(). La comunicazione RS232 è OK al 100% riesco a ricevere con interrupt e inviare tramite le funzioni Uart1_Write_Text(char *s), o Uart1_Wire(char x)

Saluti
lcua31989
Avatar utente
Foto Utentelcua31989
58 1 1 7
Frequentatore
Frequentatore
 
Messaggi: 194
Iscritto il: 28 nov 2012, 23:37

1
voti

[10] Re: Da float a string in C

Messaggioda Foto UtenteDirtyDeeds » 30 lug 2013, 14:48

lcua31989 ha scritto:Questo è un pezzo di programma,


Certo che se continui a riportare pezzi di programma che c'entrano poco con il programma che non funziona come pensi che ti si possa aiutare?
It's a sin to write sin instead of \sin (Anonimo).
...'cos you know that cos ain't \cos, right?
You won't get a sexy tan if you write tan in lieu of \tan.
Take a log for a fireplace, but don't take log for \logarithm.
Avatar utente
Foto UtenteDirtyDeeds
55,9k 7 11 13
G.Master EY
G.Master EY
 
Messaggi: 7012
Iscritto il: 13 apr 2010, 16:13
Località: Somewhere in nowhere

Prossimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 15 ospiti