Seite 1 von 1

Raspberry <-> Adruino serielle Kommunitkaion

Verfasst: Samstag 21. November 2020, 19:30
von MarcT.
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

Re: Raspberry <-> Adruino serielle Kommunitkaion

Verfasst: Samstag 21. November 2020, 20:25
von Sirius3
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.

Re: Raspberry <-> Adruino serielle Kommunitkaion

Verfasst: Samstag 21. November 2020, 21:13
von MarcT.
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).

Re: Raspberry <-> Adruino serielle Kommunitkaion

Verfasst: Sonntag 22. November 2020, 00:06
von sparrow
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'

Re: Raspberry <-> Adruino serielle Kommunitkaion

Verfasst: Sonntag 6. Dezember 2020, 22:20
von MarcT.
Hallo,

Sorry für die späte Rückmeldung...
sparrow hat geschrieben: 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'
Das hat mir sehr weitergeholfen, es funktioniert :) !!! Besten Dank!!