Python string ersetzt string statt sich anzufügen

Revolution

Commodore
Registriert
März 2008
Beiträge
4.964
Hallo zusammne,

Ich komme gerade nicht weiter ich lese aus einem seriellen device daten aus und gebe dieses dann Zeile pro Zeile aus Filter die Zeilen aber weg die ich nicht brauche.

Jetzt wollte ich hinter die Variable line noch einen Parameter anhängen. Aber aus mir unerfindlichen gründen wird nichts hinten angehangen sondern der vordere teil genau dadurch überschrieben. Statt $GPGGA steht dann ,,PGGA, wie bekomme ich das hin das die , hinter die Variable line geschrieben werden?

Python:
with serial.Serial('/dev/ttyUSB1', baudrate=115200, timeout=1) as ser:
        # read 10 lines from the serial output
        i=0
        while True:
                i = i + 1
                line = ser.readline().decode('ascii', errors='replace')
                timestamp = str(time.time_ns())
                timeshort = timestamp[:-8]
                sep = ","

                if "$GPGGA,,,,,,0,,,,,,,,*66" in line:
                        pass
                elif "$GPGGA" in line:
                        line = line.split('\n', 1)[0]
                        TOPIC = "car/123/gga"
                        DATA = line + sep +  sep
                        client.publish(TOPIC, DATA, qos=QOS)
                        client.loop()
                else:
                        pass
 
Zuletzt bearbeitet:
Schau mal mit type(line) und type(sep), welche Typen Python da vermutet.
Evtl. tut es mit f'{line}{sep}{sep}'
 
kannst du mal das line als hex string ausgeben und posten, sofern keine sensiblen Daten drinstecken?

der Separator scheint mir da nicht das Problem zu sein, sondern eher der line-String, evtl. steckt da noch ein Carriage Return drin.



Edit: Jupp, gerade mit Minimalbeispiel nachgestellt:

line = "$GPGGA\r"
sep = ","
print (line + sep + sep)
,,PGGA

:)
 
Zuletzt bearbeitet:
Code:
24 47 50 47 47 41 2c 32 31 30 30 30 30 2e 30 30 2c 34 38 33 30 2e 31 31 36 30 30 30 2c 4e 2c 30 31 31 32 37 2e 35 30 35 39 31 30 2c 45 2c 31 2c 30 34 2c 34 2e 36 2c 34 39 33 2e 34 2c 4d 2c 34 37 2e 30 2c 4d 2c 2c 2a 36 43 0d 0a

Die Zeile kommt relativ unspektakulär aus nem GPS Empfänger
 
Der Carriage Reaturn (0d) ist der Übeltäter, den würde ich rausfiltern. Ebenso den New Line am Ende, sonst hast du die beiden Kommata in der nächsten Zeile.
Nach dem Filtern von \r und \n sollte das aber auch passen mit dem String.
 
  • Gefällt mir
Reaktionen: Revolution und 0x8100
jup das wars danke das hat mich jetzt ne zeit gekostet ging eigentlich davon aus das ich es mit line = line.split('\n', 1)[0] weg bekommen habe... war aber ein Denkfehler line = line.strip() war jetzt meine Lösung :)

Dank dir
 
  • Gefällt mir
Reaktionen: mercury und DarkAngel2401
Falls du noch etwas optimieren möchtest:

Sind die pass Befehle nur Platzhalter für Code der folgt? Wenn nicht kannst du das if raushauen und mit dem elif kombinieren und das else braucht es auch nicht.
i = i + 1 kann man auch so ausdrücken: i += 1. Die sep Variable macht eigentlich auch nicht soviel Sinn, würde es ähnlich wie @DarkAngel2401 machen: f‘{line},,‘
 
  • Gefällt mir
Reaktionen: Revolution
Zurück
Oben