Seite 1 von 1
funkgerät remote cotrol
Verfasst: Sonntag 1. Mai 2016, 21:00
von F4HCR
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
Re: funkgerät remote cotrol
Verfasst: Sonntag 1. Mai 2016, 21:14
von Sirius3
@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)
Re: funkgerät remote cotrol
Verfasst: Montag 2. Mai 2016, 21:05
von F4HCR
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.
Code: Alles auswählen
data = struct.pack('BBBBB', 0x05, 0x01, 0x10, 0x00, 0x01)
ser.write(data)
Nun soll diese aber nich fest einprogrammiert werden sondern aus einem text feld eingelesen werden.
danke für die hilfe
Re: funkgerät remote cotrol
Verfasst: Montag 2. Mai 2016, 21:25
von BlackJack
@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'
Re: funkgerät remote cotrol
Verfasst: Montag 2. Mai 2016, 22:38
von F4HCR
vielen dank das funktioniert
Re: funkgerät remote cotrol
Verfasst: Sonntag 8. Mai 2016, 21:47
von F4HCR
hat einer eine idee wie man ein Bytestring unpackte?
c='P\x11\x00\x00'.
das funktioniert leider nicht.
danke
f4hcr
Re: funkgerät remote cotrol
Verfasst: Sonntag 8. Mai 2016, 22:18
von BlackJack
@F4HCR: Also bei mir funktioniert das wunderbar:
Code: Alles auswählen
In [49]: struct.unpack('>I', 'P\x11\x00\x00')[0]
Out[49]: 1343291392
Was passiert bei Dir stattdessen? Und was hättest Du erwartet?
Re: funkgerät remote cotrol
Verfasst: Montag 9. Mai 2016, 06:09
von F4HCR
ist richtig das funktionier bei mir auch nur erwarte ich als erbenis 50110000.
Re: funkgerät remote cotrol
Verfasst: Montag 9. Mai 2016, 06:52
von Sirius3
@F4HCR: Du erwartest das Falsche:
Code: Alles auswählen
>>> hex(struct.unpack('>I', 'P\x11\x00\x00')[0])
'0x50110000'
Re: funkgerät remote cotrol
Verfasst: Montag 9. Mai 2016, 23:00
von F4HCR
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
Re: funkgerät remote cotrol
Verfasst: Montag 9. Mai 2016, 23:25
von BlackJack
@F4HCR: Zeichenkettenformatierung kennt einen Formatcode für Hexdarstellung von ganzen Zahlen, ohne das '0x' am Anfang.
Re: funkgerät remote cotrol
Verfasst: Dienstag 10. Mai 2016, 00:09
von F4HCR
danke Blackjack
Code: Alles auswählen
m=hex(struct.unpack('!I',c)[0])
o=(m)[2:]
p=float(o)/10**5
das ist meine lösung mit umwandlung in MHz
vy73
F4hcr
Re: funkgerät remote cotrol
Verfasst: Dienstag 10. Mai 2016, 07:27
von Sirius3
@F4HCR: und das wäre meine Lösung:
Code: Alles auswählen
frequency = int('%x' % struct.unpack('>I', 'P\x11\x00\x00')) * 1e-5
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.
Re: funkgerät remote cotrol
Verfasst: Dienstag 10. Mai 2016, 14:03
von F4HCR
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
Code: Alles auswählen
frequency = float('%x' % struct.unpack('>I', 'P\x11\x00\x00')) / 1e-5
vielen dank
F4hcr
Re: funkgerät remote cotrol
Verfasst: Dienstag 10. Mai 2016, 14:23
von BlackJack
@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?