Överföra flyttal via seriell kommunikation

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Krille Krokodil
Inlägg: 4062
Blev medlem: 9 december 2005, 22:33:11
Ort: Helsingborg

Re: Överföra flyttal via seriell kommunikation

Inlägg av Krille Krokodil »

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.
Nerre
Inlägg: 27182
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Överföra flyttal via seriell kommunikation

Inlägg av Nerre »

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?
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Re: Överföra flyttal via seriell kommunikation

Inlägg av dangraf »

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.
blueint
Inlägg: 23238
Blev medlem: 4 juli 2006, 19:26:11
Kontakt:

Re: Överföra flyttal via seriell kommunikation

Inlägg av blueint »

Man kan alltid skicka "datatyp IEEE-754 32-bit" + "5902.91" ..
Användarvisningsbild
tlvb
Inlägg: 132
Blev medlem: 13 januari 2009, 00:40:17
Ort: Lund
Kontakt:

Re: Överföra flyttal via seriell kommunikation

Inlägg av tlvb »

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;

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;
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...
blueint
Inlägg: 23238
Blev medlem: 4 juli 2006, 19:26:11
Kontakt:

Re: Överföra flyttal via seriell kommunikation

Inlägg av blueint »

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.
Användarvisningsbild
stekern
Inlägg: 453
Blev medlem: 2 november 2008, 08:24:18
Ort: Esbo, Finland

Re: Överföra flyttal via seriell kommunikation

Inlägg av stekern »

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
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Re: Överföra flyttal via seriell kommunikation

Inlägg av Korken »

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. :tumupp:

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. :)
Användarvisningsbild
stekern
Inlägg: 453
Blev medlem: 2 november 2008, 08:24:18
Ort: Esbo, Finland

Re: Överföra flyttal via seriell kommunikation

Inlägg av stekern »

Jag är ordblind när det gäller Java, men google gav mig Float.intBitsToFloat(int bits);.
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Re: Överföra flyttal via seriell kommunikation

Inlägg av Korken »

:tumupp: ska kollas närmre på!
Mr Andersson
Inlägg: 1409
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: Överföra flyttal via seriell kommunikation

Inlägg av Mr Andersson »

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.
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Re: Överföra flyttal via seriell kommunikation

Inlägg av Korken »

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! :)
Skriv svar