mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik RPi mit Python: Daten von serieller Verbindung verarbeiten


Autor: Timo S. (ti_mo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey, ich habe folgendes Problem:
Ich habe einen Arduino mit einem Raspberry Pi seriell (USB) verbunden.
Der Arduino soll dem RPi unterschiedliche Strings schicken und ein
Python-Programm dann auf diese Strings in einem GUI reagieren:
Ich habe eine kleine Tabelle programmiert, bei der sich dann jeweils die
Zustände von "full" zu "empty" oder umgekehrt ändern sollen.

Leider ändern sich die Zustände aber nicht, sie bleiben leer (""), wie
am Anfang definiert.
print num
gibt die vom Arduino gesendete Nummer richtig aus, die Strings werden
also empfangen.

Die beiden Funktionen müssen parallel laufen, da ich dem UI später noch
andere Aufgaben zuteilen will und dieses Fenster andere Fenster aufrufen
soll, und sich selbst schließen wird.


Ich würde mich freuen, wenn mir jmd. helfen könnte :)
Bin ein ziemlicher Anfänger im programmieren, ich hoffe ihr verzeiht mir
"dumme" Fehler :D

LG

PROGRAMMCODE:
from thread import start_new_thread
import threading
import time
import serial
from Tkinter import *
LR1 = ""
LR2 = ""
LR3 = ""

def detect():
    global LR1
    global LR2
    global LR3
    x = 0
    ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=None)
    num = ser.readline()
    
    while (x == 0):
        global LR1
        global LR2
        global LR3
        num = ser.readline()

        if (len(num)>0):
            print num
            if (num=="110"):
                LR1="empty"
            elif (num=="111"):
                LR1="full"
            elif (num=="120"):
                LR2="empty"
            elif (num=="121"):
                LR2="full"
            elif (num=="130"):
                LR3="empty"
            elif (num=="131"):
                LR3="full"


            print (LR1, LR2, LR3)
            
            time.sleep(0.05)
        
        


def Fenster():
    global LR1
    global LR2
    global LR3
    global master
    master = Tk()
    master.title("window")

    Label(master, text= "LR1", height=10, width=10).grid(row=0, column=0)
    Label(master, text= LR1, height=10, width=10).grid(row=0, column=1)
    Label(master, text= "LR2", height=10, width=10).grid(row=1, column=0)
    Label(master, text= LR2, height=10, width=10).grid(row=1, column=1)
    Label(master, text= "LR3", height=10, width=10).grid(row=2, column=0)
    Label(master, text= LR3, height=10, width=10).grid(row=2, column=1)

    master.mainloop()

ffenster = threading.Thread(target=Fenster)
fdetect = threading.Thread(target=detect)

ffenster.start()
fdetect.start()

Autor: bingo (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
num ist ein String, sind da evtl vorher und/oder nacher Leerzeichen oder 
nicht darstellbare Zeichen dran ?

wieso wird LR1..3 2x als global definiert ?

wieso liest Du ser ausserhalb der Schleife ein ?

while (x==0):    kannst Du kürzen:    while 1:    und x weglassen

Autor: Joachim S. (oyo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bingo schrieb:
> num ist ein String, sind da evtl vorher und/oder nacher Leerzeichen oder
> nicht darstellbare Zeichen dran ?

Ohne mir den Code genauer anzuschauen: Genau das wird mit hoher 
Sicherheit tatsächlich das (oder zumindest: ein) Problem sein.
Ändere den Code einfach mal in:
num = ser.readline().strip()

Autor: bingo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich tippe mal auf ein LineFeed (0x0A) o.ä.

Autor: bingo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Joachim S. schrieb:
> num = ser.readline().strip()

oder
num = ser.readline().splitlines()

Autor: bingo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bingo schrieb:
> Joachim S. schrieb:
>> num = ser.readline().strip()
>
> oder
>  num = ser.readline().splitlines()

falsch, es muss heissen
num = ser.read().splitlines()

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.