Ankündigung

Einklappen
Keine Ankündigung bisher.

Logik oder Plugin

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Logik oder Plugin

    Hallo,

    ich möchte regelmäßig Werte von einem seriellen Port lesen. Da das einen Moment dauert und ich die Verbindung auch gerne aufgebaut lassen möchte, frage ich mich, ob hier eine Logik überhaupt geeignet ist, oder ich ein Plugin schreiben muss?
    Ich wehre mich dagegen, weil ich noch nie ein Plugin geschrieben habe und keine Ahnung habe, wie's geht...

    Gruß,
    Hendrik

    #2
    Hi Hendrik,

    Plugin ist wohl der bessere Weg. Ich würde mir an Deiner Stelle andere Plugins ansehen die über die serielle gehen. Mach dazu mal ein grep im Plugin Ordner.

    bis bald

    Marcus

    Kommentar


      #3
      Hi Hendrik, hattest du schon Erfolge? Ich kämpfe seit Tagen damit, unter python3 hex code über rs232 zu senden (pyserial) unter python2 alles problemlos.

      Kommentar


        #4
        Hallo,

        ich hab noch nicht in Richtung Plugin gearbeitet -Aufgrund von Prioritäten.
        Aber das hilft vielleicht beim Umstieg auf python3:
        Code:
        import serial
        import time
        import crc16
        import csv
        ser = serial.Serial(15, timeout=1) #baud=9600 parity=N data=8 stop=1
        
        ser.write('test1234'.encode('latin1'))
        time.sleep(300/1000)
        hello=ser.readline().decode('latin1')
        print(hello)
        
        ser.write('abba'.encode('latin1'))
        time.sleep(400/1000)
        res=ser.read(1000).decode('latin1')
        Gruß,
        Hendrik

        Kommentar


          #5
          Hallo Hendrik!

          Danke für den Ansatz, funzt aber nicht. Mein Problem ist wohl, dass es sich um nichtdruckbare HEX-Zeichen handelt. Wenn ich mir den Befehl in Python anzeigen lasse, kommt folgendes raus: ▒▒0▒▒
          Unter Python 2 wird mit folgendem (vereinfachten) Code der Befehl korrekt via RS232 übertragen, sprich meine Leinwand bewegt sich wie gewünscht:
          Code:
          screen = serial.Serial(port='/dev/ttyUSB0',baudrate=19200,timeout=0.1)
          
          befehl = "\xFE\x01\xC2\x01\x30\x00\x00\x5D\x08\x86\x9E\x0D"
          
          screen.write(befehl)
          Unter Python3 muss ich den Code auf jeden Fall ändern, da es sonst die Fehlermeldung gibt, dass ein integer erwartet wird. Hab's schon auf 1000e Arten und Weisen hinbekommen, dass PySerial unter Python3 auch was raus sendet, an der Leinwand tut sich allerdings nie was

          Code:
          #befehl = chr(254)+chr(1)+chr(194)+chr(1)+chr(48)+chr(0)+chr(0)+chr(93)+chr(8)+chr(134)+chr(158)+chr(13)
          #auch mit 0xFE etc. probiert, also original HEX statt Decimal
          #befehl = befehl.encode("utf-8") 
          #latin1, ascii, was auch immer, egal
          #befehl = BitArray('0xFE0x010xC20x010x300x000x000x5D0x080x860x9E0x0D')
          #befehl = "FE01C2013000005D08869E0D"
          Encoding so ziemlich egal, auch als bytes(befehl) passiert nix und angezeigt (print) wird der Befehl als þÂ0]

          Vielleicht fällt dir dazu ja was auf die Schnell ein, ansonsten poste ich mal in einem passenderen Forum
          Vielen Dank!
          Andy

          Kommentar


            #6
            Nee, dazu bin ich zu blutiger Anfänger.
            Mein Verständnis:
            Über den Seriellen Port gehen ja nur Einsen und Nullen. Serial.write erwartet einen Integer und wandelt den in die Einsen und Nullen um (--> aus 17 wird 10001) . Hex ist ja nix anderes als ein Integer in anderer Notation. Aus 11 wird 10001)

            Wandle doch deinen String in integer und gib den dann an serial:
            Code:
            >>> befehl = "FE01C2013000005D08869E0D"
            >>> bytes.fromhex(befehl)
            b'\xfe\x01\xc2\x010\x00\x00]\x08\x86\x9e\r'
            >>> int(befehl, 16)
            78611317581444447783545642509
            Oder wandle dein "Befehl" in python2 nach int um.



            Gruß,
            Hendrik

            Kommentar


              #7
              Danke nochmals! Das hatte ich so auch schon probiert, allerdings ohne Erfolg. Auch in Python2 umgewandelt und das dann übernommen - passiert nix.

              Bei allen anderen Geräten keinerlei Problem. Sowohl
              Code:
              amp.write('\x50\x46\x0D'.encode("utf-8"))
              als auch
              Code:
              amp.write(b'\x50\x46\x0D')
              funktionieren einwandfrei. Das sind aber auch die direkten Umwandlungen des ASCII-Befehls "PO" bzw "PF", also "normale" Zeichen. Habe keine Ahnung, ob ich das mit den HEX-Befehlen irgendwann irgendwie hinbekomme

              Danke jedenfalls und falls du was Cooles für RS232 gebastelt hast, lass es uns bitte wissen

              Kommentar


                #8
                Ich glaube es kaum - ich habe es geschafft. Für den Fall, dass hier jemand auf ein ähnliches Problem stößt, hier der Lösungsweg:
                1.) Umwandeln der HEX-Codes in Dezimalzahlen mittels ASCII to Hex - Free text conversion tools
                2.) Installieren von wiringpi2 für Python3: WiringPi
                3.) Definieren der seriellen Schnittstelle in einem PY-File (Logik-Ordner):
                Code:
                # wiring pi importieren
                import wiringpi2 as wiringpi
                # serielle Schnittstelle definieren Port und Baudrate
                serial = wiringpi.serialOpen('/dev/ttyUSBx',baudrate)
                4.) Jetzt kommt's. Offenbar müssen alle Dezimalcodes einzeln als unsigned characters gesendet werden. Mit strings \xFE oder 0xFE etc. via "Printf" oder "Puts" hat es bei mir jedenfalls nicht geklappt
                Code:
                wiringpi.serialPutchar(serial,254)
                wiringpi.serialPutchar(serial,1)
                wiringpi.serialPutchar(serial,194)
                # würde die HEX Codes FE 01 C2 als einzelne Zeichen raus spielen. Lässt sich beliebig ersetzen und erweitern
                wiringpi.serialFlush(serial)
                wiringpi.serialClose(serial)
                #Buffer flushen und Port schließen
                Bei mir war es nötig, noch einen Zeilenumbruch nachzuschicken, damit der Befehl auch wirklich ausgeführt wird: wiringpi.serialPutchar(screen,13)

                Sollte wem doch eine einfachere und noblere Methode über den Weg laufen, bitte gerne. Ich hatte aber das Gefühl, dass ich das komplette Internet 10 Mal durchforstet hatte

                Kommentar

                Lädt...
                X