Hallo
Mit meinem Raspberry Pi versuche ich mein funkgeräte Yaesu ft-857D zu steuern. Dazu nutze ich QT und Python.
mein aktuelles problem ist das schreiben der frequenz. In der GUI ist ein edit text feld mit der ich die Frequenz einlese, diese wird als integer umgewandelt. nun muss sie in das format 0x**,0x** geschrieben werden. hier ein kleines beispiele: 144.300MHz zu 0x14, 0x43, 0x00, 0x00, dieses ist keine umwandlung in hexadezimal. Wie mache ich diese umwandlung?
gruss
F4hcr
funkgerät remote cotrol
@F4HCR: brauchst Du die Zahl als Bytes oder als eine 32bit-Zahl?
Code: Alles auswählen
frequency_mhz = 144.300
frequency = int('%.0f' % (frequency_mhz*100000), 16)
hallo
leider klapt das so nicht
zum sendender frequenz 50.110 MHz gebe ich diesen code ein
dabei sind die ersten 4 data die frequenz und der 5 das kommando die frequenz zu schreiben.
Nun soll diese aber nich fest einprogrammiert werden sondern aus einem text feld eingelesen werden.
danke für die hilfe
leider klapt das so nicht
zum sendender frequenz 50.110 MHz gebe ich diesen code ein
dabei sind die ersten 4 data die frequenz und der 5 das kommando die frequenz zu schreiben.
Code: Alles auswählen
data = struct.pack('BBBBB', 0x05, 0x01, 0x10, 0x00, 0x01)
ser.write(data)
danke für die hilfe
@F4HCR: Doch das klappt, Du musst die Zahl dann nur wieder entsprechend in einen Bytestring packen:
Code: Alles auswählen
In [19]: struct.pack('>IB', int(str(int(50.110 * 100000)), 16), 1)
Out[19]: '\x05\x01\x10\x00\x01'
In [20]: struct.pack('>IB', int(str(int(144.3 * 100000)), 16), 1)
Out[20]: '\x14C\x00\x00\x01'
hat einer eine idee wie man ein Bytestring unpackte?
c='P\x11\x00\x00'.
das funktioniert leider nicht.
danke
f4hcr
Code: Alles auswählen
m=struct.unpack('>I',c)[0]
das funktioniert leider nicht.
danke
f4hcr
@F4HCR: Also bei mir funktioniert das wunderbar:
Was passiert bei Dir stattdessen? Und was hättest Du erwartet?
Code: Alles auswählen
In [49]: struct.unpack('>I', 'P\x11\x00\x00')[0]
Out[49]: 1343291392
@F4HCR: Du erwartest das Falsche:
Code: Alles auswählen
>>> hex(struct.unpack('>I', 'P\x11\x00\x00')[0])
'0x50110000'
es gibt doch sicher eine moeglichkeit aus dem ungepackten 'P\x11\x00\x00' ein 50110000 zu erhalten,ohne die 0x vorweg. das ist die ausgelesene frequenz die ich anzeigen möchte. es ist eigentlich das gegenteil vom gepackten, oben die erste frage
yv73
F4hcr
yv73
F4hcr
@F4HCR: Zeichenkettenformatierung kennt einen Formatcode für Hexdarstellung von ganzen Zahlen, ohne das '0x' am Anfang.
danke Blackjack
das ist meine lösung mit umwandlung in MHz
vy73
F4hcr
Code: Alles auswählen
m=hex(struct.unpack('!I',c)[0])
o=(m)[2:]
p=float(o)/10**5
vy73
F4hcr
@F4HCR: und das wäre meine Lösung:
Wie BlackJack schon geschrieben hat, gibt es einen Formatcode, der Hexdarstellung beherrscht, ohne dass man nachträglich ein `0x´ wegschneiden muß. Deine Variablennamen sind zu kurz und die Klammern um m sind unnötig.
Code: Alles auswählen
frequency = int('%x' % struct.unpack('>I', 'P\x11\x00\x00')) * 1e-5
vielen dank Sirius3 dein ansatz ist auch sehr interessant ich bin noch anfanger bei python oder in der programmierung. wenn ich funktionen ausprobier schreibe ich kleine programme damit ich das ausprobieren kann, wenn ich dann das richtige programm schreibe schreibe ich dann auch andere variable namen. deinen code werde ich zuhause ausprobieren einer kleinen Aenderung
vielen dank
F4hcr
Code: Alles auswählen
frequency = float('%x' % struct.unpack('>I', 'P\x11\x00\x00')) / 1e-5
F4hcr
@F4HCR: `int()` ist an der Stelle aber passender, denn es handelt sich ja prinzipiell um eine ganze Zahl. Dadurch das die 1e-5 eine Fliesskommazahl ist, funktioniert das auch unter Python 2 problemlos mit `int()`, ohne das man `division` aus dem `__future__`-Modul importieren muss.
Edit: Du übst also an keinen Programmen, nur das wichtigste: gute Namen, lässt Du beim üben weg?
Edit: Du übst also an keinen Programmen, nur das wichtigste: gute Namen, lässt Du beim üben weg?