Hoi Tweakers,
Achtergrondinfo
Ik ben zelf een quadcopter aan het maken. Als microprocessor gebruik ik de FEZ Panda 2, daar kan je C# op plaatsen met NetMF. Voor de IMU gebruik ik de Mongoose, die draait op een Arduino chip. Standaard geeft de IMU serieel heel vaak de graden voor pitch, roll, yaw, pressure en alle raw sensorwaarden door als een string. Dat is irritant, want mijn microprocessor komt nu om met events en strings die ik moet parsen en dat is duur. Ook triggert dat de garbage collector nogal vaak.
Wat ik wil doen
Ik wil de firmware van de IMU aanpassen. Nu stuurt hij de data met een noodgang over de COM poort, dat wil ik omzetten naar SPI. Ik wil het zo maken dat mijn microprocessor via SPI een aanvraag doet naar de slave en dat de slave (IMU) op dat moment de actuele waarde terug geeft.
Wat wil ik doorsturen?
Via SPI stuur je bytes door. Ik heb alleen interesse in de pitch, yaw, roll and pressure waarde. De eerste drie zijn positief of negatief en lopen van maximaal -180 tot 180. Ik heb alleen interesse in de eerste 2 decimalen achter de komma.
Ik wil geen string meer doorsturen. Ik zat te denken om de eerste byte te nemen zodat ik 8 bitjes heb die ik op true/false kan zetten voor "positief" of "negatief" getal. Gevolgd door steeds 2 bytes voor pitch, roll en yaw waarbij de eerste de gehele waarde is en de tweede de eerste 2 decimalen achter de komma. Door het eerste byte weet ik of dat dan een positieve of negatieve waarde betreft.
Ik zou zo in 7 bytes de pitch, roll en yaw waarde door kunnen geven. Momenteel kost één waarde al 10 bytes. De pressure waarde is nog even irritanter, die kan veel groter worden dan 256, dus ik wil daar 2 bytes voor misbruiken. Totaal komt dan nog steeds op 9 bytes uit, veel minder dan de bijna 160 bytes die ik nu elke keer krijg.
Wat is dan mijn probleem / vraag?
Op de Arduino zijn deze waarde allemaal float waarden. Ik zoek een manier om daar een float om te zetten in 2 bytes, één voor de gehele waarde en één voor de 2 decimalen achter de komma. En dan eigenlijk ook nog een manier om de positieve/negatieve indicatie op een bepaalde bit positie in een byte weg te schrijven.
Vervolgens krijg ik deze byte array door in C#. Daar zal ik dan op basis van 1 bitje en 2 byte waarde moeten converteren naar een double (eerste byte=geheel getal, tweede byte=eerste 2 decimalen) zonder gebruik te maken van string parsing, want dat is nogal inefficient.
Iemand enig idee hoe je zoiets zou kunnen bereiken?
Achtergrondinfo
Ik ben zelf een quadcopter aan het maken. Als microprocessor gebruik ik de FEZ Panda 2, daar kan je C# op plaatsen met NetMF. Voor de IMU gebruik ik de Mongoose, die draait op een Arduino chip. Standaard geeft de IMU serieel heel vaak de graden voor pitch, roll, yaw, pressure en alle raw sensorwaarden door als een string. Dat is irritant, want mijn microprocessor komt nu om met events en strings die ik moet parsen en dat is duur. Ook triggert dat de garbage collector nogal vaak.
Wat ik wil doen
Ik wil de firmware van de IMU aanpassen. Nu stuurt hij de data met een noodgang over de COM poort, dat wil ik omzetten naar SPI. Ik wil het zo maken dat mijn microprocessor via SPI een aanvraag doet naar de slave en dat de slave (IMU) op dat moment de actuele waarde terug geeft.
Wat wil ik doorsturen?
Via SPI stuur je bytes door. Ik heb alleen interesse in de pitch, yaw, roll and pressure waarde. De eerste drie zijn positief of negatief en lopen van maximaal -180 tot 180. Ik heb alleen interesse in de eerste 2 decimalen achter de komma.
Ik wil geen string meer doorsturen. Ik zat te denken om de eerste byte te nemen zodat ik 8 bitjes heb die ik op true/false kan zetten voor "positief" of "negatief" getal. Gevolgd door steeds 2 bytes voor pitch, roll en yaw waarbij de eerste de gehele waarde is en de tweede de eerste 2 decimalen achter de komma. Door het eerste byte weet ik of dat dan een positieve of negatieve waarde betreft.
Ik zou zo in 7 bytes de pitch, roll en yaw waarde door kunnen geven. Momenteel kost één waarde al 10 bytes. De pressure waarde is nog even irritanter, die kan veel groter worden dan 256, dus ik wil daar 2 bytes voor misbruiken. Totaal komt dan nog steeds op 9 bytes uit, veel minder dan de bijna 160 bytes die ik nu elke keer krijg.
Wat is dan mijn probleem / vraag?
Op de Arduino zijn deze waarde allemaal float waarden. Ik zoek een manier om daar een float om te zetten in 2 bytes, één voor de gehele waarde en één voor de 2 decimalen achter de komma. En dan eigenlijk ook nog een manier om de positieve/negatieve indicatie op een bepaalde bit positie in een byte weg te schrijven.
Vervolgens krijg ik deze byte array door in C#. Daar zal ik dan op basis van 1 bitje en 2 byte waarde moeten converteren naar een double (eerste byte=geheel getal, tweede byte=eerste 2 decimalen) zonder gebruik te maken van string parsing, want dat is nogal inefficient.
Iemand enig idee hoe je zoiets zou kunnen bereiken?
[ Voor 1% gewijzigd door Verwijderd op 16-03-2012 08:43 . Reden: Foutje ]