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 ID

    Allgemeine 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. 101

    Wie 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


Anmelden zum Antworten