Seite 1 von 1

Serial hex lesen

Verfasst: Samstag 20. Mai 2017, 22:25
von mpe
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()

Re: Serial hex lesen

Verfasst: Samstag 20. Mai 2017, 23:34
von 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.

Re: Serial hex lesen

Verfasst: Sonntag 21. Mai 2017, 09:39
von mpe
@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()