Bitte um Hilfe: kennt sich jemand gut mit Datentypen (cast usw.) aus? Dringend!



  • Hallo, Ihr da draußen im Web-Space, Ihr lieben Programmierer 🙂 ,

    Ich heiße Johannes. Ich bin kein Informatiker, habe mich aber an ein Projekt gewagt (meine Semesterarbeit), bei dem sich ziemlich viel um Programmierung dreht. Nun stehe ich vor einem bestimmten Problem, womit Ihr mir vielleicht weiterhelfen könntet.
    Ich habe eine vorgefertigte Software, die ich so modifizieren möchte, dass ich sie nutzen kann. Das ist ein richtiges professionelles Softwareprojekt, so dass dem Laien (mir) ein Reengineering ein bisschen schwer fällt.
    Also hier das Problem:

    //Typen-Deklaration (in .h-Dateien):
    typedef struct // Request data transmission parameters.
    {
      NodeLogicalAddr_t dstLogicalAddr; // Destination logical address.
      NWKAddr_t dstNWKAddr;             // Destination network address.
      NodeAddrMode_t addrMode;          // Destination address mode.
      uint8_t srcEndPoint;              // Source end-point.
      uint8_t dstEndPoint;              // Destination end-point.
      bool arq;                         // ARQ control.
      bool broadcast;                   // Broadcast flag.
      uint8_t* data;                    // Data buffer pointer.
      uint8_t length;                   // Data length.
      uint8_t handle;                   // Data handle.
    } FW_DataRequest_t;
    
    typedef struct // Indication data transmission parameters.
    {
      NodeLogicalAddr_t srcLogicalAddr; // Source logical address.
      NWKAddr_t srcNWKAddr;             // Network logical address.
      bool isLogicalValid;              // Logical address valid flag.
      uint8_t srcEndPoint;              // Source end-point.
      uint8_t dstEndPoint;              // Destination end-point.
      uint8_t* data;                    // Data buffer pointer.
      uint8_t length;                   // Data length.
      bool broadcast;                   // Broadcast flag.
      uint8_t lqi;                      // LQI value.
      int8_t rssi;                      // RSSI value.
    } FW_DataIndication_t;
    
    typedef struct
    {
      uint8_t messageType; //1
      uint8_t nodeType; //1
      uint64_t IEEEAddress;//8
      uint16_t shortAddress; //2
      uint32_t softVersion;//4
      uint32_t channelMask;//4
      uint16_t panId;//2
      uint8_t workingChannel;//1
      uint16_t parentShortAddress;//2
      uint8_t lqi;//1
      uint8_t rssi;//1
      uint8_t boardType;//1
      uint8_t sensorsSize;//1
      union {
        struct {
          float battery;//4
          float temperature;//4
          float light;//4
        } mesh;
        struct {
          uint32_t gpio;
          uint16_t adc0;
          uint16_t adc1;
          uint16_t adc2;
          uint16_t adc3;
        } rcb;
      };
    #ifdef SEND_NODE_NAME
      uint8_t nodeNameId;
      uint8_t nodeNameSize;
      uint8_t nodeName[16];
    #endif
    } TMessageBuffer;
    
    //Wichtige Funktion:
    result_t sendData(void *buffer,uint8_t length)
    {
      FW_DataRequest_t params;
      params.data = (uint8_t*)buffer; //der doch etwas komplexe Datentyp von     
     //“buffer” wird auf uint8_t “runter-gecastet“
     //damit die Daten gesendet werden können (SPI)
      params.length = length; 
    
      return fw_dataRequest(&params, dataConfirm);
    //fw_dataRequest ist eine “BlackBox-Funktion”, die Daten von einem mC zum //anderen schickt
    }
    
    // Deklaration der Variablen:
    
    TMessageBuffer buffer;    //schon vorprogrammiert
    TMessageBuffer jojobuffer[3]; //von mir erzeugt, Array, um die Daten 
    // mehrerer (hier 3) Mikrocontroller abzuspeichern
    
    // eigentlicher Programmcode:
    
    //... bis hier hin wird “buffer” mit Daten beladen...
    
    sendData(&buffer,sizeof(buffer)) //Funktion siehe oben => Daten werden 
    //gesendet (Übertragung von einem
    //Mikrocontroller zum anderen)
    
    //Die Daten kommen bei einem anderen Mikrocontroller an und werden vom
    //Programm (weitere BlackBox-Funktion)ausgespuckt
    
    void indication(const FW_DataIndication_t *params)
    { //Achtung, dieses “params” hat jetzt einen anderen Datentyp als das obere
      //“params“
    
    uint32_t Variable;
    
    Variable = ((uint32_t*)&params->data[1])[0]; //Beispiel-Zugriff (vorgegeb.)
    //Dieser Zugriff war schon ins Programm integriert und funktioniert!
    //Wenn möglich erklären, was [1] und [0] genau bedeuten
    //In „Variable“ steht dann der Wert von „channelMask“ siehe
    // typedef struct TMessageBuffer
    
    // Ziel: Die Daten, die ursprünglich in „buffer“ abgespeichert waren, 
    // nun rück-konvertieren (zum Typ TMessageBuffer) und z.B. in jojobuffer[1] 
    // abspeichern
    
    //Mein Ansatz (falsch!)
    jojobuffer[1] = params->data; //Achtung: falsch!
    
    //   :+1: Es wäre toll, wenn Ihr mir zeigen könntet, wie das funktionieren könnte!
    // Viel Spaß und herzlichen Dank!
    // Vielleicht ist ja einer von Euch ein Profi und findet das sogar einfach 
    
    }
    


  • Ohne die [cpp]-Tags wird sich das keiner anschauen.



  • Hi Tim,

    Was ist denn ein [cpp]-tag?



  • //Typen-Deklaration (in .h-Dateien):
    typedef struct // Request data transmission parameters.
    {
    NodeLogicalAddr_t dstLogicalAddr; // Destination logical address.
    NWKAddr_t dstNWKAddr; // Destination network address.
    NodeAddrMode_t addrMode; // Destination address mode.
    uint8_t srcEndPoint; // Source end-point.
    uint8_t dstEndPoint; // Destination end-point.
    bool arq; // ARQ control.
    bool broadcast; // Broadcast flag.
    uint8_t* data; // Data buffer pointer.
    uint8_t length; // Data length.
    uint8_t handle; // Data handle.
    } FW_DataRequest_t;
    
    typedef struct // Indication data transmission parameters.
    {
    NodeLogicalAddr_t srcLogicalAddr; // Source logical address.
    NWKAddr_t srcNWKAddr; // Network logical address.
    bool isLogicalValid; // Logical address valid flag.
    uint8_t srcEndPoint; // Source end-point.
    uint8_t dstEndPoint; // Destination end-point.
    uint8_t* data; // Data buffer pointer.
    uint8_t length; // Data length.
    bool broadcast; // Broadcast flag.
    uint8_t lqi; // LQI value.
    int8_t rssi; // RSSI value.
    } FW_DataIndication_t;
    
    typedef struct
    {
    uint8_t messageType; //1
    uint8_t nodeType; //1
    uint64_t IEEEAddress;//8
    uint16_t shortAddress; //2
    uint32_t softVersion;//4
    uint32_t channelMask;//4
    uint16_t panId;//2
    uint8_t workingChannel;//1
    uint16_t parentShortAddress;//2
    uint8_t lqi;//1
    uint8_t rssi;//1
    uint8_t boardType;//1
    uint8_t sensorsSize;//1
    union {
    struct {
    float battery;//4
    float temperature;//4
    float light;//4
    } mesh;
    struct {
    uint32_t gpio;
    uint16_t adc0;
    uint16_t adc1;
    uint16_t adc2;
    uint16_t adc3;
    } rcb;
    };
    #ifdef SEND_NODE_NAME
    uint8_t nodeNameId;
    uint8_t nodeNameSize;
    uint8_t nodeName[16];
    #endif
    } TMessageBuffer;
    
    //Wichtige Funktion:
    result_t sendData(void *buffer,uint8_t length)
    {
    FW_DataRequest_t params;
    params.data = (uint8_t*)buffer; //der doch etwas komplexe Datentyp von
    //“buffer” wird auf uint8_t “runter-gecastet“
    //damit die Daten gesendet werden können (SPI)
    params.length = length;
    
    return fw_dataRequest(&params, dataConfirm);
    //fw_dataRequest ist eine “BlackBox-Funktion”, die Daten von einem mC zum //anderen schickt
    }
    
    // Deklaration der Variablen:
    
    TMessageBuffer buffer; //schon vorprogrammiert
    TMessageBuffer jojobuffer[3]; //von mir erzeugt, Array, um die Daten
    // mehrerer (hier 3) Mikrocontroller abzuspeichern
    
    // eigentlicher Programmcode:
    
    //... bis hier hin wird “buffer” mit Daten beladen...
    
    sendData(&buffer,sizeof(buffer)) //Funktion siehe oben => Daten werden
    //gesendet (Übertragung von einem
    //Mikrocontroller zum anderen)
    
    //Die Daten kommen bei einem anderen Mikrocontroller an und werden vom
    //Programm (weitere BlackBox-Funktion)ausgespuckt
    
    void indication(const FW_DataIndication_t *params)
    { //Achtung, dieses “params” hat jetzt einen anderen Datentyp als das obere
    //“params“
    
    uint32_t Variable;
    
    Variable = ((uint32_t*)&params->data[1])[0]; //Beispiel-Zugriff (vorgegeb.)
    //Dieser Zugriff war schon ins Programm integriert und funktioniert!
    //Wenn möglich erklären, was [1] und [0] genau bedeuten
    //In „Variable“ steht dann der Wert von „channelMask“ siehe
    // typedef struct TMessageBuffer
    
    // Ziel: Die Daten, die ursprünglich in „buffer“ abgespeichert waren,
    // nun rück-konvertieren (zum Typ TMessageBuffer) und z.B. in jojobuffer[1]
    // abspeichern
    
    //Mein Ansatz (falsch!)
    jojobuffer[1] = params->data; //Achtung: falsch!
    
    // :) :+1: Es wäre toll, wenn Ihr mir zeigen könntet, wie das funktionieren könnte!
    // Viel Spaß und herzlichen Dank!
    // Vielleicht ist ja einer von Euch ein Profi und findet das sogar einfach
    
    }
    

    das hier^^ zum syntax-highlighting des codes.
    (jaja, früher haben mods noch postings mit fehlenden tags dementsprechend editiert)
    🙂



  • Hi Tagging-Freak

    Vielen Dank für das Umformatieren!

    So, und wer kann mir jetzt mit dem eigentlichen Problem helfen?

    Wäre super, wenn mir da jemand helfen könnte!!!

    Mfg, Johannes



  • laut google geht es dabei um 'eZeeNet'. stimmt das?
    falls ja, es gibt ein API reference manual. dass sollteste dir mal anschauen.
    🙂



  • Hi Zigbee-Freak,

    Ja, darum geht´s. Danke für Deine Nachforschungen!
    Ich habe mir das API reference manual schon angesehen und werde daraus leider nicht besonders schlau.
    Kannst Du nicht vielleicht auch mit dem Code, den ich hier oben gepostet habe, was anfangen? Ist ein bisschen kompliziert, aber wenn man sich reindenkt, sollte es für jemanden, der sich mit der Materie auskennt, eigentlich garnicht allzu schwer sein.

    Wäre super!

    Mfg

    Johannes



  • 1.) Warum ist dein Problem dringender, als das von allen Anderen hier, die hier schreiben?

    2.) Konkretisiere mal deine Problem genauer. Wo genau kommst du nicht weiter. Bekommst du eine Fehlermeldung, usw.

    3.) Lies mal: Das hier.



  • Hallo ProgChild,

    Ich hab meinen ersten Beitrag jetzt nochmal überarbeitet.
    Allerdings, weiß ich nicht, wie ich meine Frage besser formulieren soll.
    Das mit Fehlermeldungen ist ein bisschen schwierig. Ich kann das ganze zwar compilieren, aber das Programm nicht wirklich ablaufen lassen, weil das (so denke ich zumindest) nur auf den Mikrocontrollern ordentlich läuft (das überträgt Daten zwischen den Mikrocontrollern, das zu simulieren übersteigt meine Kenntnisse bei weitem).

    Ich muss hier mal ganz ehrlich sagen, dass in Foren oft ein recht forscher Ton herrscht. Ich versuche, mein Bestes zu geben!
    Es würde mich freuen, wenn jemand sich meinen obersten Beitrag ansehen würde.

    Außerdem, mein Beitrag ist nicht (woher sollte ich das auch wissen) dringender als alle anderen! Er ist nur dringend (für mich) und dabei bleibe ich auch.

    Mfg

    Johannes



  • Student0815 schrieb:

    Ich hab meinen ersten Beitrag jetzt nochmal überarbeitet.
    Allerdings, weiß ich nicht, wie ich meine Frage besser formulieren soll.

    Was ist denn die Frage. Schreib doch einfach mal in Worten auf, was du hast und was du willst und wo dein Problem ist. Was dein Programm machen soll, ist z.B. völlig unklar.

    Student0815 schrieb:

    Außerdem, mein Beitrag ist nicht (woher sollte ich das auch wissen) dringender als alle anderen! Er ist nur dringend (für mich) und dabei bleibe ich auch.

    Damit trittst du den Leuten hier nur auf die Füße. Jeder hält sein eigenes Problem für wichtig. Indem du aber "dringend" dahinter schreibst, tust du so, als hättest du eine Sonderbehandlung verdient.

    jojobuffer[1] = params->data; //Achtung: falsch!
    

    Das funktionert nicht, da jojobuffer[1] nicht vom Typ char* ist.

    Warum müssen denn die Daten unbedingt in eine Struktur vom Typ TMessageBuffer? Informier dich mal, was die einzelnen Einträge dabei bedeuten.



  • //Mein Ansatz (falsch!) 
     jojobuffer[1] = params->data; //Achtung: falsch!
    

    Hi,

    versuch mal das hier:

    jojobuffer[1] = *((TMessageBuffer*)params->data);
    

    Vielleicht klappt das.

    Gruß mcr



  • Hi ProgChild,

    Also tut mir leid, wenn ich jemandem auf die Füße getreten bin. Das wollte ich wirklich nicht zum Ausdruck bringen.

    Ich stelle die Frage vielleicht nochmal neu:

    Das Programm erzeugt irgendwo (in einer Art Black-Box, die (glaube ich) absichtlich verschlüsselt ist (ein .o-Datei?)) einen "Datenhaufen" namens "params->data". Dieser "Datenhaufen" besteht aus lauter unint8_t Elementen. Die Sensordaten, die zuvor in der Struktur "buffer" (bestehend aus den Datentypen uint8_t, uint16_t, uint32_t und float) gespeichert waren, werden dann auf uint8_t gecastet

    params.data = (uint8_t*)buffer;
    

    um über das Netzwerk versendet werden zu können.

    Nun weiß ich nicht, wie man aus diesem "Einheitsbrei" von lauter uint8_t-Daten wieder die verschiedenen Datentypen (uint16_t, uint32_t und float) erzeugt (eine Art Rückwärts-Cast).
    Wenn ich das geschafft habe, möchte ich die ganzen Daten (in ihren jeweiligen unterschiedlichen Typen) wieder in einem einzigen Buffer (Datentyp TMessageBuffer) abspeichern.
    Auf diese Weise würde ich die Kontrolle über den Datenfluss gewinnen.

    Wäre toll, wenn Dir dazu was einfällt!

    Mit freundlichem Gruß

    Johannes



  • Hi MCR,

    Viiiiiiiiiiieeeeeeeelen Dank!
    Das hat einwandfrei geklappt.

    Tausend Dank!

    Johannes


Anmelden zum Antworten