Daten von seriller Schnittstelle in Textfile schrieben

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
Delto_7970
User
Beiträge: 14
Registriert: Montag 27. Januar 2020, 13:23

Hallo zusammen,
ich habe folgendes Problem:

Ich habe ein Python Programm geschrieben, dass mir die Daten von 2 seriellen Schnittstellen (eine von einem Arduino, die andere von einer Waage) ausließt
und in ein Textfile schriebt. Soweit funktioniert das alles ziemlich gut. Das Problem ist nun, dass die Daten von den beiden Schnittstellen im Textfile immer
untereinander geschrieben werden und ich hätte gerne alles in einer Zeile.

Hier mein Code:

Code: Alles auswählen

if __name__ == "__main__":

    import serial                       #Serielle Lib importieren
    from datetime import datetime       #Echtzeit importieren

    Port_Waage = serial.Serial('com4', 2400)            #Seriellen Port für Waage definieren
    Port_Arduino = serial.Serial('com3', 115200)        #Seriellen Port für Arduino definieren
    
    

    while (1==1):                                                       #Schleife erzeugen
        if (Port_Arduino.inWaiting()>0):                                #Warten auf Daten von Arduino
            
            Port_Waage.write("w")                                       #senden an Waage
            Daten_Waage = Port_Waage.readline()                         #auslesen von Waage
            
            Daten_Arduino = Port_Arduino.readline()                     #auslesen von Arduino
            
            print(datetime.now().strftime('%H-%M-%S'))                  #Zeit ausgeben
            print(Daten_Waage)                                          #Werte Waage ausgeben
            print(Daten_Arduino)                                        #Werte Arduino ausgeben

            file = open("Test1.txt","a")
            file.write(datetime.now().strftime('%H-%M-%S'))
            file.write(" ")
            file.write(Daten_Waage)
            file.write(" ")
            file.write(Daten_Arduino)
            file.close()
Die Zeit und die Daten_Waage werden noch in eine Zeile geschrieben. Die Daten vom Arduino dann darunter..
Ich hoffe die Frage ist nicht zu "dämlich". Bin noch Python-Anfänger..

Vielen Dank schon mal.
LG Flo
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Variablennamen schreibt man in Python klein_mit_unterstrich, Klassennamen MixedCase, Konstanten KOMPLETT GROSS.
Verwende für das öffnen von Dateien das with-statement, damit du dir das Schließen sparen kannst.

Offensicht beinhalten die von dir gelesenen Daten einen Zeilenumbruch ("\n"). Wenn du diese Daten unverändert in eine Datei schreibst, wird dort natürlich die Zeile umgebrochen. Zeichenketten haben eine Funktion .strip() die überflüssige Zeichen am Anfang und am Ende einer Zeichenkette entfernt. Dazu gehören unter anderem Leerzeichen und Zeilenumbrüche.
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Noch eine Anmerkung zum Code. Du hast da `while (1==1)`. Die Klammern braucht man schon mal nicht, also wird das `while 1==1`. Und `1==1` ist `True`, also kannst du auch direkt `while True` schreiben.
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Noch eine Anmerkung von mir:

Das "Hauptprogramm" steht normalerweise in einer Funktion die main() heißt, diese main() Funktion wird dann in dem if __name__ == "__main__": aufgerufen. Also so:

Code: Alles auswählen

import serial
from datetime import datetime


def main():
    port_waage = serial.Serial('com4', 2400)
    port_arduino = serial.Serial('com3', 115200)
    while True:
        if port_arduino.inWaiting() > 0:
            port_waage.write("w")
            daten_waage = port_waage.readline()
            daten_arduino = port_arduino.readline()
            aktuelle_zeit = datetime.now().strftime('%H-%M-%S')

            print(aktuelle_zeit)
            print(daten_waage)
            print(daten_arduino)
            
            with open("Test1.txt", "a", encoding="UTF-8") as outputfile:
                outputfile.write(f"{aktuelle_zeit} {daten_waage} {daten_arduino}")

if __name__ == "__main__":
    main()
Beim if brauchst du wie bei der while Schleife keine Klammern um die Bedingung.
Auch solltest du die Schnittstellen wieder schließen oder du benutzt dafür auch das with Statement.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Und noch eine Anmerkung: das `serial`-Modul folgt mittlerweile auch der Namenskonvention, also nicht mehr `inWaiting()` benutzen sondern `in_waiting()`.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Für mich stellt sich die Frage, wie Du die beiden Inputquellen synchronisieren willst. Du wartest jetzt auf Input der Waage, was passiert aber, wenn der Arduione mehr oder weniger Daten sendet, geht das auseinander.

Zeiten werden üblicherweise mit : statt - getrennt.
Delto_7970
User
Beiträge: 14
Registriert: Montag 27. Januar 2020, 13:23

Vielen Dank für alle Antworten und Hinweise..
Ich habe das Problem gefunden. Am Ende der strings, die ich über die serielle Schnittstelle ausgelesen haben waren Zeilenumbrüche
mit dabei. Diese habe ich entfernt und jetzt kann ich alles in eine Zeile schrieben lassen..
Sirius3 hat geschrieben: Montag 27. Januar 2020, 16:26 Für mich stellt sich die Frage, wie Du die beiden Inputquellen synchronisieren willst. Du wartest jetzt auf Input der Waage, was passiert aber, wenn der Arduione mehr oder weniger Daten sendet, geht das auseinander.

Zeiten werden üblicherweise mit : statt - getrennt.
Also meine Idee ist, dass ich das Programm warten lasse bis der Arduino Daten sendet, dann wird ein 'w' an die Waage gesendet somit bekomme ich den Waagenwert und dann wird alles ausgegeben.
Der Arduino ist so programmiert, dass er alle 5 sek. Daten über die serielle schnittstelle ausgibt. Funktioniert bis jetz eg ziemlich gut.

Nochmals danke für alle Hinweise bzw. Ergänzungen.
LG Flo
Antworten