Serial read until

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hi,

    ich möchte einen String einlesen, bis ein CR im String erscheint...

    ich kenne bei python bis jetzt aber nur das

    Code
    rcv = UART.readline()

    oder das ich eine bestimmte Anzahl von Werten einlese...

    gibt es da noch einen weiteren Befehl?

    MfG

    Rede wenig, rede wahr, trinke mäßig, zahle bar.:angel:

    Einmal editiert, zuletzt von Kornfeld (16. Dezember 2014 um 12:27)

  • 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:

  • danke schon mal für die Antwort!

    der string sieht wie folgt aus:

    Code
    STX + X + X + X + ETX + CR

    ein string dieser Art wird wird in verschiedener Anzahl gesendet...

    wenn dieser

    Code
    STX + 9 + 9 + 9 + ETX + CR

    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..

    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' objects


    was kann das bedeuten?

    Rede wenig, rede wahr, trinke mäßig, zahle bar.:angel:

    Einmal editiert, zuletzt von Kornfeld (16. Dezember 2014 um 14:21)

  • Hm ich glaube da reden wir gerade aneinander vorbei :fies:

    Du hast ja >> hier << einen Tip gekriegt wie du das hier kürzen könntest:

    Code
    STX = chr(2)
    EINS = chr(49)
    
    
    UART.write(STX)
    UART.write(EINS)

    Da wurde dir dann kommentarlos geraten das zu machen:

    Code
    STX = chr(2)
    EINS = chr(49)
    ETX=chr(3)
    EINS_ESCAPED=STX+EINS+ETX

    (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:

    PHP
    EINS = "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 :huh:

    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

    Rede wenig, rede wahr, trinke mäßig, zahle bar.:angel:

    Einmal editiert, zuletzt von Kornfeld (16. Dezember 2014 um 15:00)

  • 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

    Die Fehldermeldung hat doch aber damit gar nichts zu tun. Du versuchst einen String und eine Liste zu verbinden, was nicht geht

    Code
    print("Line: " + line)


    Wenn du wissen willst was bis dahin in der Liste steht musst du über diese iterieren. z.B. so

    Code
    if c == '\r':
        for x in line:
            print  x
  • Moment, ich hol mal eben smilie_glaskugel.gif 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:


  • 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...



    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?!

    Rede wenig, rede wahr, trinke mäßig, zahle bar.:angel:

    Einmal editiert, zuletzt von Kornfeld (16. Dezember 2014 um 16:16)

    • Offizieller Beitrag
    Zitat

    Be 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?

    Rede wenig, rede wahr, trinke mäßig, zahle bar.:angel:

    Einmal editiert, zuletzt von Kornfeld (16. Dezember 2014 um 17:14)

  • 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 Sinn :-/

    Wir 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...

  • 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!

    Rede wenig, rede wahr, trinke mäßig, zahle bar.:angel:

  • ..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...

    Rede wenig, rede wahr, trinke mäßig, zahle bar.:angel:

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!