Raspberry <-> Adruino serielle Kommunitkaion

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
MarcT.
User
Beiträge: 2
Registriert: Freitag 20. November 2020, 19:35

Samstag 21. November 2020, 19:30

Guten Abend zusammen,

Ich bin neu hier und programmiere erst wenige Tage mit Python (wenn man es programmieren nennen darf :D), daher verzeiht mir die Frage. Ich habe eine Gui erstellt, mit der ich mehrere Datenbanken verwalten kann (Einträge hinzufügen, editieren oder löschen). Das klappt soweit auch ganz gut. Jetzt möchte ich über eine Schaltfläche der Gui Daten seriell an den Arduino senden. Das klappt ebenfalls, aber nicht so wie ich das haben will.

Folgendes funktioniert:

Code: Alles auswählen

ser.write(b"10,00,20,00,30,00,40,00,50,00,60,00,70,00,80,00\n")
Zur Erklärung: Jeder Wert zwischen den Kommas lässt eine Led in der vorgegebenen Helligkeit leuchten (0-99%). Mit "\n" erkennt der Arduino das alle Daten empfangen wurden (ohne würde es auch funktionieren, allerdings etwas zeitversetzt). So funktioniert das alles. Jetzt möchte ich allerdings die Datenbank auslesen und dies seriell an den Arduino senden. Ich dachte das ginge wie folgt:

Code: Alles auswählen

inhalt, = cursorLedDB.fetchall()
print(inhalt)
ser.write(inhalt)
ser.write(b"\n")
(Zu einfach gedacht denke :D)

Über Print kommt folgendes heraus:

Code: Alles auswählen

(10, 00, 20, 00, 30, 00, 40, 00, 50, 00, 60, 00, 70, 00, 80, 00)
Die ganz oben genannte Methode ist wahrscheinlich in utf 8 codiert, richtig? Wahrscheinlich liegt da mein Problem...

Für Hilfe wäre ich mega dankbar!!

Gruß,
Marc
Sirius3
User
Beiträge: 13337
Registriert: Sonntag 21. Oktober 2012, 17:20

Samstag 21. November 2020, 20:25

Und was passiert? Gibt es eine Fehlermeldung?
Und wenn ja, dann steht da, was falsch ist.
Bei einer Datenbankabfrage ist jeder Eintrag ein Tuple. Diesen Tuple von Zahlen mußt Du in einen String umwandeln, z.B. mit map und join.
Es ist seltsam, dass Du fetchall verwendest, obwohl es nur ein Ergebniseintrag geben kann. Dafür gibt es fetchone.
Variabelnnamen schreibt man komplett klein. inhalt ist ein sehr generischer Name, versuche aussagekräftige Namen zu verwenden und keine Abkürzungen, ser kann für alles mögliche stehen.
MarcT.
User
Beiträge: 2
Registriert: Freitag 20. November 2020, 19:35

Samstag 21. November 2020, 21:13

Hallo,

Schon mal danke für deine Rückmeldung!
Die Datenbank hat 16 Einträge. „Inhalt“ werde ich noch ersetzen, dass ist nur zum Testen. Wenn ich den Inhalt per fetchall aus der Datenbank ziehe und über Print(Inhalt) ausgebe, erhalte ich zum Beispiel folgendes:

(10, 0, 20, 0, 30, 0, 40, 0, 50, 0, 60, 0, 70, 0, 80, 0)

Daher dachte ich das müsste passen, denn das gleiche sende ich ja seriell (ser.write(Inhalt)).

Danke & Gruß,
Marc

Edit: Fehlermeldung kommt leider keine, es passiert einfach nichts. Beim Arduino sehe ich aber das was empfangen wird (rx led).
Benutzeravatar
sparrow
User
Beiträge: 2373
Registriert: Freitag 17. April 2009, 10:28

Sonntag 22. November 2020, 00:06

Das sind unterschiedliche Arten von Objekten. Was du dort siehst, ist die Darstellung, dass es sich um einen Tuple handelt (dessen Elemente Integer sind).
Ein Tuple ist aber keine Zeichenkette und kein Binary-String (beachte das vorgestellt "b" bei dem binary literal). Die würden sonst in Hochkomma dargestellt werden.

Einmal zum Verständnis aus der interaktiven Session:

Code: Alles auswählen

>>> brightness_values = (10, 0, 20, 0, 30, 0, 40, 0, 50, 0, 60, 0, 70, 0, 80, 0)
>>> print(type(brightness_values))
<class 'tuple'>
>>> print(brightness_values)
(10, 0, 20, 0, 30, 0, 40, 0, 50, 0, 60, 0, 70, 0, 80, 0)
>>> outstream = ",".join([str(value) for value in brightness_values])
>>> print(type(outstream))
<class 'str'>
>>> print(outstream)
10,0,20,0,30,0,40,0,50,0,60,0,70,0,80,0
>>> print(outstream.encode())
b'10,0,20,0,30,0,40,0,50,0,60,0,70,0,80,0'
Antworten