Seite 1 von 1

Daten von seriller Schnittstelle in Textfile schrieben

Verfasst: Montag 27. Januar 2020, 13:34
von Delto_7970
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

Re: Daten von seriller Schnittstelle in Textfile schrieben

Verfasst: Montag 27. Januar 2020, 14:11
von sparrow
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.

Re: Daten von seriller Schnittstelle in Textfile schrieben

Verfasst: Montag 27. Januar 2020, 15:04
von /me
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.

Re: Daten von seriller Schnittstelle in Textfile schrieben

Verfasst: Montag 27. Januar 2020, 15:16
von Jankie
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.

Re: Daten von seriller Schnittstelle in Textfile schrieben

Verfasst: Montag 27. Januar 2020, 15:40
von __blackjack__
Und noch eine Anmerkung: das `serial`-Modul folgt mittlerweile auch der Namenskonvention, also nicht mehr `inWaiting()` benutzen sondern `in_waiting()`.

Re: Daten von seriller Schnittstelle in Textfile schrieben

Verfasst: Montag 27. Januar 2020, 16:26
von Sirius3
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.

Re: Daten von seriller Schnittstelle in Textfile schrieben

Verfasst: Dienstag 28. Januar 2020, 15:39
von Delto_7970
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