funkgerät remote cotrol

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
F4HCR
User
Beiträge: 8
Registriert: Sonntag 1. Mai 2016, 20:28

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
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@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)
F4HCR
User
Beiträge: 8
Registriert: Sonntag 1. Mai 2016, 20:28

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
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'
F4HCR
User
Beiträge: 8
Registriert: Sonntag 1. Mai 2016, 20:28

vielen dank das funktioniert
F4HCR
User
Beiträge: 8
Registriert: Sonntag 1. Mai 2016, 20:28

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
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?
F4HCR
User
Beiträge: 8
Registriert: Sonntag 1. Mai 2016, 20:28

ist richtig das funktionier bei mir auch nur erwarte ich als erbenis 50110000.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@F4HCR: Du erwartest das Falsche:

Code: Alles auswählen

>>> hex(struct.unpack('>I', 'P\x11\x00\x00')[0])
'0x50110000'
F4HCR
User
Beiträge: 8
Registriert: Sonntag 1. Mai 2016, 20:28

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
BlackJack

@F4HCR: Zeichenkettenformatierung kennt einen Formatcode für Hexdarstellung von ganzen Zahlen, ohne das '0x' am Anfang.
F4HCR
User
Beiträge: 8
Registriert: Sonntag 1. Mai 2016, 20:28

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
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
F4HCR
User
Beiträge: 8
Registriert: Sonntag 1. Mai 2016, 20:28

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
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?
Antworten