read serial String

  • Hallo Leute,
    ich komm leider selbst nicht mehr weiter, auch ohne google nicht^^ Ihr seid meine letzte Hoffnung :)

    Ich lese über ein Script den seriellen Port vom Pi aus, dieser ist an einen Arduino gekoppelt...soweit so gut... ich bekomme auch einen Wert zurück nur leider kann ich mit dem nichts anfangen (weiter verarbeiten).

    hier mal der code von der betroffenen Zeilen:

    Antwort:

    pi@srv-www /var/www/Webserver $ sudo python serialArduinoOne.py
    <type 'str'>
    0
    0
    Traceback (most recent call last):
    File "serialArduinoOne.py", line 60, in <module>
    read_serial()
    File "serialArduinoOne.py", line 20, in read_serial
    print tempZustaende[1]
    IndexError: string index out of range

    Jetzt die Frage, warum kann ich aus dem ankommenden String (Zeigt ja Type(tempZustaende) das es sich um einen string handelt) kein einzelnes char auswerten?

    ich kann z.B nicht einfach test = tempZustaende[0] schreiben...Warum?

    Hoffe Ihr könnt mir weiterhelfen und im vorraus schonmal sorry für so eine einfache Frage wahrscheinlich^^

  • Servus,
    ich hab' zwar jetzt von Python keine Ahnung, aber es steht doch alles da:


    ...
    IndexError: string index out of range
    ...


    wenn nur zwei Zeichen da sind, kannst Du nicht auf das dritte und folgende zugreifen ...

    //EDIT: stimmt ... da hat framp recht ... ist ja nur eins ...

    cu,
    -ds-


  • Jetzt die Frage, warum kann ich aus dem ankommenden String (Zeigt ja Type(tempZustaende) das es sich um einen string handelt) kein einzelnes char auswerten?


    Das stimmt nicht ganz :no_sad: . Das erste Zeichen wie auch den gesamten String kannst Du ja ausgeben.

    Dein String ist nur 1 Zeichen lang, denn es steht nur das ASCII Zeichen 0 drin. Alle Versuche auf weiter Zeichen zuzugreifen sind dann natürlich fehlerhaft ;)

  • Ja das verwundert mich sehr, ich habs ja gelesen aber wenn ich nur print tempZustaende eingebe bekomme ich als Antwort 0001110 zurück, also doch mehr als zwei Zeichen...Keine Ahnung...

  • Ja stimmt, die 0001110 ist die Ausgabe wenn ich es ohne print tempZustaende[0]... laufen lasse, dann läuft es ohne Fehler.

    Ich habe die Vermutung das das Format so nicht exakt stimmt was mir da angezeigt (Str) wird, bekommt man wirklich von der read() Funktion einen String zurück? Hab irgendwie was mit Byte im Kopf aber konnte nichts genaueres dazu finden...

  • Ich gehe davon aus dass Dein Code und die Ausgabe zueinander passen. Und da hast Du

    1) print tempZustaende
    2) print tempZustaende[0]

    und beide Male wird '0' ausgegeben. :s

    Bei

    3) print tempZustaende[1]

    kracht es da der String nur ein Zeichen lang ist.

    Wie hast Du genau 0000 1110 als Ausgabe bekommen?

  • wenn ich nur diesen Code ausführe bekomme ich das als Ergebnis

  • Serial liefert Bytestrings. Reine Bytes gibt es in Python nicht, du kannst also auch nicht mit Indizes in die Bits reinreichen, so wie du das probierst. Stattdessen wird ein neuer String von Laenge 1 erzeugt. Und dann gilt fuer ein Zeichen lange Strings natuerlich auch, dass "len(s) == 1 and s == s[0]" - denn damit ist der Index-Zugriff wieder der String selbst. (strenggenommen nicht derselbe, aber der gleiche, weil neu, doch mit gleichem Inhalt).

    Dein sleep ist an der Stelle uebrigens voellig deplaziert. Bestenfalls gehoert das vor das read, oder ganz an das Schleifenkoerperende. Aber eigentlich ist es total ueberfluessig, weil read(1) so lange wartet, bis ein Byte angekommen ist.

  • Ok hört sich plausibel an :D , jetzt fehlt noch nen toller Lösungsansatz? :thumbs1: Das mit dem sleep geht leider nicht anders weil noch ein anderes Script auf den Port zugreift, hatte versucht es weg zu lassen aber dann kann ich nichts mehr zurück senden...

  • Wofuer denn eine Loesung? Du beschreibst doch gar nicht, was du eigentlich tun willst. Sondern machst etwas, das halt nicht geht. Beschreib doch mal, was diese Bytes sollen & wie damit weiter gearbeitet werden soll.

    Und bezueglich des zweiten Skriptes: das geht in die Hose. Die musst du schon in eines ueberfuehren.

  • Ah ok, danke schon mal bis hier her :) Ziel soll es sein, diesen String in ich sag mal 7 Bits auf zu teilen und diese dann einzeln in eine sql zu schreiben, quasi 1/0 Zustand in eine Spalte, insgesamt 7 Spalten also mit 1 oder 0 drinnen...oh man hoffe habs wenigstens halbwegs verständlich erklärt^^ :geek:

  • Das kann so gemacht werden:

    Code
    $ python # interpreter starten
    >>> v = 'A' # das Byte
    >>>[bool(ord(v) & 1 << i) for i in xrange(8)]
    [True, False, False, False, False, False, True, False]
  • Oh gott ok :) werde ich morgen mal probieren, könntest du mir vielleicht noch erklären was da genau passiert? Würde mir ein haufen Zeit ersparen, bin etwas unter Zeitdruck! :daumendreh2:

  • Das ist eine Listcomprehension, eigentlich nur eine simple for-Schleife:

    Code
    ergebnis = []
    for wert in eine_aufzaehlbares_ding:
              ergebnis.append(<ausdruck mit wert>)
    
    
    # ist equivalent zu
    ergebnis = [<ausdruck mit wert> for wert in aufzaehlbares_ding]
  • Ah ok,die kenne ich :thumbs1: nur nicht so in der Darstellung.
    Also bei einmaligem Aufruf (ohne while True) funktioniert es tadellos, allerdings wenn ich die geschichte in einer Endlosschleife laufen lasse kommen unterschiedliche Ergebnisse raus.
    ich habe auch schon vor erneutem Aufruf alle Variablen initialisiert allerdings ohne erfolg :(

    Gibts eine Idee was ich falsch mache? :wallbash:

  • Wieso sollten denn *keine* unterschiedlichen Ergebnisse kommen? Wenn immer dasselbe kommt, brauchst du ja nix einlesen... und ohne Code und mal ein paar Worte dazu, was du da ueberhaupt einliest kann man da auch nix zu sagen. Insbesondere da du ja auch augenscheinlich einen zweiten Prozess auf die Schnittstelle zugreifen laesst. Da ist dann eh Polen offen - ob und was da funktioniert kann man dann nicht mehr sagen. Aber das wiederhole ich hier auch schon zum zweiten mal...

Jetzt mitmachen!

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