String mit Readline einlesen- klappt nicht so richtig

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

    ich versuche Daten über die serielle Schnittstelle einzulesen, aber so richtg klappt das noch nicht.

    Ohne Timeout funktioniert es gar nicht und mit Timeout werden Daten verschluckt, die kurz hintereinander gesendet werden. Sende ich die Strings mit einer Pause, dann werden sie korrekt gelesen.
    Gibt es da eine bessere Möglichkeit? Die Daten werden normalerweise von einem ATmega mit Bascom gesendet, empfangen habe ich sie mit Visual Basic.

    Was noch eigenartig ist, scheinbar sendet der RPi automatisch ein Echo, das ist aber total entstellt.

    Gruß Reinhard

  • String mit Readline einlesen- klappt nicht so richtig? Schau mal ob du hier fündig wirst!

    • Offizieller Beitrag

    Ich lese auch serielle Daten von meinen Arduino aus und habe keine Probleme mit verschwunden Werten.

    Code
    ser = serial.Serial("/dev/ttyAMA0", 9600)
    While True:
        print ser.readline().strip()

    das strip() entfernt die newLine zeichen und etwaige Whitespaces links und rechts vom String. auf dem Pi sieht es doch aber gut aus :denker: oder hab ich Tomaten auf den Augen?

    Wie sieht dein Sende-Code dazu aus?

  • Hallo dbv,

    Zitat

    auf dem Pi sieht es doch aber gut aus oder hab ich Tomaten auf den Augen?


    Ja, wenn die Zeile "ser.timeout = 1" mit drin ist, ohne funktioniert es garnicht und mit wurden Daten verschluckt, die kurz hintereinander gesendet wurden.
    Habe inzwischen mitbekommen, das man auch kleinere Werte als 1 einsetzen kann, dann passiert das nicht mehr.
    Was mich noch stört ist, das die Prozessorlast bei 100% ist, wenn das Programm läuft.

    Zitat

    Wie sieht dein Sende-Code dazu aus?

    Zur Zeit sende ich einfach mit einem Terminal von Windows aus.

    • Offizieller Beitrag
    Zitat von http://pyserial.sourceforge.net/shortintro.html

    ...Do specify a timeout when opening the serial port otherwise it could block forever if no newline character is received.

    Du sendest anscheinend kein Zeilenende. Somit wartet readline() (was ja bis zum Zeilenende liest) natürlich ewig und bereitet dir graue Haare ;).Mach mal bitte testweise den Haken bei CR=CR+LF oder weiter oben bei CR=LF.

    Edit: quelle vergessen

  • Zitat

    Du sendest anscheinend kein Zeilenende. Somit wartet readline() (was ja bis zum Zeilenende liest) natürlich ewig und bereitet dir graue Haare Icon_wink.Mach mal bitte testweise den Haken bei CR=CR+LF oder weiter oben bei CR=LF.

    Tausend Dank, das war es! Jetzt funktioniert es so wie es sollte, auch ohne Timeout.:bravo2:
    Hast du noch eine Idee, wie ich die Prozessorauslastung senken könnte?
    Wahrscheinlich wäre es das Beste, den Empfang der Daten in einem separaten Thread laufen zu lassen, aber damit muß ich mich erst mal beschäftigen.

    Gruß Reinhard

    Hallo,

    Zitat

    Hast du noch eine Idee, wie ich die Prozessorauslastung senken könnte?

    Habe jetzt time.sleep(0.1) eingefügt und alles ist gut.

    Vielen Dank nochmal und allen einen schönen Feiertag!

    Einmal editiert, zuletzt von ReinhardT (1. Mai 2014 um 00:40)

Jetzt mitmachen!

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