Seite 1 von 1
Ubuntu ändert USB Device während einer Messung!
Verfasst: Donnerstag 5. März 2020, 14:47
von Delto_7970
Hallo zusammen,
ich habe ein Python-Script geschrieben, dass mir serielle Daten von einem Arduino und 2 Waagen ausliest und in ein Textfile schreibt!
Ich arbeite mit Ubuntu! Funktioniert soweit sehr gut!
Nun habe ich das Problem, dass während einer Messung der Device der Waagen geändert wird und dadurch die Aufzeichnung stoppt! (z.B.: von /dev/ttyUSB0 auf /dev//ttyUSB2)
Dies geschiet einfach so ohne das ich etwas verändere oder aus und einstecke. Der arduino bleibt aber immer auf /dev/ttyACM0. Wie gesagt es sind zwei Waagen angeschlossen.
Da meine Messungen über mehrer Tage gehen ist das ein großes Problem! Hat jemand Erfahrungen mit solchen Problemen gemacht bzw. weiß wiso sich der Device einfach so ändert?
Bin für jede Hilfe dankbar!
LG Flo
Re: Ubuntu ändert USB Device während einer Messung!
Verfasst: Donnerstag 5. März 2020, 15:02
von __blackjack__
Was sagen denn die entsprechenden Protokolldateien zu dem Wechsel?
Ganz davon abgesehen würde ich eine Udev-Regel schreiben die einen Symlink auf das entsprechende Gerät setzen, so dass das über diesen Symlink immer über den gleichen Namen erreichbar ist, egal als wie vieltes Gerät oder wie oft das angesteckt wird.
Re: Ubuntu ändert USB Device während einer Messung!
Verfasst: Donnerstag 5. März 2020, 15:27
von Delto_7970
Wie kann ich die Protokoll Datei aufrufen? Arbeite erst seit kurzem mit Ubuntu und Python und bin deshalb noch in der Lernphase.
Ah oke, ja das wäre sehr hilfreich. Wie genau gehe ich da vor um so eine Regel zu setzten?
LG Flo
Re: Ubuntu ändert USB Device während einer Messung!
Verfasst: Donnerstag 5. März 2020, 20:23
von sparrow
Ich befüchte, dann musst du dich intensiv mit Linux auseinander setzen.
Re: Ubuntu ändert USB Device während einer Messung!
Verfasst: Donnerstag 5. März 2020, 23:06
von __deets__
Das die seriellen Geräte während des Betriebs die Reihenfolge wechseln ist hochgradig ungewöhnlich und dem sollte man auf den Grund gehen. Ein Ding das zu tun (und damit kommst du auch der udev Regel näher) ist die udev Ereignisse zu beobachten. Dazu gibt es das udevadm monitor Kommando.
https://linux.die.net/man/8/udevadm
udevadm monitor --property --kernel --udev
bitte vor Beginn einer Messung laufen lassen, und das Protokoll hier veröffentlichen.
Re: Ubuntu ändert USB Device während einer Messung!
Verfasst: Donnerstag 12. März 2020, 09:41
von Delto_7970
Also ich habe es geschafft einen Symlink zu erstellen. Dieser funktioniert soweit. Allerdings habe ich weiterhin das Problem, dass bei einer Änderung der Devicenummer die Messung zusammenbricht. Ich denke da das Gerät dann kurzzeitig nicht erkannt wird.
Ich würde nun gerne in meinem Pythonskript eine Bedingung einbauen, sodass mir nur Daten ausgegeben werden wenn das Gerät auch tatsächlich am PC angeschlossen ist. So dass ich auch während einer Messung den Arduino abstecken könnte und dann wird die Messung einfach pausiert und wenn ich Ihn wieder anstecke weiterläuft. Kann man das in der Art mit Python realisieren? Vll über eine If Bedingung so in der Art if ... serielle Schnittstelle vorhanden ... print else wait?
LG Flo
Re: Ubuntu ändert USB Device während einer Messung!
Verfasst: Donnerstag 12. März 2020, 10:10
von __deets__
Wenn du eine Ausnahme bekommst (und ich denke mal das passiert), dann kannst du die abfangen & zb nach einem timeout einen weiteren Versuch starten. Das das überhaupt passiert halte ich aber für ein Problem. Das ist nicht normal.
Re: Ubuntu ändert USB Device während einer Messung!
Verfasst: Donnerstag 12. März 2020, 10:41
von Hase
Hallo,
ich arbeite selbst mit Waagen und lange laufenden Prozessen. Dass ein Gerät so einfach den USB-Port wechselt, ist definitiv nicht normal und habe ich auch unter Linux noch nie erlebt. Es erscheint mir aber möglich, dass die Waagen, wenn sie lange nicht aktiv sind, in einen Stand-by-Modus gehen und sich beim Aufwachen neu anmelden, während Linux die alte Verbindung für noch aktiv hält. Manche Waage müssen auch nach einer gewissen Zeit resetten, wenn etwa der interne Speicher voll ist.
Da man an der Firmware der Waagen nichts machen kann, bleibt nur - wie berets von den anderen Mitforisten gesagt - eine eigene UDEV-Regel zu erstellen, um unabhängig von /dev/USBx zu werden. (siehe z.B.
https://wiki.siduction.de/index.php?tit ... udev-Regel ).
Re: Ubuntu ändert USB Device während einer Messung!
Verfasst: Donnerstag 12. März 2020, 11:01
von __deets__
Die UDEV-Regel hat er ja schon. Ich frage mich dann nur, was die Dinger dann wieder aufweckt? Und warum man das nicht periodisch machen kann?
Re: Ubuntu ändert USB Device während einer Messung!
Verfasst: Donnerstag 12. März 2020, 11:06
von Delto_7970
Danke für die Info.
Ja ich habe bereits eine UDEV-Regel erstellt und diese funktioniert auch. Ich kann die Waagen über meinen definierten Port ansprechen. Aber wenn sich der Device ändert bricht die Messung denoch ab, da ich zur Datenabfrage der Waagen etwas an diese sende. Ich denke, dass aber während der Device-Änderung das Gerät für kurze Zeit nicht erkannt wird und dann bekomme ich eine Fehlermeldung beim Senden an die Waage.
Jetzt probiere ich gerade, dass mein Programm bei einer Fehlermeldung einfach neustarten soll. Allerdings kenne ich nich alle Befehle und Funktionen in Python, da ich noch ein ziemlicher Anfänger bin!
Ich habe jetzt ein Unterprogramm (aufzeichnung) nur für die Messung erstellt. Also das Auslesen der Daten von Arduino und Waage! Wie kann ich jetzt eine Bedingung schreiben, dass sich diese Programm immer wierderholt wird falls es zu einem Fehler kommt?
Code: Alles auswählen
def aufzeichnung():
arduino = serial.Serial(Port_Arduino, Baud_Arduino)
waage = serial.Serial(Port_Waage, Baud_Waage)
while True: #Schleife erzeugen
if arduino.inWaiting()>0: #Warten auf Arduino-Daten
waage.write("w") #'w' an Waage senden
daten_waage = waage.readline() #Waagen-Daten auslesen
daten_waage = str(daten_waage) #Wert in string umwandeln
daten_waage = daten_waage.replace("g", "") #'g' entfernen
daten_waage = daten_waage.replace("\r\n", "") #Zeilenumbruch entfernen
daten_arduino = arduino.readline() #Arduino-Daten auslesen
daten_arduino = str(daten_arduino) #Wert in string umwandeln
daten_arduino = daten_arduino.replace("\r\n", "")
daten = daten_waage + daten_arduino
aktuelle_zeit = datetime.now().strftime('%d.%m.%y %H:%M:%S')
#print(aktuelle_zeit, daten)
print(aktuelle_zeit)
print(daten)
with open(Datei,"a") as file:
file.write(aktuelle_zeit)
file.write(daten)
Da müsste ich ja jetz dann sowas wie:
[/code]
if __name__ == "__aufzeichnug__":
aufzeichnung()
[/code]
zum ausführen schreiben und dann noch eine Bedingung, dass das Programm bei Fehlermeldung wiederholt wird, oder?
Kann mir da jemand weiterhelfen?
LG Flo
Re: Ubuntu ändert USB Device während einer Messung!
Verfasst: Donnerstag 12. März 2020, 11:17
von Sirius3
Jetzt sollte man halt noch genau wissen, wo der Fehler auftritt, und wie der komplette Traceback dazu aussieht. Warum wartest Du auf Daten vom `arduino` um dann an `wage` etwas zu schicken? Das sieht auch noch schlimm nach Python2 aus?
Muß das "w" nicht noch mit einem Zeileendezeichen abgeschlossen werden? Man sollte nicht mit replace auf Strings losgehen, wie sieht denn das aus, was Du per readline liest?
Konstanten schreibt man KOMPLETT_GROSS, nicht nur mit großen Anfangsbuchstaben.
Auch beim Schreiben in die Datei scheint ein Zeile-Endezeichen zu fehlen.
Auch bräuchte man noch irgendeine Kontrolle, dass das was vom Arduino oder von der Waage gelesen wird, vollständig ist. Wie sehen denn dort die Protokolle aus?
Alle Kommentare sind überflüssig, weil sie nur beschreiben, was eh schon im Code steht.
`inWaiting´ sollte man nicht mehr benutzen.
Datumsangaben immer mit vollständigem Jahr und der Sortierung Jahr-Monat-Tag:
Code: Alles auswählen
def aufzeichnung():
arduino = serial.Serial(ARDUINO_PORT, ARDUINO_BAUD)
waage = serial.Serial(WAAGE_PORT, WAAGE_BAUD)
while True:
if arduino.in_waiting:
waage.write("w") # hier fehlt noch ein Zeileendezeichen?
daten_waage = waage.readline().decode('ASCII').strip()
# TODO: prüfen der Zeile und nicht nur irgendein g entfernen
daten_arduino = arduino.readline().decode('ASCII').strip()
# TODO: prüfen der Zeile
with open(DATEINAME, "a") as output:
output.write("{:%Y-%m-%d %H:%M:%S} {} {}\n".format(datetime.now(), daten_waage, daten_arduino))
def main():
while True:
try:
aufzeichnung()
except IOError as err:
# bei Fehler einfach neustarten
print(err)
if __name__ == '__main__':
main()
Re: Ubuntu ändert USB Device während einer Messung!
Verfasst: Donnerstag 12. März 2020, 11:30
von Delto_7970
Der Arduino sendet mir alle 5 Sekunden Daten (Temperatur, Druck, usw.)! Ich warte auf diese Daten und dann lasse ich mir den Waagenwert auslesen. Ich will den Waagenwert zur gleichen Zeit wie die Arduinodaten. Ich habe dann in einer Zeile alle Werte vom Arduino, von der Waage sowie Datum und Uhrzeit. Diese Zeile schreibe ich in ein File. Dann wird wieder auf die Daten vom Arduino gewartet und erneut alles in einer Zeile unter die vorherige geschrieben. Das Programm funktioniert so genau so eigentlich ziemlich gut und für meine Ansprüche ausreichend. Sorry für die formalen Fehler aber wie gesagt ich bin noch Python-Anfänger und vorrangig bin ich daran interessiert, dass das Programm läuft. Und bis auf die Abbrüche durch die Device Änderung tut es das auch. Deshalb möchte ich einfach, dass die Funktion immer wieder wiederholt wird wenn es zu einem Fehler kommt?
Re: Ubuntu ändert USB Device während einer Messung!
Verfasst: Donnerstag 12. März 2020, 11:31
von Delto_7970
Ah sorry hab deinen Code nicht gesehen. Ich probier mal alle deine vorgeschlagenen Änderungen aus. Danke!
Re: Ubuntu ändert USB Device während einer Messung!
Verfasst: Donnerstag 12. März 2020, 11:39
von Sirius3
@Delto_7970: ja, und Dein Code funktioniert nur scheinbar. Weil Übertragungsfehler halt nicht deterministisch auftreten. Daher mußt Du robusten und guten Code schreiben, und diese Ausrede, man sei noch Anfänger und hat deshalb keine Lust etwa zu lernen, konnte ich noch nie leiden. Hier hat es viele Leute, die wollen Anfängern helfen, aber wenn da nur ein "ist mir doch scheißegal was ihr schreibt, ich höre sowieso nicht auf Euch" kommt, dann vergeht einem die Lust.
Also entweder fängst Du an, das zu lesen, was hier geschrieben wird, anstatt immer nur den selben Satz wie eine hängende Schallplatte zu wiederholen.
Du beantworte endlich die Fragen, die ich gestellt habe, weil die sollen Dich dahin bringen, ein stabiles Programm schrieben zu können.
Re: Ubuntu ändert USB Device während einer Messung!
Verfasst: Donnerstag 12. März 2020, 12:06
von __blackjack__
`Serial`-Objekte sind ja auch Kontextmanager, die würde ich dann auch noch mit ``with`` verwenden, damit die Verbindungen ordentlich aufgeräumt werden wenn es zu einer Ausnahme kommt.
Und ist das `arduino.in_waiting` in einer „busy waiting loop” wirklich so sinnvoll? Kann man nicht einfach blockierend eine Zeile vom Arduino lesen und dann die Waage abfragen? Vielleicht auch einfach als Schleife über das `arduino`-Objekt oder mindestens über ``iter(arduino.readline, b"")``.
Re: Ubuntu ändert USB Device während einer Messung!
Verfasst: Donnerstag 12. März 2020, 12:20
von Sirius3
Man will ja hier keinen Anfänger überfordern:
Code: Alles auswählen
def daten_lesen():
with serial.Serial(ARDUINO_PORT, ARDUINO_BAUD) as arduino, serial.Serial(WAAGE_PORT, WAAGE_BAUD) as waage:
for daten_arduino in arduino:
daten_arduino = daten_arduino.decode('ASCII').strip()
# TODO: prüfen der Zeile
waage.write("w") # hier fehlt noch ein Zeileendezeichen?
daten_waage = waage.readline().decode('ASCII').strip()
# TODO: prüfen von daten_waage und nicht nur irgendein g entfernen
yield daten_waage, daten_arduino
def verlaesslich_daten_lesen():
while True:
try:
yield from daten_lesen()
except IOError as err:
# bei Fehler einfach neustarten
print(err)
def main():
for daten_waage, daten_arduino in verlaesslich_daten_lesen():
with open(DATEINAME, "a") as output:
output.write("{:%Y-%m-%d %H:%M:%S} {} {}\n".format(datetime.now(), daten_waage, daten_arduino))
if __name__ == '__main__':
main()
Re: Ubuntu ändert USB Device während einer Messung!
Verfasst: Donnerstag 12. März 2020, 12:47
von Delto_7970
Erstmal danke für alle Antworten und Hinweise!
@Sirius3: Sorry, wollte dich nicht beleidigen oder dir zu nahe treten. Aber ich habe nie geschrieben "ist mir egal". Ich habe lediglich erwähnt, dass ich zuerst an der Funktion des Programmes interessiert bin und in weitere Folge kann man ja Formale Fehler wie Groß- und Kleinschreibung bei Konstanten oder Uhrzeit- und Datumsangaben bearbeiten.
Auf jeden Fall danke für deine Hilfe. Ich kann jetzt einen Device trennen und wieder anstecken und die Messung läuft weiter. Natürlich könnte ich mich noch viel intensiver mit dem Code beschäftigen aber mir fehlt dann auch irgendwo die Zeit. Meine Hauptaufgabe liegt in der Auswertung der Messdaten. Die Programmierung ist sozusagen ein Mittel zum Zweck und auch nicht mein Fachbereich! Das hat nichts damit zu tun, dass ich nichts lernen will oder deine Zeit verschwenden will.
@_blackjack_: Meinst du das auslesen der Daten mit with verwenden? Das mit dem in_waiting funktioniert soweit aber kann gut sein, dass es besserer Ausführungen gibt. Das müsste ich mir nochmal genauer ansehen.
LG Flo
Re: Ubuntu ändert USB Device während einer Messung!
Verfasst: Donnerstag 12. März 2020, 12:51
von Delto_7970
@_blackjack_
Danke für den überarbeiteten code. Werde probieren deine Verbesserungsvorschläge anzuwenden!
LG Flo
Re: Ubuntu ändert USB Device während einer Messung!
Verfasst: Donnerstag 12. März 2020, 13:09
von __blackjack__
@Delto_7970: Der Code ist von Sirius3, nicht von mir.
Das mit der Formatierung von Zeitangaben würde ich nicht als Formsache ansehen. Zum Coronavirus hat das Johns Hopkins ja beispielsweise laufend aktualisierte Datensätze bei Github zur Verfügung gestellt und da ist dann die erste Hürde was damit zu machen das die Dumpfbacken ihr dusseliges amerikanisches Datumsformat verwendet haben. Womit die Dateien lexikografisch nach Dateinamen geordnet eben nicht gleich auch zeitlich richtig geordnet sind. Ein standardisiertes Datums/Zeitformat gibt es nicht damit es hübsch aussieht, sondern weil das sinnvolle, praktische Eigenschaften hat.
Das die Hauptaufgabe die Auswertung ist und die Erfassung nur ein Nebenschauplatz geht nicht wirklich, denn das würde ja bedeuten, dass es egal ist ob die der Auswertung zugrunde liegenden Daten auch richtig und ordentlich erfasst wurden. Und das ist in gewisser weise auch gewichtiger als die Auswertung, denn wenn man merkt man hat bei der Auswertung einen Fehler gemacht, dann kann man die einfach korrigieren und noch mal auf die aufgezeichneten Daten loslassen. Wenn man aber bei der Erfassung Fehler gemacht hat, kann man die Messungen gegebenenfalls nicht so einfach noch mal machen, wenn sich die zu messenden Ereignisse nicht wiederholen lassen.
Re: Ubuntu ändert USB Device während einer Messung!
Verfasst: Freitag 10. April 2020, 09:19
von Delto_7970
Habe mich vertippt, natürlich gilt der Dank für den überarbeiteten Code Sirius3. Sorry for that!
Mir ist durchaus bewusst, dass die richtige Datumsformatierung Sinn macht und nicht nur dazu dient um "hübsch auszusehen". Aber mein HAUPTPROBLEM war, dass die Aufzeichnung während einer Messung stoppte und ich deswegen keine Daten zur Auswertung hatte. Deshalb meine Intention zuerst das Hauptproblem zu lösen und anschließend kann man sich über kleinere Probleme Gedanken machen. Und da ist in meinem spezifischen Fall relativ egal wie ich meine Zeitstempel formatiere, da ich alles in ein Textfile schreibe. Die Benennung dieses Textfiles mit dem richtigen Format dagegen wäre sinnvoller (was ich ohnehin mache).
Was ja im Endeffekt genau der Punkt ist den du angesprochen hast, die Erfassung der Daten ist einmal der Grundstein. Da gebe ich dir auch völlig Recht und ich habe auch nie behauptet, dass die Erfassung unwichtig sei. Ganz im Gegenteil, aber ich sagte MEINE HAUPTAUFGABE ist die Auswertung. Das hat nichts damit zu tun wie viel Gewicht die einzelnen Aufgaben in der Realität haben.
Und damit wären wir wieder am Anfang: Ich wollte meinen Code soweit verbessern, dass ich eine stabile Datenerfassung bekomme um eine ordentliche Auswertung zu schrieben (also im Endeffekt genau was du beschrieben hast:"Wenn man aber bei der Erfassung Fehler gemacht hat, kann man die Messungen gegebenenfalls nicht so einfach noch mal machen!")
Und eine Datumsformatierung trägt halt nichts zur Stabilität des Programms bei, dass wollte ich damit sagen. Ich hoffe ich konnte jetzt alle Missverständnisse klären.
Nichts desto trotz bin ich sehr dankbar, dass ich in diesem Forum die Möglichkeit habe Fragen zu stellen und auch sehr hilfreiche Antworten bekomme.
LG Flo