Datenpakete sortieren

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
chriskross
User
Beiträge: 1
Registriert: Freitag 19. Februar 2021, 17:38

Hallo, bin ganz neu hier und habe schon ziemlich lange nicht mehr programmiert, daher ist diese Anwendung zurzeit nicht von mir zu bewältigen :-(

Es geht um eine UDS Protokoll welches Datenpakete enthält, ich möchte mir eigentlich die TXT Datei einlesen, und nur gewisse Reihen in eine BIN kopieren lassen.

und zwar möchte ich die Datenpakete welche über Kanal 0x36 gesendet werden in die BIN schreiben lassen.


Das erste bytes nach dem 0x36 ist der Zähler dieser geht von 01 bis 5F

in kl. Bsp was ich meine. 0714 8 10 82 36 01 72 65 59 9C sind die ersten 4 bytes

immer 80 byte Datenpakete

die ersten 4bytes aus der Kette müssen auch übernommen werden also

ID ist immer die 0714 von der die Pakate ausgehen (72 65 59 9C + 0E CC 54 B3 71 99 7C

die ID 077E ist komplett zu ignorieren und nicht zu übernehemen

811) 17043.8 Rx 077E 8 30 0F 00 AA AA AA AA AA
812) 17044.0 Rx 0714 8 21 0E CC 54 B3 71 99 7C die 21,
813) 17044.7 Rx 0714 8 22 FA 90 51 59 28 B3 D2 22
814) 17045.3 Rx 0714 8 23 93 94 E8 A0 A9 6C 90 23 sind Counter also werden nicht übernommen sowie aucg
815) 17045.9 Rx 0714 8 24 48 1C 16 E6 E6 EE F6 24
816) 17046.6 Rx 0714 8 25 90 40 47 B0 47 E6 DC 25 bis 2F dann fängt der Counter wieder bei 20 an ...
817) 17047.2 Rx 0714 8 26 B8 41 3F 79 A2 7A 81
818) 17047.9 Rx 0714 8 27 1A AC DE 69 25 83 01
819) 17048.5 Rx 0714 8 28 68 63 02 29 BC E7 75
820) 17049.1 Rx 0714 8 29 4C 64 C4 A2 FB CC 21
821) 17049.7 Rx 0714 8 2A 9A F0 BA 33 50 02 01
822) 17050.4 Rx 0714 8 2B AC 1B FE 6D 88 AD C3
823) 17051.0 Rx 0714 8 2C 65 61 D2 7F 2F 3C C2
824) 17051.7 Rx 0714 8 2D 42 02 D2 19 59 12 32
825) 17052.3 Rx 0714 8 2E 70 EE 2F D3 28 E3 ED
826) 17052.9 Rx 0714 8 2F F9 14 0D BF 8E 1C E7
827) 17053.8 Rx 077E 8 30 0F 00 AA AA AA AA AA
828) 17054.1 Rx 0714 8 20 D0 66 50 33 F4 1E D9
829) 17054.7 Rx 0714 8 21 E1 8F 5D FB 93 D2 ED
830) 17055.4 Rx 0714 8 22 78 23 22 16 2A 00 00

unsw,

sollte in BIN dann so aussehen:

7265599C0ECC54B371997CFA90515928B3D29394E8A0A96C90481C16E6E6EEF6904047B047E6DCB8413F79A27A811AACDE6925830168630229BCE7754C64C4A2FBCC219AF0BA33500201AC1BFE6D88ADC36561D27F2F3CC24202D21959123270EE2FD328E3EDF9140DBF8E1CE7D0665033F41ED9E18F5DFB93D2ED782322162A

ich hoffe ich konnte das so halbwegs gut erklären, ich wäre über jeden Beitrag sehr froh.

Vielen Dank!!!
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Wo soll man da starten?
Du hast also eine Text-Datei. Dann ist der erste Schritt, die Datei zeilenweise einzulesen, jede Zeile in ihre Bestandteile aufzuspalten und die relevanten Zeilen herauszufiltern.
Bist Du schon soweit, dass Du eine Datei zeilenweise einlesen kannst? Wenn ja, wo kommst Du konkret nicht weiter?
Benutzeravatar
__blackjack__
User
Beiträge: 14054
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@chriskross: Wie findet man denn den Anfang von einem Paket? Überliest man solange Werte bis das erste 0x36-Byte kommt? Diese erste Zeile fehlt in Deinen Beispieldaten auch.

Und meinst Du tatsächlich 80 Bytes pro Paket oder 0x80 Bytes pro Paket, denn Deine Beispielausgabe sind 0x80 Bytes.

Ansonsten allgemein: Programmieren ist Probleme in kleinere Teilprobleme zerlegen, und die auch wieder zerlegen, solange bis die Teilprobleme so klein sind das man sie mit wenigen Zeilen Code lösen kann. Das dann machen und jede einzelne Teilfunktion testen bevor man zur nächsten übergeht, und die Teillösungen zu immer grösseren Teillösungen zusammensetzen, bis am Ende das Gesamtproblem gelöst ist.

Übliche Linien an denen aufgeteilt werden kann ist Eingabe, Verarbeitung, Ausgabe. Und wenn man Teildaten hat die immer gleichartig verarbeitet werden kann man eine Funktion schreiben die einen dieser Teile verarbeitet. Wenn man die Funktion hat, lässt sich trivial das nächstgrössere Problem lösen in dem man eine Funktion schreibt, die die Funktion für einen Teil auf alle Teile anwendet.

Im vorliegenden Fall lässt such das beispielsweise auf die Zeilen anwenden. Man kann eine Funktion schreiben, die eine Zeile in ihre Bestandteile zerlegt und beispielsweise Werte von einem Typ liefert den man mit `collections.namedtuple` erstellt hat um den Bestandteilen Namen zu geben. Nennen wir sie `parse_line()`. Daraus lässt sich dann sehr einfach eine `parse_lines()`-Funktion schreiben, die die `parse_line()`-Funktion auf jede Zeile anwendet.

Dann könnte man sich eine Funktion schreiben die aus diesen verarbeiteten Daten nur die mit einer bestimmten ID heraus filtert. Dann eine die aus einer Folge von diesen Werten einen Strom von Bytewerten liefert. Dann eine Funktion die aus diesem Bytestrom die Datenpakete raus holt und als Folge von Datenpaketen liefert. Dann eine Funktion die eine Folge von diesen Datenpaketen in eine Datei schreibt. Und dann hat man's ja auch schon.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten