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?

Code: Alles auswählen

m=struct.unpack('>I',c)[0]
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?