envoi d'un flotteur en série

S

stygops

Guest
bonjour,im trying to send a float number from 89s8252 to pc via serial, using the term232 I can see the number that i was sended in th ecomputer, but this is not complete.. ex:
i send 98624.8736 et je reçois 95624.8800 ...

Pourquoi ce lieu??

mon code est en C.

void main (void)
(
float conta = 0;
CONT unsigned char;
bit buffer [40];

SCON = 0x50; / * SCON: mode 1, 8-bit UART, permettre RCVR * /
TMOD | = 0x20; / * TMOD: timer 1, mode 2, 8-bit recharger * /
TH1 = 0xfd; / * TH1: valeur pour la recharge de 9600 bauds * /
TR1 = 1; / * TR1: timer 1 run * /
TI = 1; / * TI: set TI pour envoyer premier caractère d'UART * /

conta = 98624.8736;
sprintf (buffer, "% .4 f \ 0", conta);
(
while (buffer [suite]! = 0x00)
(
putchar (buffer [suite]);
cont ;
)
while (1) ()
)
)

bien merci, mauvais anglais désolé: p

 
Salut

Définir un syndicat qui se compose d'un flotteur et quatre variables octet, puis laisser la partie égal à égal nombre à virgule (que vous voulez tosend), et envoyer des variables octet pour PC.

Observe

 
Si float de votre compilateur C est IEEE format 32 bits, alors il a une fraction de 24 bits, et donc une résolution d'environ sept chiffres décimaux.

Essayez d'utiliser le double au lieu de flotter.Il a beaucoup plus de bits.

 
J'ai essayé le double emploi au lieu de float ...l'erreur demeure ...

circuit_seller: pouvez-vous faire un exemple de la façon dont cela??

 
Quel est le résultat de la modification du code ci-dessous?
Code:void main (void)

(

double conta = 0;

CONT unsigned char;

bit buffer [40];SCON = 0x50; / * SCON: mode 1, 8-bit UART, permettre RCVR * /

TMOD | = 0x20; / * TMOD: timer 1, mode 2, 8-bit recharger * /

TH1 = 0xfd; / * TH1: valeur pour la recharge de 9600 bauds * /

TR1 = 1; / * TR1: timer 1 run * /

TI = 1; / * TI: set TI pour envoyer premier caractère d'UART * /conta = 98624.8736;

sprintf (buffer, "% .4 lf \ n", conta);

(

while (buffer [suite]! = 0x00)

(

putchar (buffer [suite]);

cont ;

)conta = 98624.8736F;

sprintf (buffer, "% .4 lf \ n", conta);

(

while (buffer [suite]! = 0x00)

(

putchar (buffer [suite]);

cont ;

)conta = 98624.8736L;

sprintf (buffer, "% .4 lf \ n", conta);

(

while (buffer [suite]! = 0x00)

(

putchar (buffer [suite]);

cont ;

)while (1) ()

)

)

 
stygops a écrit:

J'ai essayé le double emploi au lieu de float ...
l'erreur demeure ...
 
hai,
obtenir l'adresse de départ du flotteur variable par un pointeur et les convertir au pointeur de char et de transmettre ces 4 octets.du côté PC obtenir le char quatre et reassable dans le même ordre et le convertir en float, qui sera amende travail.

S'il vous plaît vérifier la météo la valeur flottante 98624.8736 représenté par 4 octets occupe valeurs hexa mêmes, tant dans xcompiler ur et le compilateur du côté PC, parce que chaque compilateur représente float en format diff.Murugan

 
d'accord,
J'ai utilisé un syndicat et d'envoyer le flotteur en octets ..
mais le flotteur est représenté dans '5 'bytes!
et je convertir les nombres hexadécimaux que je reçois et son compatible avec le nombre sended ...mais arrondie ...

 
float sera toujours représenté par 4 octets dans n'importe quel compilateur, consultez la pièce jointe ci-dessous si les valeurs hexa sont les mêmes dans xcompiler ur et le compilateur en pc et la valeur est représentée par deux de la même manière (4 identiques valeurs hexa octet), puis le compilateur du côté PC mai ont arrondi vérifier l'en-tête math.h préprocesseur fichier

murugan
Désolé, mais vous devez vous loguer pour voir cette pièce jointe

 
Salut stygops

Voici un code i ont utilisé pour transférer un résultat en virgule flottante au PC de DSP UART.

union
(
char a [4];
court b [2];
float f;
) Data3, Result2, result3;Result2.f = GetValue (& Data2 [0]);
TempValue1 = Result2.b [0] & 0xFF;
= TempValue2 (Result2.b [0] & 0xFF00)>> 8;
TempValue3 = Result2.b [1] & 0xFF;
= TempValue4 (Result2.b [1] & 0xFF00)>> 8;
while ((ScibRegs.SCICTL2.all & 0xC0)! = 0xC0);
ScibRegs.SCITXBUF = TempValue1;
while ((ScibRegs.SCICTL2.all & 0xC0)! = 0xC0);
ScibRegs.SCITXBUF = TempValue2;
while ((ScibRegs.SCICTL2.all & 0xC0)! = 0xC0);
ScibRegs.SCITXBUF = TempValue3;
while ((ScibRegs.SCICTL2.all & 0xC0)! = 0xC0);
ScibRegs.SCITXBUF = TempValue4;

dans le côté PC également que vous devriez obtenir un pointeur flotteur pour le tableau d'octets reçus.

Observe

 
muruga86 a écrit:

float sera toujours représenté par 4 octets dans n'importe quel compilateur
 
merci d'écho pour les informations, on utilise surtout flottant des valeurs qui sont de 4 octets de longueur et de six chiffres indéterminations.chaque processus de compilation float différemment selon les valeurs fixées dans float.h fichier inclus.La plupart des livres C vous dire que la plage valide pour flotteurs est 10-38 à 1038.Avez-vous déjà pensé à comment une telle gamme impair est-il utilisé?Eh bien, la réponse réside dans la représentation IEEE.Puisque l'exposant d'un flotteur au format IEEE est stockée avec un biais positif de 127, la plus petite valeur positive que vous pouvez stocker dans une variable float est 2-127, soit environ 1,175 x 10-38.La plus grande valeur positive est 2128, ce qui représente environ 3,4 x 1038.De même pour une variable double de la plus petite valeur possible est 2-1023, qui est d'environ 2,23 x 10-308.La plus grande valeur positive qui puisse être tenue dans une variable double est 21024, soit environ 1,8 x 10308.Il ya une particularité plus.Après avoir obtenu le format IEEE pour un flotteur lorsque le temps vient en effet de stocker dans la mémoire il est stocké dans l'ordre inversé.Si tant est que nous appelons le former quatre IEEE octets comme ABCD, puis tout en stockant en mémoire il est stocké sous la forme DRASA.Entendons-nous par un exemple.Supposons que le nombre à virgule flottante en question est 5,375.Sa représentation IEEE est 0100 0000 1010 1100 0000 0000 0000 0000.Exprimé en hexa soit 40 AC 00 00.Tout en stockant en mémoire ce qu'il est stocké sous la forme 00 00 AC 40.Comment pouvons-nous le confirmer?De quelle autre façon, mais par un programme.La voici ...

main ()
(
float a = 5,375;
char * p;
int i;

p = (char *) & A;
for (i = 0; i <= 3; i )
printf ( "% 02x", (unsigned char) p );
)

extracte à partir du site
www.funducode.com/freec/Datatypes/datatypes1.htm [/ url]
 
IEEE 754 ne discute pas les octets de stockage ou d'une ordonnance d'octets.C'est jusqu'à l'implémentation.
Little endian machines telles que l'utilisation Pentium 00 00 AC 40.Big endian, comme les machines PowerPC utiliser 40 AC 00 00.

Le standard C ne nécessite aucun format particulier en virgule flottante.Heureusement, les processeurs les plus modernes et les statisticiens utilisent IEEE 754.

Mais tout cela semble s'écarter de la question initiale.Il a été l'envoi d'une chaîne de caractères ASCII, et non binaire.

 
J'ai TRIDE nouveau.

le code du GI en utilisant:

void main (void)
(
unsigned char cont = 0;
Union conta (
float num;
unsigned char num2 [3];
);
Union conta numero;

SCON = 0x50; / * SCON: mode 1, 8-bit UART, permettre RCVR * /
TMOD | = 0x20; / * TMOD: timer 1, mode 2, 8-bit recharger * /
TH1 = 0xfd; / * TH1: valeur pour la recharge de 9600 bauds * /
TR1 = 1; / * TR1: timer 1 run * /
TI = 1; / * TI: set TI pour envoyer premier caractère d'UART * /

numero.num = 98624.8736;
while (cont <4)
(
putchar (numero.num2 [suite]);
cont ;
)
while (1) ()
)cinquième octet de réception que la GI est probablement .. trash
Donc, maintenant je envoyer que quatre octets, ce qui a résolu le problème de l'arrêt de comunication si n'importe quel octet est égal à zéro.
98624.8736 mais le nombre est arrondi à 98624.875!(je calcule cela en utilisant le fichier C51.pdf si une aide Keil)

merci beaucoup ...: p

 
Salut

Utilisez le code i ont posté, vous serez réussir.

Observe

 

Welcome to EDABoard.com

Sponsor

Back
Top