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

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
SwissMäc
User
Beiträge: 20
Registriert: Freitag 26. Februar 2010, 21:36

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 ?
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)
Benutzeravatar
SwissMäc
User
Beiträge: 20
Registriert: Freitag 26. Februar 2010, 21:36

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
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Du solltest noch einmal über deine chr(ord(...))-Konstruktion überdenken ;-)
Das Leben ist wie ein Tennisball.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Anders ausgedrückt: `ser.write(freq[:4])` tut das selbe. ;)
BlackJack

@snafu: Und Du denkst nochmal über das slicing nach. ;-)
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@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
BlackJack

@snafu: `freq` ist aber nicht das Wort 'slicing' sondern das Ergebnis eines `struct.pack()`-Aufrufs der eine Zeichenkette der Länge 4 liefert.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ok, dann hab ich da vermutlich keine Ahnung von und halt mal den Mund... :mrgreen:
Antworten