Hallo Leute,
ich empfange von einem C - Programm über ethernet ein Struckt und das möchte ich mit struckt.unpack entpacken aber ich bekommen immer die Fehlermeldung struct.error: unpack requires a string argument of length XY.
Also gehe ich davon aus das mein formatstring nicht dem entspricht was ich empfange nur habe ich alles schon mehrmal überprüft und es sollte eigentlich funktionieren. :K
typedef struct {
WORD TYPE;
WORD ID;
DWORD version;
float translation;
float rotation;
float x_position;
float y_position;
float orientation;
DWORD total_distance; // in m Meter
DWORD robot_alive_time; // in min
WORD Akku_Voltage;
short Akku_Current;
WORD Akku_Status;
WORD Akku_Charge_Ah;
WORD Akku_Discharge_Ah;
WORD Akku_Regen_Ah;
WORD DUMMY_Akku_Portcontroll;
WORD DUMMY_Akku_Project_Status;
BYTE Akku_Max_Cell_Voltage;
BYTE Akku_Min_Cell_Voltage;
BYTE Akku_System_Temp;
BYTE Akku_Max_Cell_Temp;
BYTE Akku_Min_Cell_Temp;
BYTE not_in_use;
// WORD Akku_Cell_Voltage[16];
// WORD Satel_Handnotaus_Sendeleistung;
WORD Bamobil_Initialise[2];
WORD Bamobil_Status[2];
WORD Bamobil_Logic[2];
WORD Bamobil_Error[2];
short Bamobil_latest_upm[2];
short Bamobil_latest_Current[2];
short Bamobil_latest_v_out[2]; // Mittelwert der Ausgangsspannung zu den Motoren
WORD Bamobil_latest_p_motor[2]; //Leistung Motor
WORD Bamobil_latest_t_motor[2]; //Temperatur Motor
WORD Bamobil_latest_t_igbt[2]; //Temperatur Regler
BYTE Front_light_intensity;
BYTE Autonomic_drive;
BYTE flags[3];}
@Tyll: Zumindest das Ende ist falsch. Du hast da nur drei 's' stehen, es gibt aber fünf Bytewerte. Als letzten Wert in der Struktur steht ein *Array* mit drei Bytewerten. Vielleicht hast Du diesen Fehler bei den anderen Arrays auch gemacht, da bin ich jetzt zu faul zum Zählen.
Letztendlich sollte man hier IMHO aber mit `ctypes` arbeiten statt ein riesiges Tupel mit Werten zu erstellen wo man sich dann die Indizes zu den Werten heraus suchen muss und wo die Arrays einfach so ”platt geklopft” werden.
Also ich habe die Fehler jetzt mal rausgemacht wie ich hoffe aber es läuft immer noch nicht!
Benutze ich irgentwo den falschen Typ oder was mach ich falsch
Wie sehen denn deine Daten aus? Wie viele Bytes empfängst du und welche Länge erwartet das unpack? Das struct-Modul hat dafür eine schöne calcsize-Funktion. Und dann kann es natürlich noch passieren, dass du nicht alle Daten auf einmal empfängst.
Die Daten sind das im ersten Post gezeigte Struckt.
Aber wie Funktioniert den die calcsize-Funktion da muss ich doch auch einen Formatstring eingeben und dann hab ich doch wieder das gleich oder nicht ?
@Tyll: `calcsize()` sagt Dir zur gegebenen Formatzeichenkette wie viele Bytes das sind. Und dann kannst Du Dir mal die Länge der empfangenen Daten anzeigen lassen. Und wenn die Unterschiedlich sind, siehst Du um wie viel die sich Unterscheiden. Das hilft vielleicht das Problem zu finden. Du könntest auch mal mit einem C-Programm die Grösse der Struktur ausgeben lassen.
Edit: Deine Formatzeichenkette enthält 103 Bytes, die Struktur ist laut `clang`-Compiler 104 Bytes gross. Falls die Anzahlen und Typen stimmen würde ich auf „padding” tippen. Ein Grund warum man eigentlich keine `struct`\s direkt über Leitungen schicken sollte. Was welcher Compiler mit undefinierten Bytes auffüllt ist zu einem grossen Teil implementationsabhängig.