Increment eines Funktionsparameters?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
pauledd
User
Beiträge: 5
Registriert: Freitag 29. Juni 2018, 07:52

Hi

Ich würde gerne wissen wie / ob ich eine Variable als Parameter einer Funktion übergeben kann die
in einer for -Schleife erhöht wird. Ich habe folgende Funktion definiert (Teil des PyUsb) die mir Befehle
an ein USB Gerät schickt:

Code: Alles auswählen

def send_msg(bmRequestType, bRequest, wValue=0, wIndex=0, data_or_wLength=None, timeout=None):
 assert (dev.ctrl_transfer(bmRequestType, bRequest, wValue, wIndex, data_or_wLength, timeout) == len(data_or_wLength))
Normalerweise wird die Funktion dann so aufgerufen:

Code: Alles auswählen

send_msg(0x41, 0x3E, 0, 0,'\x08\x00')
Ich möchte nun aber den letzten Parameter in einer for-Schleife so erhöhen das er die erste Hex Zahl von 0 auf 255 heröht:

Code: Alles auswählen

'\x00\x00'
'\x01\x00'
'\x02\x00'
...
'\xFF\x00'
Dafür habe ich diesen Code geschrieben der an sich auch die Variable hochzählt:

Code: Alles auswählen

for i in range(0, 256):
	z = r'\x'+ str('{0:02x}'.format(i)) + r'\x00'
	send_msg(0x41, 0x3E, 0, 0,z)
Das Problem ist nun aber das ich praktisch nur Fehler von PyUSB zurück bekomme. Vermutlich wird der String/Variable z nicht richtig interpretiert, denn zumindest bei send_msg(0x41, 0x3E, 0, 0,'\x08\x00') sollte ich keine Fehlermeldung zurückkommen da der Befehl ohne Variable funktioniert...

Hat jemand eine Idee was ich falsch mache oder ist das ganze nicht möglich?
Hintergrund der Sache ist, das ich das Gerät auf unbekannte Befehle testen möchte. '\x08\x00' ist ein Befehl der funktioniert und bekannt ist. Da ich nicht händisch 256 Befehl durchprobieren will die Schleife...
Benutzeravatar
__blackjack__
User
Beiträge: 13007
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@pauledd: Du verwechselst da die Darstellung einer Zeichenkette mit dem tatsächlichen Inhalt. Du willst zwei Bytes senden, fängst Dein `z` aber schon mit r'\x' an, was bereits zwei Bytes sind, nämlich der ASCII-Wert für den '\' und der ASCII-Wert für das 'x'. Und dann geht es weiter bei Dir mit zwei Bytes die die ASCII-Zeichen der Hexadezimaldarstellung des Bytewertes von `i` enthalten. Und dann hängst Du da noch mal vier Bytes dran. Also insgesamt sendest Du acht Bytes statt zwei.

Du suchst die `chr()`-Funktion.

Code: Alles auswählen

In [1]: len(r'\x')
Out[1]: 2

In [2]: len(r'\x08\x00')
Out[2]: 8

In [3]: len('\x08\x00')
Out[3]: 2

In [4]: chr(8) + '\x00'
Out[4]: '\x08\x00'

In [5]: len(chr(8) + '\x00')
Out[5]: 2
Edit: Du verwendest ``assert`` übrigens falsch. Der Ausdruck der danach kommt darf nicht wichtig für das funktionieren des Programms sein, denn das ``assert`` ausgeführt, bzw. sogar vom Compiler übersetzt wird, ist nicht garantiert.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

Je nach dem, was die Werte bedeuten, könnte aber auch ein 16bit-Wert korrekter sein:

Code: Alles auswählen

struct.pack('<h', 8)
pauledd
User
Beiträge: 5
Registriert: Freitag 29. Juni 2018, 07:52

Ich danke euch, chr() hat geholfen. Mir war nicht klar das der Parameter tatsächlich zwei Byte erwartet und hab fröhlich Strings verschossen :roll:

Ja das mit der dem assert... Ich habe den Teil nur aus einem Script kopiert das schon von hunderten anderen verwendet
wurde, ohne Fehler, also hab ich mir darüber keine weiteren Gedanken gemacht...
Benutzeravatar
__blackjack__
User
Beiträge: 13007
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Kommentar aus dem Quelltext:

Code: Alles auswählen

# This is not a finished product and you can use it if you like. Don't be
# surprised if there are bugs as I am NOT a programmer..... ;>))
Das nicht garantiertes Verhalten nicht garantiert zu einem Fehler führt, heisst ja nicht das es kein Fehler wäre. Das Skript sieht insgesamt nicht gut aus. ``global`` ist in der Regel schon ein Warnzeichen wenn Leute, die selbst sagen sie sind keine Programmierer, das verwenden.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten