Seite 1 von 1

Integer in formatierte HEX-Zahl wandeln und binär senden

Verfasst: Samstag 3. Juli 2010, 01:54
von SwissMäc
Hallo zusammen

Ich möchte eine Frequenz an ein Funkgerät via RS232 schicken.

Von Hand gerechnet funktioniert das so:

Code: Alles auswählen

#123,45 MHz = 12345000
str(hex(12345000))
#= '0xbc5ea8'
#Dann noch auf 4 Zahlen auffüllen und versenden:
ser.write( chr(0x00) + chr(0xbc) + chr(0x5e) + chr(0xa8) )
Doch automatisch kann ich es nicht:

1) Kann man Hex formatieren, damit es auf eine fixe Stellenzahl führende Nullen ergänzt zu "0x00bc5ea8" ?

2) Wie sende ich die einzelnen Bytes ?

Ich fummle mit einer Umwandlung rum:

Code: Alles auswählen

fh=['0']*8
f=12345000
fs=str(hex(f))
fh[7]=fs[len(fs)-1]
...
dabei bekomme ich nicht mal das 'x' weg:

Code: Alles auswählen

if fh[1]=='x':
    fh[1]='0'
    print "x!"
else:
    fh[1]=fs[len(fs)-7]
    print "Not x"

print '>'+fh[1]+'<'
Dann kommt er mir noch hämisch mit:

Code: Alles auswählen

Not x
>x<
und der Versuch zum Versenden gleicht auch einem Fiasko:

Code: Alles auswählen

print "chr", ord(fh[1]+fh[0])
Wo ist der Denkfehler ?

Re: Integer in formatierte HEX-Zahl wandeln und binär senden

Verfasst: Samstag 3. Juli 2010, 06:14
von BlackJack
@SwissMäc: Ein Denkfehler scheint mir zu sein, dass Du denkst irgendwie die Hexdarstellung zu brauchen. Wie wär's wenn Du die Zahl *direkt* in vier Bytes umwandelst!? Dafür gibt es das `struct`-Modul.

Code: Alles auswählen

In [1695]: data = struct.pack('>I', 12345000)

In [1696]: data, len(data)
Out[1696]: ('\x00\xbc^\xa8', 4)

Re: Integer in formatierte HEX-Zahl wandeln und binär senden

Verfasst: Samstag 3. Juli 2010, 20:20
von SwissMäc
So einfach, eben gewusst wie! (Und ich hatte über 30 Codezeilen geschrieben...)

Code: Alles auswählen

import serial
import struct
...
freq = struct.pack('>I', 12345000)
ser.write( chr(ord(freq[0])) + chr(ord(freq[1])) + chr(ord(freq[2])) + chr(ord(freq[3])) )
Vielen Dank ! :D

Re: Integer in formatierte HEX-Zahl wandeln und binär senden

Verfasst: Samstag 3. Juli 2010, 20:42
von EyDu
Du solltest noch einmal über deine chr(ord(...))-Konstruktion überdenken ;-)

Re: Integer in formatierte HEX-Zahl wandeln und binär senden

Verfasst: Samstag 3. Juli 2010, 21:56
von snafu
Anders ausgedrückt: `ser.write(freq[:4])` tut das selbe. ;)

Re: Integer in formatierte HEX-Zahl wandeln und binär senden

Verfasst: Samstag 3. Juli 2010, 22:32
von BlackJack
@snafu: Und Du denkst nochmal über das slicing nach. ;-)

Re: Integer in formatierte HEX-Zahl wandeln und binär senden

Verfasst: Sonntag 4. Juli 2010, 07:15
von snafu
@BJ: Ich verstehe nicht ganz...

Code: Alles auswählen

>>> freq = 'slicing'
>>> freq[:4] == chr(ord(freq[0])) + chr(ord(freq[1])) + chr(ord(freq[2])) + chr(ord(freq[3]))
True

Re: Integer in formatierte HEX-Zahl wandeln und binär senden

Verfasst: Sonntag 4. Juli 2010, 08:32
von BlackJack
@snafu: `freq` ist aber nicht das Wort 'slicing' sondern das Ergebnis eines `struct.pack()`-Aufrufs der eine Zeichenkette der Länge 4 liefert.

Re: Integer in formatierte HEX-Zahl wandeln und binär senden

Verfasst: Sonntag 4. Juli 2010, 08:40
von snafu
Ok, dann hab ich da vermutlich keine Ahnung von und halt mal den Mund... :mrgreen: