Serial read until
-
Kornfeld -
16. Dezember 2014 um 12:26 -
Erledigt
L
I
V
E
Stammtisch ab 20:30 Uhr im Chat
-
-
Serial read until? Schau mal ob du hier fündig wirst!
-
Du könntest UART.splitlines() versuchen
http://www.tutorialspoint.com/python/string_splitlines.htm
So mache ich das auch in meinem RoPi Projekt. Ich übergeben vom WebIf einen String der mehrere \n enthält und der genannte Befehl teilt diese dann so auf das ich die in einer for-Schleife einzeln abarbeiten kann
Beispiel:
PHP
Alles anzeigenmessage = "forward:10 \n left:20 \n light:on" requestlist = message.splitlines() for request in requestlist: if "forward" in request: print("Vorwaerts!") elif "left" in request: print("Links!") elif "light" in request: print("Licht!") [/php] Ausgabe:[code]root@RoPi:/tmp# python /tmp/t.py Vorwaerts! Links! Licht! root@RoPi:/tmp#
-
danke schon mal für die Antwort!
der string sieht wie folgt aus:
ein string dieser Art wird wird in verschiedener Anzahl gesendet...
wenn dieser
ist kann ich beim nächsten lesen das korrekte Ergebnis erwarten.
also wäre es gut, wenn ich immer bis zum CR einlese dann den string vergleiche und wenn dieser nicht gleich ist mache ich das weiter bis zu diesem punkt...
ich glaube da ist splitline ungeeignet?!
[/code]
hier mal die relevanten Dinge von dem Code den ich jetzt habe..Python
Alles anzeigen#!/usr/bin/env python # -*- coding: utf-8 -*- #! /usr/bin/python from Tkinter import * import serial import time UART = serial.Serial("/dev/ttyAMA0", 4800) #hier wird etwas gesendet worauf geantwortet wird if(not(UART.isOpen())): Aktiv = True UART.open() line = [] while True: for c in UART.read(): line.append(c) if c == '\r': print("Line: " + line) line = [] break if(Aktiv): UART.close
dabei kommt folgender Fehler:
Traceback (most recent call last):
File "koffer.py", line 62, in <module>
print("Line: " + line)
TypeError: cannot concatenate 'str' and 'list' objectswas kann das bedeuten?
-
Hm ich glaube da reden wir gerade aneinander vorbei
Du hast ja >> hier << einen Tip gekriegt wie du das hier kürzen könntest:
Da wurde dir dann kommentarlos geraten das zu machen:
(gäb es dazu ein Kommentar wäre nachfolgendes vermutlich nicht erforderlich dies nun hier zu erklären)
Du machst da also einfach nur einen großen String, du fügst also nur mehrere kleine zusammen.
Beispiel:PHPEINS = "b" ZWEI = "l" DREI = "a" ALL = EINS+ZWEI+DREI print(ALL) [/php] Ausgabe:[code]root@RoPi:~# python /tmp/2.py bla root@RoPi:~#
Ist das wirklich das was du willst
Oder anders gefragt:
Wieso denkst du jetzt das splitlines() ungeeignet wäre?Selbst wenn du genau das möchtest wie am Beispiel zu sehen und ans Ende dann "\n" einfügst - was macht dann splitlines() deiner Meinung nach falsch?
-
also das aus dem anderen Thread ist der Befehl den ich sende... das funktioniert auch und ist in dem geposteten programm durch den Kommentar # hier wird was gesendet abgekürzt
jetzt kommt aber die antwort vom gerät mit der beschriebenen form 5 mal pro s
in diese antwort würde ich gerne immer bis zum CR bzw. '\r' einlesen..
das problem an sich betrifft diesen part -
Ist mir schon klar dass das senden damit funktioniert ... von irgendeinem Kommentar in Deinem Code weiß ich nichts - das bezog sich auf den 'Kommentarlosen Beitrag' von framp
Wie oft der zusammegeklatsche String übermittelt wird weiß ich nicht, ich kenne Dein Programm nicht mal ansatzweise! Deshalb kann ich Dazu eher nichts sagen; ich weiß weder Warum noch Wofür das ganze hier dienen soll!
..aber nunja, wie gesagt - wir reden offensichtlich aneinander vorbei... Von daher geb ichs auf... Vielleicht kann dir das ja jemand anderes verständlicher erklärn.
-
- Offizieller Beitrag
-
Moment, ich hol mal eben ah jetzt seh ich Deinen Code! *cheat* hast deinen Beitrag editiert aber das nicht erwähnt...
So wie ich das sehe ist der Code aber allgemein fehlerhaft. Zum Beispiel prüfst du nirgends ob der Serielle Port überhaupt geöffnet wurde bzw werden konnte, du legst es stattdessen einfach ma eben jüste fest "Aktive = True"
Ohne jetzt groß rum zu erklären, gleichwohl zu wissen das du das auch einfach als Falsch erachten mögest, würd ich das wie folgt machen:
Python
Alles anzeigen#!/usr/bin/python # -*- coding: utf-8 -*- from Tkinter import * import serial import time SerialPort = "/dev/ttyAMA0" SerialBaudrate = 4800 UART = serial.Serial() UART.port = SerialPort UART.baudrate = SerialBaudrate UART.bytesize = serial.EIGHTBITS #number of bits per bytes UART.parity = serial.PARITY_NONE #set parity check: no parity UART.stopbits = serial.STOPBITS_ONE #number of stop bits UART.timeout = 1 #non-block read UART.xonxoff = False #disable software flow control UART.rtscts = False #disable hardware (RTS/CTS) flow control UART.dsrdtr = False #disable hardware (DSR/DTR) flow control UART.writeTimeout = 2 #timeout for write finished = False try: UART.open() except Exception, e: print("Error open UART port: " + str(e)) exit() if UART.isOpen(): try: UART.flushInput() #flush input buffer, discarding all its contents UART.flushOutput() #flush output buffer, aborting current output and discard all that is in buffer while not finished: try: line = UART.readline().strip() if line: print("UART-> "+line), except serial.SerialException as e: print("Could not open UART port '{}': {}".format(SerialPort, e)) except (KeyboardInterrupt, SystemExit): _exit() UART.close() except Exception, e: print("Error...: " + str(e)) except (KeyboardInterrupt, SystemExit): print("Schliesse Programm..") _exit() else: print("Cannot open UART port") def _exit(): global finished finished = True UART.close() exit()
-
der code war da schon die ganze zeit.. aber kein problem! .. hatte mich aber schon gewundert...
ich poste jetzt mal den kompletten Code... mit kommentaren...
bei der variante von dbv läuft er die ganze zeit durch die schleife .. hat aber keinen wert für x obwohl er etwas empfangen müsste...
Python
Alles anzeigen#!/usr/bin/env python # -*- coding: utf-8 -*- #! /usr/bin/python STX = chr(2) ETX = chr(3) NU = chr(48) EI = chr(49) D = chr(68) SI = chr(55) AC = chr(56) F = chr(70) ZW = chr(50) VI = chr(52) SEM = chr(59) NEUN = chr(57) C = chr(67) CR = chr(13) from Tkinter import * import serial import time UART = serial.Serial("/dev/ttyAMA0", 4800) STOP = (STX+NEUN+NEUN+NEUN+ETX) vgl = 'START' Aktiv = False if(not(UART.isOpen())): Aktiv = True UART.open() Stop = (STX+NEUN+NEUN+NEUN+ETX+CR) adult = (STX+ZW+VI+SEM+SEM+D+C+ETX) UART.write(adult) time.sleep(.05) Druck140 = (STX+ZW+EI+SEM+SEM+D+NEUN+ETX) UART.write(Druck140) time.sleep(.05) Start = (STX+NU+EI+SEM+SEM+D+SI+ETX) UART.write(Start) time.sleep(.05) print ('ist vorbei') line = [] while True: for c in UART.read(): line.append(c) if c == '\r': for x in line: print x print("Line: " + x) line = [] break UART.close()
okay.. kommentare vergessen... aber..ich sende vom Pi drei Befehle... die Messung startet...
dann kommt ein Statusstring mit jeweils CR am Ende 5 mal pro s...
den möchte ich empfangen bis er STOP (die Variable im Code) ist...
und wenn das der Fall ist soll er noch einen weiter lesen und den String speichern mit den Messergebnissen..
mal noch eine allgemeine frage CR ist doch ein EOL?!also würde dann der UART.readline funktionieren?!
-
- Offizieller Beitrag
ZitatBe carefully when using readline(). Do specify a timeout when opening the serial port otherwise it could block forever if no newline character is received. Also note that readlines() only works with a timeout. readlines() depends on having a timeout and interprets that as EOF (end of file). It raises an exception if the port is not opened correctly.
Wenn du readline verwendest MUSS bei jedem String der empfangen wird, ein newline Zeichen enthalten sein.
Ansonsten hab ich arge Schwierigkeiten zu verstehen was du dort machst. Ich versteh nicht warum du ein Haufen Ascii Zeichen definierst, warum deine Start/Stop so irre lang und kompliziert sind usw ;). Du wirst dir schon was bei gedacht haben... :). Ich würde zum starten einer Messung "Starte Messung" schreiben und ggf. die notwendigen Parameter mit an den String hängen ("Starte Messung: Para1,Para2). Anschliessend die String entgegennehmen und den zurrecht splitten.
-
die befehle die ich sende kann ich mir nicht aussuchen..
ich habe gelesen das bei readline ein EOL verwendet werden muss... und das CR eines ist?!
ich definiere die Zeichen, weil ich diese über den UART versenden muss.. und wenn die Grundfunktion läuft möchte ich ein kleines Fenster erstellen in dem das Ergebnis angezeigt wird...
ich hatte das mal mit nem arduino zusätzlich laufen da hatte ich ein \n angehangen.. der arduino sollte aber weg bleiben..
meigrafd... bei deinem Programm blicke ich auch nur halb durch.. und wenn ich das starte wartet er nur für irgendwas oder so... das muss ich mir mal in ruhe zu gemüte führen.. nur nicht das du jetzt denkst das ich das eiskalt ignoriere..wo könnte ich denn dabei meine befehle senden?
-
In meinem Code ist zZt nur das empfangen vorgesehen..
Abgesehen von deinem mehr oder weniger unübersichtlichen und unstrukturierten Code, verstehe ich aber immer noch nicht was das ganze überhaupt soll, welcher Teil fürs Senden ist und welcher fürs Empfangen... Denn ich sehe bei dir etwas zu senden und deine Fragestellung betrifft das empfangen - also wieso soll nun mein Code beides können?
Auch verstehe ich nicht wieso du chr() verwendest anstatt das einfach direkt zu übertragen? Hat das irgendeinen besonderen Sinn wieso du aufwendig über chr() " STX24;;DCETX " formst? Wieso trägst du das nicht einfach direkt in adult ein? Das ergibt doch so irgendwie kein SinnWir kennen nur einen kleinen Teil dessen was du machst, wir wissen nicht was bei dem einen Script was du hier gepostet, ankommt. Ebenso wenig wissen wir ob das was gesendet wird bereits von dir "modifiziert" wurde.
Es wäre vielleicht für alle besser wenn du dir ein mal die Mühe machen würdest zu beschreiben welche Hardware du hast, was angeschlossen ist, was du eigentlich vor hast und was du erreichen möchtest...
-
- Offizieller Beitrag
Und bitte erwähne in deiner Beschreibung auch was die Gegenstelle zurücksendet. In einer komplett selbst programmierten Lösung würde ich sicherstellen das ich immer Strings mit newlines sende und empfange. Sonst kriegt man ja die Krise.
-
okay die mühe werde ich mir nachher noch machen!
ja mit dem arduino konnte ich definieren, dass er liest bis '\r' kommt und habe ein '\n' hinzugefügt um readline verwenden zu können... jetzt möchte ich den arduino aber weglassen...
aber wie gesagt der rest kommt nachher detailliert!
-
..nur mal noch so gesagt... nicht das ihr euch ignoriert fühlt oder so... ich habe im Moment noch eine Idee das ganze über eine Liste zu lösen.. das probiere ich aus und wenn das nicht funktioniert komme ich diesbezüglich noch einmal auf euch zurück...
Jetzt mitmachen!
Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!