verzenden van een vlotter in seriële

S

stygops

Guest
hallo,
im proberen een float getal van 89s8252 versturen naar pc via een seriële, met behulp van de term232 zie ik het nummer dat ik was gestuurd in th ecomputer, maar dit is niet compleet ..
ex:
Ik stuur 98624.8736 en ik ontvang 95624.8800 ...

waarom dit gebeuren?

mijn code is in C.

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

SCON = 0x50; / * SCON: mode 1, 8-bit UART, staat RCVR * /
TMOD | = 0x20; / * TMOD: timer 1, mode 2, 8-bit reload * /
TH1 = 0xfd; / * TH1: reload waarde voor 9600 baud * /
TR1 = 1; / * TR1: timer 1 run * /
TI = 1; / * TI: TI ingesteld voor het verzenden van eerste char UART * /

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

erg bedankt, sorry slecht Engels; p

 
Hoi

Definieer een unie die bestaat uit een vlotter en vier byte variabele, laat het gelijk deel gelijk aan het aantal float (dat u wilt tosend), en stuur byte variabelen PC.

Groeten

 
Als zweven uw C-compiler is IEEE 32-bit formaat, dan heeft een 24 bit-fractie, en dus een resolutie van ongeveer zeven decimale cijfers.

Probeer in plaats van dubbele float.Het heeft veel meer bits.

 
Ik heb geprobeerd te gebruiken in plaats van dubbele vlotter ...de fout blijft ...

circuit_seller: kunt u een voorbeeld van hoe dit?

 
Wat is het resultaat van de volgende gewijzigde code?
Code:void main (void)

(

dubbele conta = 0;

unsigned char cont;

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

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

TH1 = 0xfd; / * TH1: reload waarde voor 9600 baud * /

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

TI = 1; / * TI: TI ingesteld voor het verzenden van eerste char UART * /conta = 98624.8736;

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

(

while (buffer [cont]! = 0x00)

(

putchar (buffer [cont]);

cont ;

)conta = 98624.8736F;

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

(

while (buffer [cont]! = 0x00)

(

putchar (buffer [cont]);

cont ;

)conta = 98624.8736L;

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

(

while (buffer [cont]! = 0x00)

(

putchar (buffer [cont]);

cont ;

)while (1) ()

)

)

 
stygops wrote:

Ik heb geprobeerd te gebruiken in plaats van dubbele vlotter ...
de fout blijft ...
 
Hai,
Haal het startadres van float variabele door een pointer en converteren naar char pointer en zendt die 4 bytes.op de pc kant krijgen de vier char en reassable het in dezelfde volgorde en omzetten in drijven, dat zal prima werken.

kijk weer de vlotter waarde 98624.8736 vertegenwoordigd door 4 bytes inneemt dezelfde hexadecimale waarden, zowel in ur xcompiler en de compiler op de PC kant omdat elke compiler vertegenwoordigt zweven in diff-formaat.Murugan

 
oke,
Ik heb gebruik gemaakt van een vakbond en stuur de vlotter in bytes ..
maar de vlotter is vertegenwoordigd in '5 'bytes!
en ik zet het hexa nummers die ik ontvang en zijn compatibel met het nummer gestuurd ...maar afgerond ...

 
float wordt altijd vertegenwoordigd door 4 bytes in een compiler, de bevestiging hieronder als de hexadecimale waarden dezelfde zijn in ur xcompiler en compiler in pct en de waarde is vertegenwoordigd door twee op dezelfde manier (identiek 4 byte hex waarden), dan de compiler op de PC zijde kan uitgeschakeld hebben afgeronde controleren de preprocessor header-bestand math.h

Murugan
Sorry, maar je moet inloggen om deze gehechtheid

 
Hi stygops

Hier is een code die ik heb gebruikt om een floating point resultaat overdracht naar PC van DSP UART.

unie
(
char a [4];
korte 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;

in de PC kant je ook moet krijgen een vlotter pointer naar de ontvangen byte array.

Groeten

 
muruga86 wrote:

float zal altijd worden vertegenwoordigd door 4 bytes in een compiler
 
echo bedankt voor de informatie, gebruiken we meestal vlotter waarden die van 4 bytes lang en zes cijfers in Precission.elk compiler proces drijven anders gebaseerd op de waarden die in float.h include file.De meeste C boeken vertellen dat het geldige bereik voor de praalwagens is 10-38 naar 1038.Heb je er ooit aan gedacht hoe een oneven aantal wordt gebruikt?Nou, het antwoord ligt in de IEEE vertegenwoordiging.Sinds de exponent van een vlotter in IEEE-formaat wordt opgeslagen met een positieve bias van 127, de kleinste positieve waarde die u kunt opslaan in een float variabele is 2-127, dat is ongeveer 1.175 x 10-38.De grootste positieve waarde is 2128, dat is ongeveer 3,4 x 1038.Ook voor een dubbele variabele de kleinst mogelijke waarde 2-1023, dat is ongeveer 2,23 x 10-308.De grootste positieve waarde die kan worden gehouden in een dubbele variabele is 21.024, dat is ongeveer 1,8 x 10.308.Er is nog een eigenaardigheid.Na het behalen van de IEEE-formaat voor een vlotter als de tijd komt om daadwerkelijk op te slaan in het geheugen is opgeslagen in de omgekeerde volgorde.Dat is als we de vier byte IEEE vorm ABCD bel dan tijdens het opslaan in het geheugen is opgeslagen in de vorm DCBA.Laten we dit begrijpen met een voorbeeld.Stel dat de floating-point getal in kwestie is 5,375.De IEEE vertegenwoordiging is 0100 0000 1010 1100 0000 0000 0000 0000.Uitgedrukt in hex is dit 40 AC 00 00.Hoewel deze opslaan in het geheugen wordt opgeslagen als 00 00 AC 40.Hoe doen we dit bevestigen?Hoe anders dan door middel van een programma.Hier is ...

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

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

extracte van site
www.funducode.com/freec/Datatypes/datatypes1.htm [/ url]
 
IEEE 754 wordt niet ingegaan bytes of byte opslag orde.Dat is aan de uitvoering.
Little endian machines zoals Pentium gebruik 00 00 AC 40.Big endian machines zoals PowerPC gebruik 40 AC 00 00.

De C-norm vereist geen specifieke floating point-formaat.Gelukkig, de meeste moderne CPU's en compilers gebruiken IEEE 754.

Maar dit alles lijkt te zijn af te wijken van de oorspronkelijke vraag.Hij was het sturen van een ASCII-string, niet binair.

 
Ik tride opnieuw.

de code im met:

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

SCON = 0x50; / * SCON: mode 1, 8-bit UART, staat RCVR * /
TMOD | = 0x20; / * TMOD: timer 1, mode 2, 8-bit reload * /
TH1 = 0xfd; / * TH1: reload waarde voor 9600 baud * /
TR1 = 1; / * TR1: timer 1 run * /
TI = 1; / * TI: TI ingesteld voor het verzenden van eerste char UART * /

numero.num = 98624.8736;
while (vervolg <4)
(
putchar (numero.num2 [cont]);
cont ;
)
while (1) ()
)de vijfde byte die im ontvangen waarschijnlijk trash ..
ja, nu heb ik slechts vier bytes te sturen, is dit het probleem opgelost van de communicatie-stop eventuele byte is nul.
maar het aantal 98624.8736 wordt afgerond naar 98624.875!(bereken ik dit met de C51.pdf bestand als Keil help)

thanks a lot ...: p

 
Hoi

Gebruik de code die ik heb geplaatst, wordt u slagen.

Groeten

 

Welcome to EDABoard.com

Sponsor

Back
Top