Jump to content

[Python] IO-16 Callback Probleme


Guest Robin
 Share

Recommended Posts

Guest Robin

Hallo zusammen,

 

bis vor kurzem war es noch problemlos möglich mit dem in der Dokumentation bereitsgestellten Beispiel ein Interrupt auf das IO-16 Bricklet in Python 3 zu legen. Aktuell habe ich jedoch das Problem, dass zwar grundsätzlich der Interrupt erkannt wird, allerdings erst, nachdem ich den input am Ende des Programms ausgelöst habe. Dadurch beendet sich das Programm natürlich auch und ich bin keinen Schritt weiter. Wird kein input eingegeben, dann wird auch kein Interrupt angezeigt oder ausgeführt. Hat jemand eine Idee woran das liegen kann? Die Firmware und Bindings habe ich jetzt auch schon ohne Erfolg aktualisiert.

 

Hier nochmal der angepasste Code aus der Dokumentation:

 

#!/usr/bin/env python
# -*- coding: utf-8 -*-  

HOST = "localhost"
PORT = 4223
UID = "uid" # Change to your UID

from tinkerforge.ip_connection import IPConnection
from tinkerforge.bricklet_io16 import IO16

# Callback function for interrupts
def cb_interrupt(port, interrupt_mask, value_mask):
    print('Interrupt on port: ' + port)
    print('Interrupt by: ' + str(bin(interrupt_mask)))
    print('Value: ' + str(bin(value_mask)))

if __name__ == "__main__":
    ipcon = IPConnection() # Create IP connection
    io = IO16(UID, ipcon) # Create device object

    ipcon.connect(HOST, PORT) # Connect to brickd
    # Don't use device before ipcon is connected

    # Register callback for interrupts
    io.register_callback(io.CALLBACK_INTERRUPT, cb_interrupt)

    # Enable interrupt on pin 2 of port a
    io.set_port_interrupt('a', 0xFF)

    input('Press key to exit\n') # Use input() in Python 3
    ipcon.disconnect()

 

Wenn ich das input weglasse, dann wird das Programm natürlich direkt beendet und auch hier komme ich also keinen Schritt weiter.

Link to comment
Share on other sites

Guest Robin

Ok, es scheint jetzt, als hätte ich eine Lösung gefunden. Ich habe das ganze bisher zwar nur beim Temperatr threshold Callback ausprobiert, hatte da aber das gleiche Problem. Es reicht eine unendliche Schleife zu erstellen. Es ist natürliche eher ein Workaround als eine schöne Lösung, funktioniert aber trotzdem.

 

import time

TinkerForge Code

while true:
    time.sleep (999) #Auch jeder andere große Wert möglich, beeinflusst Programm nicht

Link to comment
Share on other sites

Funktioniert hier ohne Probleme unter Linux mit Python 3.2.3.

 

Probier mal nach den prints stdout zu flushen:

 

#!/usr/bin/env python
import sys

HOST = "localhost"
PORT = 4223
UID = "aE7" # Change to your UID

from tinkerforge.ip_connection import IPConnection
from tinkerforge.bricklet_io16 import IO16

# Callback function for interrupts
def cb_interrupt(port, interrupt_mask, value_mask):
    print('Interrupt on port: ' + port)
    print('Interrupt by: ' + str(bin(interrupt_mask)))
    print('Value: ' + str(bin(value_mask)))
    sys.stdout.flush()

if __name__ == "__main__":
    # [...]

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...