Binary Communication Protocol richtig übersetzten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
draufunddran
User
Beiträge: 34
Registriert: Freitag 26. Juni 2009, 13:43

Hallo,

vielleicht kennen von euch ein paar das Projekt "ArduPilot Mega" von "DIY Drones". Ich wollte mir dazu eine eigene Groundstatation Programmieren, jedoch hab ich mit dem Binary Communication Protocol ein paar probleme.

Wenn ich z.b. das Packet mit der Message ID 0x02 übersetzte passt alles, so lange die Werte positiv sind. Sobald die Werte negativ werden müssten, zeigt die Ausgabe in der Shell eine Art überlauf.

hier mal der Teil der die Message ID 0x02 übersetzt:

Code: Alles auswählen

    if ord(msg[0]) == 2:
        print ord(msg[0])
        attitude[0] = ord(msg[3]) << 8
        attitude[0] = attitude[0] + ord(msg[2])

        attitude[1] = ord(msg[5]) << 8
        attitude[1] = attitude[1] + ord(msg[4])

        attitude[2] = ord(msg[7]) << 8
        attitude[2] = attitude[2] + ord(msg[6])

        attitude[0] = float(attitude[0]) / 100
        attitude[1] = float(attitude[1]) / 100
        attitude[2] = float(attitude[2]) / 100
scheinbar hab ich ein Problem mit signed und unsigned. Aber wie regelt das Python? ich hab leider noch keine Projekte gehabt in denen ich auf so ein Problem gestossen bin und hab deshalb auch keine Ahnung was da falsch läuft.

Über ein paar Tipps würd ich mich sehr freuen :)

greetz,

draufunddran
BlackJack

@draufunddran: Wie sollte denn das bei Deinem Code auch negativ werden? Du müsstest schon selbst darauf achten, dass Du negative Zahlen erkennst und entsprechend behandelst. Die werden im 2er-Komplement gespeichert und eine negative 16-Bit-Zahl erkennst Du daran, dass das oberste Bit gesetzt ist.

Allerdings würde ich davon abraten das wirklich "zu Fuss" zu programmieren und die Bytes alle einzeln umzurechnen, und statt dessen das `struct`-Modul verwenden. Da wird das auf so einen Einzeiler hinauslaufen (ungetestet):

Code: Alles auswählen

attitude = [x / 100.0 for x in struct.unpack('3h', msg[1:])]
Wenn die Datenpakete etwas komplexer werden und auch Python-Pakete ausserhalb der Standardbibliothek in Frage kommen, schau Dir mal `construct` an.
Benutzeravatar
draufunddran
User
Beiträge: 34
Registriert: Freitag 26. Juni 2009, 13:43

@BlackJack: Danke für deine schnelle Antwort, ich dachte mir schon das es einfacher geht, ich hab aber einfach das Modul nicht gekannt. Habs auch schon zu laufen gebracht.

greetz Draufunddran
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Sind diese beiden Vorschläge evtl. auch für Dich interessant?:
http://www.python-forum.de/viewtopic.ph ... 20#p190220
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten