Överföra flyttal via seriell kommunikation
- Krille Krokodil
- Inlägg: 4062
- Blev medlem: 9 december 2005, 22:33:11
- Ort: Helsingborg
Re: Överföra flyttal via seriell kommunikation
Hur snabbt kan mätvärdena förändras på 5 ms? Är det "mjuka kurvor" ut så kan det ju räcka med att bara sända mätvärdet 32 bitar i 1 Hz och sedan förändringarna i 200 Hz som då kanske ryms i tex 16 bitar.
Re: Överföra flyttal via seriell kommunikation
Frågan är ju också om alla de andra grejerna som behöver sändas behöver vara så stora? Det kanske går att komprimera på nåt sätt?
Re: Överföra flyttal via seriell kommunikation
när jag gör mina applikationer försöker jag hålla dem så "enkla" som möjligt i grunden och lägga intelligensen i lager ovanför. Om man mäter ett värde skickar jag rådata till lagren ovanför som i sin tur för hålla reda på kalibreringsvärden och omvandla dessa till float eller vad man nu vill för att pressentera det till användaren på ett smidigt sätt. Detta för att ibland kommer man på i efterhand att en del i programmet vill visa svaret som en float, en annan del behöver enbart de 8 övre bitarna etc. då blir det oftast mindre rörigt i koden.
Går inte detta i din applikation så håller jag med föregående talare att omvandla mätvärdet till ett givet format så att mottagaren alltid vet hur man läser av flyttalet och inte är kompilator/plattforms beroende.
Går inte detta i din applikation så håller jag med föregående talare att omvandla mätvärdet till ett givet format så att mottagaren alltid vet hur man läser av flyttalet och inte är kompilator/plattforms beroende.
Re: Överföra flyttal via seriell kommunikation
Man kan alltid skicka "datatyp IEEE-754 32-bit" + "5902.91" ..
Re: Överföra flyttal via seriell kommunikation
Om man ska överföra mellan likvärdiga enheter, eller av annan anledning vet att
endian-ness etc inte blir ett problem är det väl bara att överföra bitarna, eventuellt
kan man underlätta konverteringen till och från bytes genom en union;
Jag vet inte om bit-operationer på floats fungerar som på intar, annars är ju det ett alternativ
om man anser att det är bättre...
endian-ness etc inte blir ett problem är det väl bara att överföra bitarna, eventuellt
kan man underlätta konverteringen till och från bytes genom en union;
Kod: Markera allt
typedef union {
float value;
uint8_t bytes[4];
} serialized_float_t;
float foo = 0.2521;
serialized_float_t bar = { .value = foo };
usart_writebytes(bar.bytes, 4);
serialized_float baz;
usart_readbytes(baz.bytes, 4);
float bag = baz.value;
om man anser att det är bättre...
Re: Överföra flyttal via seriell kommunikation
Problemet med flyttal är väl just att det förekommer väldigt många format. Således måste man förhandla vad som överförs.
Re: Överföra flyttal via seriell kommunikation
Vadå för "väldigt många olika format"?
Att man måste förhandla vad som överförs (dvs, sändare och mottagare måste vara överens om vad det är som flyger på linan) är väl inget specifikt för flyttal, sen om det sker genom att man använder förbestämda datastrukturer eller någon form av handskakning har ju inte med saken att göra.
Exempel på ett industriellt överföringsprotokoll som använder "rådata" för att skicka flyttal: http://en.wikipedia.org/wiki/Ethernet_Powerlink
REAL32 = float
REAL64 = double
Att man måste förhandla vad som överförs (dvs, sändare och mottagare måste vara överens om vad det är som flyger på linan) är väl inget specifikt för flyttal, sen om det sker genom att man använder förbestämda datastrukturer eller någon form av handskakning har ju inte med saken att göra.
Exempel på ett industriellt överföringsprotokoll som använder "rådata" för att skicka flyttal: http://en.wikipedia.org/wiki/Ethernet_Powerlink
REAL32 = float
REAL64 = double
Re: Överföra flyttal via seriell kommunikation
Som tlvb så använder jag en union för att "konvertera" datat för att enkelt kunna skicka det.
Både Windows 7 och Ubuntu kan på en gång läsa värdet, så de tycks vara samma.
Dock när jag ska nu använda det i mitt program som är skrivet i Java (testade i C++) så är det lite problem.
Ska försöka komma på ett sätt att få Java att se de 4 mottagna bytesen som en float. Men det fixar sig nog.
Både Windows 7 och Ubuntu kan på en gång läsa värdet, så de tycks vara samma.

Dock när jag ska nu använda det i mitt program som är skrivet i Java (testade i C++) så är det lite problem.
Ska försöka komma på ett sätt att få Java att se de 4 mottagna bytesen som en float. Men det fixar sig nog.

Re: Överföra flyttal via seriell kommunikation
Jag är ordblind när det gäller Java, men google gav mig Float.intBitsToFloat(int bits);.
-
- Inlägg: 1409
- Blev medlem: 29 januari 2011, 21:06:30
- Ort: Lapplandet
Re: Överföra flyttal via seriell kommunikation
Kan vara endianness (vet ej vad det kallas på svenska) som spökar.
Iom att du säger att det fungerar i c++ men inte java låter det troligt att din mcu är little-endian. Java är big-endian så då måste du flytta om bytes'en.
Iom att du säger att det fungerar i c++ men inte java låter det troligt att din mcu är little-endian. Java är big-endian så då måste du flytta om bytes'en.
Re: Överföra flyttal via seriell kommunikation
Ah, det fungerar med Float.intBitsToFloat, jag hade bara inte kommit på hur man kunde göra om ett bitpattern till en float (som med pekare/union i C++).
Men jag tackar för hjälpen!
Men jag tackar för hjälpen!
