Real to Byte Array in Ansi C

Viele Feldbustechnologie übertragen ihre Datenpakete Byteweise. In den meisten Fällen stellen die meisten Entwicklungsumgebungen keine Standardfunktionen für die Typkonverierung zur Verfügung. Hier finden sie Ideen, wie sie diese Funktionen selbst umsetzen.

Zumeist werden einfache Word oder DWord Bereiche verwendet um Datenbits zu definieren und Int Abschnitte für Parameteraustausch. Für einen Austausch von Int Werten

 

Es kann aber auch vorkommen, dass der Empfänger am Feldbus sich eine Real Zahl erwartet.

int iValue; //16-bit
byte byteElement1, byteElement2;

// Element 1 gets the low byte, Element 2 gets the high byte
byteElement1 = (iValue & 0x00FF) >> 0; 

// 0xF0 is 1111111100000000 binary = mask for converting
// Logical add Mask to value and shift 8 bits to the right. 
// Then you have the high byte
byteElement2 = (iValue & 0xFF00) >> 8; 

Für einen Integer Wert ist es in Ansi C relativ einfach, da die Bits direkt konvertiert werden können.
Für einen Real Wert ist die Aufgabe eine andere, da eine direkte Zuweisung nicht möglich ist. In diesem Fall wird nämlich der Wert von Real automatisch auf Int bzw. DInt konviertiert und damit die Übertragung verfälscht. Hier muss ein kleiner Trick angewendet werden.
Man weißt einem DWORD Pointer die Adresse des Real Wertes zu und arbeitet danach mit diesem Pointer weiter. Der Compiler gibt zwar eine Warnung wegen der falschen Typzuweisung aus, welche aber getrost ignoriert werden kann, da diese Zuweisung ja bewusst erfolgt. Danach kann nach dem gleichem Schema, wie bei einem Integer Wert konviertiert werden. Geachtet muss hier lediglich darauf werden, dass ein Real Wert bei Ansi C (B&R) 32-bit hat.

real rValue; // 32-bit
byte byteElement1, byteElement2,byteElement3, byteElement4;
DWORD *pDWORD;

// 0xFF000000 is 11111111000000000000000000000000 binary = mask for converting
// Logical add Mask to value and shift 8 bits to the right. 
// Then you have the high byte
pDWORD = &rValue;
	
byteElement1 = (*pDWORD & 0xFF000000) >> 24;
byteElement2 = (*pDWORD & 0x00FF0000) >> 16;
byteElement3 = (*pDWORD & 0x0000FF00) >> 8 ;
byteElement4 = (*pDWORD & 0x000000FF) >> 0 ;

Knowledge is for everybody ...

Schreibe einen Kommentar