Backslash in String - RS485 Protokoll

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
Jabo
User
Beiträge: 1
Registriert: Montag 23. Oktober 2023, 08:33

Hallo zusammen,

ich möchte einen Messverstärker über RS485 betreiben.
Der Messverstärker arbeitet im Hexadecimalsystem.
An sich funktioniert die Kommunikation, jedoch nur, wenn ich den gesamten Befehl in einem eingebe (data = bytearray(b'\xfe\x7f\x01\x82\x02').

Ich möchte eine Funktion erstellen, der ich die einzelnen Befehlbestandteile einzeln übergeben kann (z.B. fe, 7f, 01, 82 usw.).
Allerdings bekomme ich es nicht hin, aus den einzelnen Variablen/Befehlbestandteilen den Befehlt so zusammensetzen, wie er in der Funktion bytearray steht.
Ich denke dies liegt am Backslash, da es ja auch ein escape-Zeichen ist und dann nicht als "normales" Zeichen erkannt wird.

Hat vielleicht jemand einen Tipp wie ich das am besten umsetzen könnte, sodass ich zunächst die einzelnen Befehlsteile definiere und danach den gesamten Befehl zusammensetze?

Vielen Dank schon mal!

Code: Alles auswählen

import serial   
import binascii


ComPort = serial.Serial('COM7')
ComPort.baudrate = 38400
ComPort.bytesize = 8
ComPort.parity   = 'N'
ComPort.stopbits = 1
ComPort.timeout = 0.01

data = bytearray(b'\xfe\x7f\x01\x82\x02')

No = ComPort.write(data)

dataIn = ComPort.readline()
print('Daten empfangen:')
hex_string = binascii.hexlify(dataIn).decode('utf-8')
print(hex_string) 

ComPort.close() 
Sirius3
User
Beiträge: 17844
Registriert: Sonntag 21. Oktober 2012, 17:20

Wie hast Du Dir denn die Übergabe versucht? In Deinem Code sehe ich nur den funktionierenden Weg.
Man kann auch einfach aus einer Liste mit Zahlen ein Bytes-Objekt erzeugen:

Code: Alles auswählen

data = bytes([0xfe, 0x7f, 0x01, 0x82, 0x02])
Eigentlich möchtest Du aber wahrscheinlich struct.pack benutzen, wenn es sich um kompliziertere Werte als Einzelbytes handelt.

Variablennamen werden generell komplett klein geschrieben. Den ByteString in ein bytearray umzuwandeln ist unnötig.
Wenn da Binärdaten übertragen werden, ist das readline etwas komisch, weil das erwartet ja Text in Zeilen.
Die Parameter für die Serielle Schnittstelle werden direkt beim Erzeugen angegeben und nicht nachträglich gesetzt.
Ein timeout von 0.01 ist sehr kurz.

Code: Alles auswählen

import serial
import binascii


def main():
    with serial.Serial('COM7',
            baudrate=38400,
            bytesize=8,
            parity='N',
            stopbits=1,
            timeout=0.01) as com_port:
        data = b'\xfe\x7f\x01\x82\x02'
        com_port.write(data)
        data_in = com_port.readline() # TODO: durch Lesen der richtigen Anzahl an Bytes ersetzen.
        print('Daten empfangen:')
        hex_string = binascii.hexlify(data_in).decode('utf-8')
        print(hex_string)

if __name__ == "__main__":
    main()
Benutzeravatar
__blackjack__
User
Beiträge: 13268
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Das `binascii.hexlify()` ist vielleicht auch zu umständlich weil `bytes`-Objekte selber eine Methode besitzen um da eine Zeichenketten in Hexadezimaldarstellung draus zu machen.
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
Antworten