Python Serial Arduino

  • Abend,
    ich habe an meinen Raspberry über USB (ttyUSB0) einen Arduino Nano angeschlossen.
    An diesem ist wiederum ein Keypad (Affiliate-Link)angeschlossen, welches mir bei einen Tastendruck, über die Serielle Schnittstelle die mitteilt welche Taste gedrückt wurde.


    Das ist auch bis hier hin alles kein Problem und funktioniert.
    Allerdings habe ich das Problem, dass wenn ich die übermittelten Daten über python mit:

    Code
    print(response)


    ausgebe ich immer ein 'b' und Anführungsstriche davor gesetzt bekomme.


    [Blocked Image: http://www.pic-upload.de/view-32235736/Unbenannt.jpg.html]



    Folgender Python-Code benutze ich um die Verbindung zum Arduino herzustellen und zum warten auf die übermittelten Daten über die Serielle Schnittstelle



    Folgenden C-Code benutze ich auf dem Arduino um die Tasten abzufragen




    Jemand eine Idee woran das liegen könnte ?


    Grüße Swoopo

  • Ein Problem was ich bei dir sehe: Jedes mal wenn du deine getKey() Funktion aufrufst wird "ser" geöffnet und somit der Arduino resettet. Ist das gewollt? ;) Ich würde die Serielle Schnittstelle nur ein mal öffnen und dann immer wieder darauf zugreifen bzw auslesen.


    Beispiel:


    [code=php]
    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
    import serial
    import time
    import sys
    #-------------------------------------------------------------------


    SerialPort = "/dev/ttyACM0"
    SerialBaudrate = 38400


    # serial docu: http://pyserial.sourceforge.net/pyserial.html


    #-------------------------------------------------------------------


    def ArduinoAuslesen(serObject):
    while True:
    try:
    # Remove newline character '\n'
    response = serObject.readline().strip()
    #response = serObject.readline()
    if response:
    print("Arduino-> "+str(response)),
    # ...do something with it...
    except serial.SerialException as e:
    print("Could not read serial port '{}': {}".format(SerialPort, e))
    except (KeyboardInterrupt, SystemExit):
    sys.exit()
    serObject.close()


    #-------------------------------------------------------------------


    def main():
    #initialization and open the port.
    #possible timeout values:
    # 1. None: wait forever, block call
    # 2. 0: non-blocking mode, return immediately
    # 3. x, x is bigger than 0, float allowed, timeout block call
    ser = serial.Serial()
    ser.port = SerialPort
    ser.baudrate = SerialBaudrate
    ser.bytesize = serial.EIGHTBITS #number of bits per bytes
    ser.parity = serial.PARITY_NONE #set parity check: no parity
    ser.stopbits = serial.STOPBITS_ONE #number of stop bits
    #ser.timeout = None #block read
    ser.timeout = 1 #non-block read
    #ser.timeout = 2 #timeout block read
    ser.xonxoff = False #disable software flow control
    ser.rtscts = False #disable hardware (RTS/CTS) flow control
    ser.dsrdtr = False #disable hardware (DSR/DTR) flow control
    ser.writeTimeout = 2 #timeout for write
    try:
    ser.open()
    except Exception as e:
    print("Error open serial port: " + str(e))
    sys.exit()
    if ser.isOpen():
    try:
    ser.flushInput() #flush input buffer, discarding all its contents
    ser.flushOutput() #flush output buffer, aborting current output and discard all that is in buffer
    ArduinoAuslesen(ser)
    except Exception as e:
    print("Error...: " + str(e))
    except (KeyboardInterrupt, SystemExit):
    print("\nSchliesse Programm..\n")
    if ser: ser.close()
    sys.exit()


    if __name__ == '__main__':
    main()
    [/php]


    Da das aber dein Hauptscript blockiert (die while Schleife) würde ich das in einen separaten Thread tun sofern dein Script parallel noch mehr machen soll - wenn aber nicht dann einfach nur eine andere Funktion mit dem 'response' ausführen.

  • Hast du das die nur irgendwo zusammenkopiert und verstehst es nicht oder hast du das selber programmiert?


    Gesendet von meinem Redmi 3S mit Tapatalk

    Using Tapatalk

  • Wenn du kein triftigen Grund kennst wieso du python3 nutzt dann mach es einfach mit python2 und du hast dieses Problem nicht.


    Ansonsten... Verwende nicht Serial.write(keypressed); sondern Serial.println(keypressed); ...
    Was ist by the way der Unterschied? :fies: => arduino serial.print vs serial.write
    https://www.arduino.cc/en/Serial/Write
    https://www.arduino.cc/en/Serial/Print


    Ansonsten google nach " python3 serial byte "
    ...so von wegen encode / decode...
    [code=php]response = (ser.readline().strip()).decode("ISO-8859-1")[/php]

  • Hi,


    ... Allerdings habe ich das Problem, dass wenn ich die übermittelten Daten über python mit:

    Code
    print(response)


    ausgebe ich immer ein 'b' und Anführungsstriche davor gesetzt bekomme.
    ...


    hm ... vorab: ich hab' keine Ahnung von Python ...
    Kann es sein, dass das, was Du da ausgibst, ein Wert ist, der als Bitfolge interpretiert und deshalb mit führendem b ausgegeben wird?
    Wär jetzt so meine Mutmaßung ...


    cu,
    -ds-

  • ...ja weil python2 das intern umwandelt, was aber eigentlich nicht gut ist...


    Trotzdem solltest du verstehen wieso das so ist -> siehe Beitrag#5


    Serial.write schreibt binär. Serial.print ascii. Genau das verursacht Dein Problem.


    Wenn Du das verstanden hast kannst du auch python3 nutzen, und entweder dein Sketch anpassen oder im python3 Script die Ausgabe decodieren.