COM-Schnittstelle mit pySerial

  • Hallo an alle,


    ich nutze gerade Windows (ja keinen Pi) um mit den SerialPorts zu arbeiten.

    Mein Ziel ist es mit Serial Ports eines HDMI Switch´s zu spielen. Der an das Switch zu sendende Befehl ist :

    0x5A0x7E0x810x080x010x310xBB0x810xA5

    Ich würde nach den ersten Test von Python darauf hingewiesen das Unicode nicht supported wird und ich meinen Befehl encoden soll.

    Deswegen habe ich es mit serialcmd.encode versucht.

    Jedoch bekomme ich jetzt permanent den Fehler das 'serialcmd' nicht gefunden werden kann. Installiert habe ich es doch und beim einbinden am Anfang des Skripts meckert er auch nicht.

    Wo liegt denn jetzt mein Fehler?


    Meine Python-Datei sieht wie folgt aus:


  • Du hast doch schon die HEX Werte. Da muss nichts mehr enkodiert werden.


    Code
    ser.write(b'\x5A\x7E\x81\x08\x01\x31\xBB\x81\xA5')

    ( 0 durch \ ersetzt!)

    Sollte es eigentlich gewesen sein.

  • Hallo EL_Zetto,


    danke erstmal für deine Hilfe. Jedoch scheine ich irgendwo noch einen Denkfehler zu haben.


    Vielleicht kannst du mir noch einmal helfen?


    Anbei mal eine Portbeschreibung von meinen HDMI Switch.


    Link HDMI Switch


    Wenn ich das alles richtig verstanden habe müsste sich mein HDMI Switch von aktuell Port 4 auf Port 1 umschalten.

    Hast du eine Idee warum es nicht umschaltet?

  • Hallo tutter,


    zeig doch bitte deinen aktualisierten code dazu per copy paste.

    Hast du mal geschaut ob über die Schnittstelle irgendwas zurückkommt? Vielleicht versucht das Switch vorher noch ein Ack zu senden o.ä., was aber nicht geht, wenn du den Port sofort wieder schließt.

  • Hallo El_Zetto,


    anbei der Code:


    Code
    import serial
    ser = serial.Serial()
    ser.baudrate = 19200
    ser.port = 'COM6'
    ser.timeout = 1
    ser.open()
    ser.write(b'\x5A\x7E\x81\x00\x00\x81\x81\xA5')
    #ser.close() # warten auf Feedback?


    ich habe mal über CMD

    Code
    c:\config.sys > com6     

    abgefragt nach dem ich das oben aufgeführte Python Skript laufen lies. Müsste der Com Port 6 nicht in "benutzung" bleiben, also müsste ich nicht ein Zugriff verweigert erhalten?


    Wie kann ich die das von dir genannte Feedback abfangen? Meinst du das Aten HDMI Switch sendet ein Feedback?

  • Hast du pyserial für die serielle Kommunikation installiert, oder ein anderes Modul?


    Zu 1.

    Dein Script läuft ja einfach durch. Am Ende räumt der Interpreter auf und schließt unter anderem auch den Serial Port. Daher kannst du den danach wieder normal verwenden.


    Zu 2.

    Ob das Switch etwas zurücksendet weiß ich nicht. In einer guten Doku müsste sowas stehen, allerdings habe ich bisher ehrlich gesagt noch nicht gesucht.

    Versuche es zum debuggen einfach mal mit

    Code
    answer = ser.readall()
    print(str(answer))
    temp = input() #setzt das script in einen Wartezustand (wartet auf Tastatureingabe)

    setze dein timeout vorher ruhig noch auf 3 oder 4 Sekunden um sicher zu gehen, dass du nichts verpasst. Wenn du das script nicht beendest (nicht enter drückst) solltest du mit anderer software auch eine Meldung bekommen, dass der Port verwendet wird.


    Du solltest deinen seriellen Port explizit auf die Angaben in der Beschreibung setzen. Stopbit, Parität, etc. Wie das geht, findest du in der pyserial Dokumentation.

  • So nun weiter geht's. Das Switch scheint entweder nicht das richtig zurück zu senden oder aber von mir nicht den passenden Code zu erhalten.

    Die Antwort lautet b''


    also genau jenes b wo der eigentliche steuernde Code für das Switch drin zu stehen hat.

    Ich habe nun alles mir bekannte im Code gesetzt. Das Timeout habe ich nun auch auf 3 Sekunden erhöht.

    Trotzdem zuckt das Switch nicht. Das Tool von Aten arbeitet aber mit dem COM Port zusammen.


    Der Code sieht nun so aus:


  • hallo an alle und erst einmal ein frohes neues Jahr! über die Jahre habe ich etwas erstaunliches herausgefunden. Das bisherige Vorgehen kann nicht funktionieren. Mein HDMI Switch ist eine neue Version. Hier lauten andere Befehle!


    Gut das dies natürlich nirgends geschrieben steht! aber nun gut!

    Also wieder alles auf "Anfang"!


    Es ist bei meinen Switch möglich eine Zeichenfolge zu senden, jedoch muss dahinter noch ein Enter stehen.

    An der Stelle wo ENTER steht müsste ich noch das betätigen der Entertaste übergeben.


    Wie kann man sowas machen?


    Zur Erläuterung die Zeichenkette "sw i03" veranlasst das schalten auf Port 3 am HDMI Switch.

  • Versuch es mit der Anleitung aus der pyserial Dokumenation. Da steht, wie es geht.



    Falls Dein Switch etwas anderes erwartet, die Codes (hex) 0D (carriage return) und 0A (line feed) findet du in der Ascii Tabelle.

  • Hallo,


    `ENTER` löst technisch gesehen ja "nur" eine Keycode auf und das Betriebssystem verarbeitetet den dann. Normalerweise wird am Ende der Zeile / des Befehls ein Newline-Character `\n` erwartet.


    Gruß, noisefloor

  • noisefloor: ich habe deinen Tipp gleich mal ausprobiert. Wenn ich es richtig verstehe heißt das, ich dies wie folgt umgesetzt habe:

    Ausgang:


    ser.write(b'sw i03 ENTER')


    abgeändert in:


    ser.write(b'sw i03 \n')


    Jedoch, man glaubt es kaum, schaltet hier gar nichts!


    Oder muss der Befehl anders aussehen und ich habe etwas falsch verstanden?



    Ich werde noch wahnsinnig mit dem ding!

  • Moin,

    bin gerade über Dein Thread gestolpert. Aus meiner Sicht ist bereits die "ungültige" Übersicht der Steuerbefehle unlogisch / fehlerhaft.

    (3* Switch to Next Port , jeweils ein anderer Bytebefehl. usw.) Poste doch mal die neue Anleitung.

    Grüße


    Habe diese gerade gefunden. Der Switch erwartet auf der Schnittstelle als Befehlsabschluss "\r\n".

    Die Zeichenketten sind wie beschrieben

    Bei Senden z.B. der Umschaltung auf Port 4 (sw i04..)

    kommt auf der Schnittstelle 73 77 20 69 30 34 0D 0A

    Ob der Switch irgendwas zurücksendet, vermag ich nicht zu beurteilen, da ich die Kommunikation nur mit einem Portsniffer untersucht habe.

    Vermutlich kommt aber nix zurück, da die Herstellersoftware zum Steuern einfach weiter macht, ohne dass was angeschlossen ist.


    Grüße