Forum: Mikrocontroller und Digitale Elektronik Python Uart einlesen und ausgeben


von Darth V. (darth-vader)


Lesenswert?

Hallo Leute,
arbeite derzeit an einem Projekt für die Schule und habe leider ein 
kleines Problem.
Ich schicke mir eine Binäre Zahl z.B 1001 0011 auf den RPI und lese 
diese Zahl aus. Wie kann ich die Zahl dann so auslesen dass jede Zahl 
davon ein Wert ist.

Beispiel 0001 0011 -> Sensor 1,2 & 5 geben ein Signal

if "Uart auslesen"(0000 0001):
    LED1 leuchtet

if "Uart auslesen"(0000 0010):
    LED2 leuchtet
usw...

jetzt sollten beide LEDs blinken,das geht ja nicht weil ich ansonsten 
alle Möglicheiten aufschreiben müsste.(bin bei 128 eingelesenen Ports)
Gibt es hier eine einfache Funktion um das umgehen dass die LEDs immer 
blinken wenn eine 1 steht?


SG Darth-Vader

von Gerald K. (geku)



Lesenswert?

Ich würde mir **PIGPIO serial** ansehen:

https://abyz.me.uk/rpi/pigpio/python.html

falls es dir um die UART Behandlung geht.

Um was es dir bei der Decodierung geht solltest du verständlicher 
beschreiben.

: Bearbeitet durch User
von Timo N. (tnn85)


Lesenswert?

Ich glaub ich versuch dein Problem mal umzuschreiben, weil man es sonst 
nicht versteht:

Du meinst wenn z.b. die Bitfolge 0000 0011 übertragen wird, brauchst du 
dafür eine extra if-Abfrage, die dann LED1 und LED2 einschalten würde. 
Somit bräuchtest du 2^8 if-Abfragen was natürlich Quatsch ist.
Du willst aber dafür keine extra if-Abfrage jeden Fall, dass mehrere 
LEDs gleichzeitig angesteuert werden sollen. Du willst nur für jede der 
7-8? LEDs eine einzige if-Abfrage.

Das geht über https://www.mikrocontroller.net/articles/Bitmanipulation

Im Grunde musst du die Eingangsbitfolge 0000 0011 mit z.b. 0000 0001 für 
LED1 und mit 000 0010 für LED2 logisch verknüpfen (logisches AND bzw. 
UND).

Das heißt bei 0000 0011 & 0000 0001  kommt 0000 0001  raus.
Bei 0000 0010 & 0000 0001  kommt 0000 0000 raus.


Auf das überprüfst du in deiner if-Abfrage. Immer wenn dieser Wert 
rauskommt, so wird bei jeder Eingangsbitfolge LED1 eingeschaltet, wenn 
das Bit an der Stelle 1 = 1 ist. Auf 0 überprüfen ist bisschen 
komplizierter, geht aber auch und steht auch in dem Artikel. Das 
brauchst du aber nicht, da du mit "else" ja dann immer die LED 
ausschalten kannst, wenn die obere Abfrage nicht zutrifft.



Eventuell habe ich

von Darth V. (darth-vader)


Lesenswert?

>
> Das heißt bei 0000 0011 & 0000 0001  kommt 0000 0001  raus.
> Bei 0000 0010 & 0000 0001  kommt 0000 0000 raus.
>

Zuerst Danke für deine Antwort, also das Problem hast du richtig erkannt 
dass ich nicht alle If Abfragen schreibe... nur ist es möglich die If 
Abfrage so zu kürzen dass bei
1111 1111 alle 8 LEDs ZUSAMMEN leuchten?
oder funktioniert das nur einzeln?

von N. M. (mani)


Lesenswert?

Entweder ich habe was überlesen, oder ich sehe nirgends wie der Frame 
aufgebaut ist.

Ist das ASCII oder sind das Bytes?

von Gerald K. (geku)


Lesenswert?

Warum nicht alle 8 LEDs mit einer Adresse ansteuern?
1
LED 1 = P0
2
LED 2 = P1
3
LED 3 = P2
4
.....
5
LED 8 = P7

Dann bräuchte man das empfangene Byte nur auf das Port schreiben.

von Darth V. (darth-vader)


Lesenswert?

> Warum nicht alle 8 LEDs mit einer Adresse ansteuern?

leider zu Lange, wir haben 128 Leds und 128 Ports zum auslesen und 
ausgeben,
die Ports werden mittels Expander auf einen µC geschickt und an meinem 
RPI weitergegeben.
Ich sollte jetzt den Binären Wert auslesen (Bsp.0000 1101) und will 
somit nur die LEDs leuchten lassen auf denen die Sensoren 1 geben. Jede 
einzelner Fall als IF Abfragen zu schreiben ist einfach Quatsch. Darum 
will ich es anders versuchen.

von Absurd (Gast)


Lesenswert?

For Schleife?

von Dieter D. (dieter_dosenkohl)


Lesenswert?

Darth V. schrieb:
>> Warum nicht alle 8 LEDs mit einer Adresse ansteuern?
>
> leider zu Lange, wir haben 128 Leds und 128 Ports zum auslesen und
> ausgeben,
> die Ports werden mittels Expander auf einen µC geschickt und an meinem
> RPI weitergegeben.
> Ich sollte jetzt den Binären Wert auslesen (Bsp.0000 1101) und will
> somit nur die LEDs leuchten lassen auf denen die Sensoren 1 geben. Jede
> einzelner Fall als IF Abfragen zu schreiben ist einfach Quatsch. Darum
> will ich es anders versuchen.

Das Vorgeschlagene ist ja keine IF Abfrage mehr sondern eine Zuordnung 
als Adresse und soweit ich weiß die schnellste u gängige Variante. 
Alternative wäre noch eine FOR Schleife. Besser lesbar aber 
wahrscheinlich langsamer.

von Darth V. (darth-vader)


Lesenswert?

> Das Vorgeschlagene ist ja keine IF Abfrage mehr sondern eine Zuordnung
> als Adresse und soweit ich weiß die schnellste u gängige Variante.
> Alternative wäre noch eine FOR Schleife. Besser lesbar aber
> wahrscheinlich langsamer.

Es gibt ja mehrere Möglichkeiten.

Und wie willst du das mit einer FOR Schleife lösen

von Sebastian (Gast)


Lesenswert?

Darth V. schrieb:
> Und wie willst du das mit einer FOR Schleife lösen

Ich rekapituliere mal. Du hast eine Kette von 128 Bit, und möchtest für 
jede Bitstelle, die 1 ist, eine Funktion aufrufen die als Parameter den 
Index der Bitstelle übergeben bekommt, ohne 128 IF-Abfragen schreiben zu 
müssen?

Wenn die Bitkette in 16 Bytes a 8 Bit gespeichert ist, dann würde ich 
zwei FOR-Schleifen verwenden. Die äussere würde die Bytes aufzählen, und 
die innere würde ein Bit von Stelle zu Stelle schieben und mit dem Byte 
der Bitkette verunden (&-Operator). Den Index der aktuellen Bitstelle 
führst du entweder mit oder berechnest ihn aus den zwei Laufvariablen.

LG, Sebastian

von Timo N. (tnn85)


Lesenswert?

Nein, ich glaub er TO sollte mal ne Zeichnung von seinem Aufbau machen 
und genauer beschreiben was er will.
Ich verstehe jetzt z.b. nicht ob er Port-Expander für die Eingänge 
(Sensoren?) hat oder für die LED. Wie viele LEDs sind es denn und wie 
viele Sensoren?
Wo kommt denn nun das UART und der Bitstream ins Spiel.


So wie ich es oben beschrieben habe kann er bei 8 LEDs mit 8 if-Abfragen 
bei jedem Wert von einem 8Bit-Wert jede Möglichkeit an LEDs 
an/ausschalten. Auch gleichzeitig. D.h. bei 0000 0001 wird nur LED1 
eingeschaltet und bei 0100 0001 LED 1 und LED 7.

von HildeK (Gast)


Lesenswert?

Gerald K. schrieb:
> Warum nicht alle 8 LEDs mit einer Adresse ansteuern?
> LED 1 = P0
> LED 2 = P1
> LED 3 = P2
> .....
> LED 8 = P7
>
> Dann bräuchte man das empfangene Byte nur auf das Port schreiben.

War genau auch mein erster Gedanke.
Das Byte mit den Sensordaten auf den LED-Port schreiben, nach der halben 
Blinkperiode 0x00 auf den Port schreiben und nach wieder ein halben 
Periode erneut die Sensordaten. Kaum Aufwand, nur sollten die LEDs 
idealerweise am selben Port hängen.
Man muss gar nichts abfragen. Nicht mal ein 'if', ob die Ein- oder 
Ausschaltphase dran ist - einfach verUNDen mit eine volatile Maske, die 
zwischen 0 und 0xFF in der Timer-ISR gewechselt wird.

Ob das so einfach in Python geht, weiß ich nicht. In C sind es ein paar 
Zeilen:
1
   volatile uint8_t maske;
2
3
   // an PORTC sind die LEDs; Aufruf in der Endlosschleife der main()
4
   PORTC = datenbyte & maske;
5
   .
6
   .
7
8
   // und in der Timer-ISR für die Blinkfrequenz steht 
9
      maske ^= 0xFF;

von Sascha W. (sascha-w)


Lesenswert?

HildeK schrieb:
> Gerald K. schrieb:
>> Warum nicht alle 8 LEDs mit einer Adresse ansteuern?
>> LED 1 = P0
>> LED 2 = P1
>> LED 3 = P2
>> .....
>> LED 8 = P7
>>
>> Dann bräuchte man das empfangene Byte nur auf das Port schreiben.
>
> War genau auch mein erster Gedanke.
> Das Byte mit den Sensordaten auf den LED-Port schreiben, nach der halben
> Blinkperiode 0x00 auf den Port schreiben und nach wieder ein halben
> Periode erneut die Sensordaten. Kaum Aufwand, nur sollten die LEDs
> idealerweise am selben Port hängen.
> Man muss gar nichts abfragen. Nicht mal ein 'if', ob die Ein- oder
> Ausschaltphase dran ist - einfach verUNDen mit eine volatile Maske, die
> zwischen 0 und 0xFF in der Timer-ISR gewechselt wird.
>
> Ob das so einfach in Python geht, weiß ich nicht. In C sind es ein paar
die Frage stellt sich eher nicht denn der TO schreibt ja das das auf 
einem RPi läuft.

Sascha

von Noch ein Kommentar (Gast)


Lesenswert?

> Ich würde mir PIGPIO serial ansehen

Wozu? Auf einem Raspi mit Linux sollte Uart doch ein ganz normales 
Device sein, das du als Datei lesen kannst. Musst dich "nur" mit den 
stty Parametern rumärgern.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.