RPi mit Python: Daten von serieller Verbindung verarbeiten

OP #5264659
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.
1
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:
1
from thread import start_new_thread
2
import threading
3
import time
4
import serial
5
from Tkinter import *
6
LR1 = ""
7
LR2 = ""
8
LR3 = ""
9

10
def detect():
11
    global LR1
12
    global LR2
13
    global LR3
14
    x = 0
15
    ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=None)
16
    num = ser.readline()
17
    
18
    while (x == 0):
19
        global LR1
20
        global LR2
21
        global LR3
22
        num = ser.readline()
23

24
        if (len(num)>0):
25
            print num
26
            if (num=="110"):
27
                LR1="empty"
28
            elif (num=="111"):
29
                LR1="full"
30
            elif (num=="120"):
31
                LR2="empty"
32
            elif (num=="121"):
33
                LR2="full"
34
            elif (num=="130"):
35
                LR3="empty"
36
            elif (num=="131"):
37
                LR3="full"
38

39

40
            print (LR1, LR2, LR3)
41
            
42
            time.sleep(0.05)
43
        
44
        
45

46

47
def Fenster():
48
    global LR1
49
    global LR2
50
    global LR3
51
    global master
52
    master = Tk()
53
    master.title("window")
54

55
    Label(master, text= "LR1", height=10, width=10).grid(row=0, column=0)
56
    Label(master, text= LR1, height=10, width=10).grid(row=0, column=1)
57
    Label(master, text= "LR2", height=10, width=10).grid(row=1, column=0)
58
    Label(master, text= LR2, height=10, width=10).grid(row=1, column=1)
59
    Label(master, text= "LR3", height=10, width=10).grid(row=2, column=0)
60
    Label(master, text= LR3, height=10, width=10).grid(row=2, column=1)
61

62
    master.mainloop()
63

64
ffenster = threading.Thread(target=Fenster)
65
fdetect = threading.Thread(target=detect)
66

67
ffenster.start()
68
fdetect.start()
Gast
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
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:
1
num = ser.readline().strip()

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 8 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.