Serial hex lesen

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
mpe
User
Beiträge: 4
Registriert: Sonntag 23. Februar 2014, 21:19

Hallo zusammen,

Ich habe mir ein Python3.4 Script zusammen gestellt das von einem Nextion Display über Serial die Daten auslesen soll.
Eigentlich funktioniert alles ausser das die ausgabe zum teil nicht hex ist.

Zum Beispiel:

Das Nextion gibt auf der Seriellen Schnittstelle '0x65 0x00 0x09 0x00' aus.

- Mein Script gibt b'e\x00\t\x00' aus??

Das heisst 0x65 wird zu 'e' und '0x09' wird zu 't'

Wieso ist das so?
Was kann ich tun damit ich die gleichen werte auslese wie das Nextion es in die Seriell Schnittstelle reinschreibt?

Vielen Dank für weitere Hilfe,

Marc

Code: Alles auswählen

import serial

ser = serial.serial_for_url('socket://10.0.2.234:23', timeout=5)

def read():
    out = b''
    ff = 0
    while ser.inWaiting():

        read_ser = ser.read()

        if read_ser == b'\xff':
            ff += 1
            if ff == 3:
                print('GET cmd: ', out)
                ff = 0
                out = b''

        else:
            out += read_ser
            ser.flush

while True:
    read()
Zuletzt geändert von Anonymous am Samstag 20. Mai 2017, 23:26, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@mpe: Du bekommst da Bytes und wenn Du die einfach so ausgibst, dann musst Du halt mit der Darstellung leben die für `bytes` vorgesehen ist. Soll es etwas anderes sein, dann musst Du das selbst explizit in Text umwandeln.

Du empfängst das auch nicht '0x65' sondern ein Byte mit dem Wert 101 oder in hexadezimaler Schreibweise 65₁₆. Und wenn man in einer ASCII-Tabelle nachschlägt stellt man fest, das diese Zahl für ein 'e' steht. 9₁₆ ist übrigens nicht 't' sondern '\t', was *ein* Zeichen ist: das Tabulatorzeichen.

Schau dir wahlweise die `hex()`-Funktion, Zeichenkettenformatierung und was man da als Formatierungscodes für Zahlen angeben kann, oder das `binascii`-Modul aus der Standardbibliothek an.

Falls das ”flushen” übrigens wichtig sein sollte, dann solltest Du die Methode auch tatsächlich aufrufen.
mpe
User
Beiträge: 4
Registriert: Sonntag 23. Februar 2014, 21:19

@BalckJack:

Danke für deine Ausführungen, jetzt ist alles klar und ich habe ein Lösung gefunden.

Code: Alles auswählen

GET cmd:  0x65 0x03 0x09 0x00
PS: "ser.flush()" ist natürlich unötig.

Code: Alles auswählen

import serial

ser = serial.serial_for_url('socket://10.0.2.234:23', timeout=5)

def read():
    out_hex = ''
    ff = 0
    while ser.inWaiting():

        read_ser = ser.read()

        if read_ser == b'\xff':
            ff += 1
            if ff == 3:
                print('GET cmd: ', out_hex)
                ff = 0
                out_hex = ''

        else:
            out_hex += "0x{:02x} ".format(ord(read_ser))

while True:
    read()
Zuletzt geändert von Anonymous am Sonntag 21. Mai 2017, 12:47, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Antworten