visual c++ 2008: spezielle daten über serial port einlesen



  • hallo allerseits

    wir bekommen von unserem helikopter über einen bluetooth adapter daten über den COM4 port rein. diese daten sollen von einem c++ programm gelesen werden. das reicht vorerst schon.

    im internet gibt es viele anleitungen dazu, und an sich daten zu lesen ist kein problem. unsere daten haben allerdings die folgende struktur:

    startbyte1: 'P'
    startbyte2: 'I'

    struct DATA
    {
    unsigned char ident;
    short angvel_pitch;
    short angvel_roll;
    short angvel_yaw;
    short acc_x;
    short acc_y;
    short acc_z;
    long angle_pitch;
    long angle_roll;
    unsigned char pitch;
    unsigned char roll;
    unsigned char thrust;
    unsigned char yaw;
    unsigned char command_status;
    unsigned short timeStamp;
    unsigned char chkSum;

    }

    stopbyte1: 'E'
    stopbyte2: 'Z'

    weiss jemand, wie man es hinbekommen kann, diesen struct einzulesen?
    wir verwenden vorgeschriebene header files von hier: http://www.tetraedre.com/advanced/serial2.php

    das paket "serial2".

    wir haben es so umgebaut, dass nicht einen char, sondern eben unser struct als datenstruktur eingelesen werden soll. es wird compiliert (im moment mit microsoft visual c++ 2008), es liest etwas, aber eben nicht unseren struct.

    ein weiteres problem schint zu sein, dass immer nur 1 byte pro event gelesen wird, also kann es den struct ja gar nicht in einem event lesen...

    wir sind selbstverständlich auch für lösungen mit anderen vorgeschriebenen files und/oder compiler offen, fall jemand da schon einmal so etwas gemacht hat.

    danke im voraus für jede hilfe!



  • Du musst deine Struktur auf eine Art serialisieren (= in eine Anzahl von Bytes umwandeln). Wie Du das genau tust hängt von deinen Anforderungen ab.

    Dann sieht der Ablauf so aus:
    Sender: Struktur serialisieren , senden
    Empfänger: empfangen, deserialisieren

    Fürs selrialisieren gibts mehrere Möglichkeiten. Google mal danach...



  • das haben wir uns auch schon überlegt, leider können wir am sender nichts machen...

    sprich der sendet immer einen struct, egal was wir tun.

    man müsste also diesen struct zuerst nur als folge von bytes lesen und dann als strct interpretieren lassen...hm



  • sprich der sendet immer einen struct, egal was wir tun.

    Es werden immer Bytes gesendet.
    Das Problem ist wie sind die Bytes zu interpretieren.

    Was ist denn eigentlich das Problem?
    Kennst Du die das Serialisierungsschema nicht?

    Edit: Hab dein Post nicht so genau gelesen:

    man müsste also diesen struct zuerst nur als folge von bytes lesen und dann als strct interpretieren lassen...hm

    Genau. Nur wie ist diese Folge von Bytes organisiert, das ist die Frage. Da hilft nur Doku lesen od. reverse Engineering.



  • okay...das weiss ich natürlich auch nicht. aber es ist scheinbar nicht möglich sozusagen direkt die eingelesenen daten als struct zu interpretieren, sondern nur einfach die eingelesenen bytes irgendwo zwischenspeichern, und dann auslesen und interpretieren.

    da bleibt noch die frage: als was für ein typ speichere ich einzelne bytes, so dass ich damit dann ohne informationsverlust weiterarbeiten kann?

    ich müsste die gelesenen bytes ja irgendwo speichern, dann je nach dem ein einzelnes byte als char interpretieren, oder 2 zusammhängen und als short interpretieren etc.

    wie macht man das am besten?



  • ich müsste die gelesenen bytes ja irgendwo speichern, dann je nach dem ein einzelnes byte als char interpretieren, oder 2 zusammhängen und als short interpretieren etc.

    ich würde nicht die bytes abspeichern, sondern mit diesen bytes die struktur abfüllen und dann dir die struktur halten.



  • ds geht nicht, da teilweise die short und long ja aus mehreren bytes bestehen.

    aber wir habens nun gerade geschafft, programm läuft und alle chars und zahlen können konstruiert werden. ich danke herzlich für die hilfe!




Anmelden zum Antworten