BYTE Schnittstellenproblem
-
Hallo.
Vielleich kann mir jemand helfen. Ich schreibe zurzeit
ein Programm das eine API verwendet mit der ich irgendwie nicht
klarkomme. Grundproblem ist wahrscheinlich dass ich mit dem Datentyp
BYTE nie gearbeitet habe und die Aufgerufene funktion aber diesen verlangt.Hier kurz zur beschreibung:
Funktion:
DWORD Send(BYTE* pData, DWORD dwLength)
über den Zeiger pData muss eine Message und dazugehörige Parameter geschickt werden.
Message ist definiert über z.B.
CHECK_REQ 0x80
und hat die Parameter
ID 0x40
Octet 8 7 6 5 4 3 2 1
ID 1 0 1 0 0 0 0 0 1
2 Länge der folgenden Bytes
3 eingegebene IDAllgemeine Message Struktur ist definiert über
Message Header:
Message-Type // CHECK_REQ
Message-Length(high) // ?
Message-Length(low) // ?Parameter1:
Parameter-Type // ID
Parameter-Length // Länge
Parameter-Value // z.B. 101Wie bekomme ich diese informationen so zusammen dass ich diese an die Funktion
übergeben kann ?Kann mir da jemand Helfen oder wenigstens generell den Umgang mit dem
Datentyp BYTE erklären.Danke
-
Naja, der Datentyp Byte ist nix anderes als ein typedef von unsigned char. Demzufolge sollst du mit BYTE* pData nix anderes als einen 1-Byte inkrementierenden Datenpuffer mit deiner vorbereitenden Message hineingeben.
Wie dieser Datenrahmen der Message nun genau aussieht solltest du ja eigentlich in der dazgehörigen Spezifikation finden.
Ich hoffe ich konnte dir ein wenig weiterhelfen
.
-
würder das so funktionieren ?
#define START_REQ 0x40
BYTE *pData;
BYTE bMessage;bMessage = (BYTE)START_REQ;
pData = (BYTE*)calloc(1,2);
memcpy( pData, &bMessage,1 );
(*Intrface_SendData)(pData,sizeof(pData));
free( pData );
-
sizeof(pData) dürfte in diesem Fall IMMER die Größe eines Zeigers (vermutlich 4) zurückgeben. Du mußt Dir die Größe beim Allokieren merken.
-
ah danke.
bMessage = (BYTE)START_REQ;
pData = (BYTE*)calloc(1,2);
memcpy( pData, &bMessage,1 );
(*Intrface_SendData)(pData,2);
free( pData );aber ich was ich noch vergessen habe.
Laut meiner Doku muss die Nachricht
Message-Type also START_REQ und dann die Länge in Byte
Message-Length(high)
Message-Length(low)in pData geschrieben werden. Hat jemand ne Ahnung Message-Length(high), Message-Length(low) bedeuten könnte ?
-
Hi-Byte Lo-Byte oder Hi-Word Lo-Word - je nach Datentyp von Message.
-
Danke, Weißt du zufällig wie ich das an mein pData anhängen kann ?
-
mhm ...
also angenommen Dein *pData zeigt auf 50 Byte und Du hast schon 48 (pData[0] - pData[47]) befüllt.
Weiter angenommen, Deine Länge ist vom Typ WORD.Dann kriegst Du (unter Windows) mit HIBYTE(x), bzw. LOBYTE(x) das jeweilige Byte - diese Makros sind in windef.h definiert - am besten einfach windows.h inkludieren.
Und dann einfach: pData[48] = HIBYTE(x); pData[49] = LOBYTE(x);
Falls die Länge ein 4-Byte - Wert (DWORD) ist, gibt es die Makros HIWORD und LOWORD, die das entsprechende WORD zurückliefern, welches dann auch noch in Bytes zerlegt werden muß.
Es gibt aber auch htons und htonl, die einen short bzw. long - Wert in Network-Byte-Order bringen. Am besten mal in der MSDN danach schauen.
Statt der Zuweisung einzelner Bytes kannst Du auch nach Umformung des Wertes in die richtige ByteOrder mit CopyMemory hinten anhängen ...
-
Danke hast mir viel weitergeholfen. Mal sehen ob ich hinbekomme.
-
ok so könnte es gehen:
Leider kann ich es erst am Mo testen.BYTE* pData;
DWORD dwLength;dwLength=4;
pData = (BYTE*)calloc(1,dwLength);
pData[0] = (BYTE)CHECK_REQ;
pData[1] = (BYTE)0x03;
pData[2] = (BYTE)ID;
pData[3] = (BYTE)0x01;
pData[4] = (BYTE)0x10;dwRet = Send(pData, dwLength);
free(pData);
Verbessert mich bitte falls ihr einen Fehler entdeckt.
Danke