Checksumme für LED-Panel errechnen

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
rbaert
User
Beiträge: 11
Registriert: Mittwoch 5. September 2018, 15:37

Mittwoch 5. September 2018, 16:09

Guten Tag

Ich mache gerade meine ersten Erfahrungen mit Python, daher liegt mein Problem, von dem ich mir hier Hilfe erhoffe, sicher beim Anwender (also mir).

Ich habe den Auftrag bekommen ein kleines Programm zu schreiben, mit dem ein LED-Panel gesteuert werden kann. Weil dies später auf einem Raspberry Pi laufen soll, habe ich mich für Python als Programmiersprache entschieden (nur zur Info). Soweit so gut, alles was ich wollte konnte ich bisher auch verwirklichen.

Nun zu meinem Problem:
Diesem LED-Panel muss ich einen String zusenden, den ich im Code errechnen muss. Wenn ich Google und die Anleitung richtig verstehe, handelt es sich um den "absolute Value", also den vergleich aller Zeichen mit der Funktion: "Binäres exklusives Oder"...

Ich zitiere hier Kurz die Anleitung des LED-Panels:
Checksum is 2 ASCII characters of one byte, which obtained by Xoring characters code of Data packet.
For Example:
Data Packet is '<L1><PA><FE><MA><WC><FE>welcome'
How to get checksum 0E?
Byte xorValue = 0
int len;
char *p = '<L1><PA><FE><MA><WC><FE>welcome';
len = strlen(p);
for (int i=0; i<len;i++)
xorValue ^= *p++
Result is xorValue = 0x0E
Ich habe dies nun versucht, in Python abzubilden, natürlich mit einem "echten" String, den ich dann auch senden werde. Der meiner Meinung nach erfolgsversprechenste sieht folgendermassen aus:

Code: Alles auswählen

   a = "<L1><PA><F41><M42><W41><F41><A41><CA>Hallo zusammen, es funktioniert"
    for i in range(0, len(a)):
        b = operator.abs(int((bin(ord(a[i])))[2:])
    print(b)

Leider kriege ich bei all meinen Versuchen (und dass sind inzwischen einige, ich sitze seit 3.5h an diesem Problem), werden Fehler ausgegeben. Beim oben stehenden Ansatz, ist der Fehler ein "SyntaxError" bei print(b)...ich hatte aber bereits alle möglichen Fehler, meistens hatten die irgend eine Convertierungs-Ursache.

Ich habe auch bereits versucht, die Binär-Werte mit dem Operator ^ in einer Schlaufe zu vergleichen. Leider auch ohne Erfolg.

Wer kann mir dabei bitte helfen. Was mache ich falsch?

Danke schon mal für die Hilfe.
Gruss Roland
Benutzeravatar
__blackjack__
User
Beiträge: 1423
Registriert: Samstag 2. Juni 2018, 10:21

Mittwoch 5. September 2018, 16:47

@rbaert: Der ^-Operator vergleicht nichts der rechnet einen Wert aus den beiden Operanden aus. Und Du solltest mit dem Beispiel aus der Dokumentation testen, denn da weisst Du ja bereits wie das Ergebnis aussehen muss.

Iterieren über einen Indexwert der dann nur für den Zugriff auf Sequenzen verwendet wird, ist in Python ein „anti-pattern“. Man kann *direkt* über die Werte iterieren, ohne den Umweg über einen Index.

Beim vorliegenden Problem braucht man aber gar keine Schleife zu schreiben, weil man das ausrechnen der Prüfsumme mit zwei Bausteinen aus der Standardbibliothek lösen kann:

Code: Alles auswählen

In [17]: from functools import reduce

In [18]: from operator import xor

In [19]: format(reduce(xor, b'<L1><PA><FE><MA><WC><FE>welcome'), '02X')
Out[19]: '0E'

Code: Alles auswählen

    **** COMMODORE 64 BASIC V2 ****
 64K RAM SYSTEM  38911 BASIC BYTES FREE
   CYBERPUNX RETRO REPLAY 64KB - 3.8P
READY.
█
Benutzeravatar
ThomasL
User
Beiträge: 382
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Mittwoch 5. September 2018, 20:01

rbaert hat geschrieben:
Mittwoch 5. September 2018, 16:09

Code: Alles auswählen

        b = operator.abs(int((bin(ord(a[i])))[2:])
Beim oben stehenden Ansatz, ist der Fehler ein "SyntaxError" bei print(b)
Nur falls du es noch nicht selbst entdeckt hast, die Anzahl der "Klammerzu" ist ungleich "Klammerauf"
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
rbaert
User
Beiträge: 11
Registriert: Mittwoch 5. September 2018, 15:37

Freitag 7. September 2018, 10:10

Danke für die schnellen Antworten...

@_blackjack_
Ich werde mir deine Tips gut einprägen und hoffentlich zukünftig auch umsetzen können. Obwohl ich in C# ein wenig Programmiererfahrung habe, bin ich in Python leider noch ein absoluter Anfänger. Wenn ich dir meinen Code zeigen würde, würden dir im Moment wohl die Tränen kommen. Aber irgenwann muss man ja schliesslich anfangen. :roll:

@ThomasL
Ich muss zugeben, nachdem ich 3 Stunden ein Problem nicht lösen konnte, habe ich wohl nur noch Fehler gesehen (anstatt mögliche Lösungen). Danke auch dir für den Hinweis.
Antworten