Forum: Mikrocontroller und Digitale Elektronik RasPi Python UART interrupt


von Jonathan (Gast)


Lesenswert?

Hallo

Ich hab bislang nichts konkretes finden können, wie man einen UART 
Intterrupt unter Python programmiert. Kann jemand helfen?

von Dr. Sommer (Gast)


Lesenswert?

Gar nicht. Interrupts werden vom Kernel behandelt. Und der wird in C, 
nicht in Python, programmiert. Normale Anwendungen können keine 
Interrupts benutzen.
C-Programme können per poll() oder select() auf ankommende Daten 
reagieren. In Python wird es dazu entsprechende Funktionen geben. Der 
Kernel wird da vermutlich intern Interrupts für benutzen, davon merkt 
das Programm aber nichts.

von Walter T. (nicolas)


Lesenswert?

Interrupt eher nicht. Aber man kann wahrscheinlich die dazu passende 
Callback-Funktion programmieren. Das geht deutlich Prozessorschonender 
als ständiges Pollen.

In Python habe ich das allerdings noch nie gemacht. In Matlab ist das 
eine Fingerübung. Man erzeugt ein function handle und übergibt dies der 
UART-Initialisierung. Unter Python wird es vermutlich ähnlich gehen.

Nachtrag: Ich habe falsch geraten. Der "Python way to do it" scheint zu 
sein, einen separaten Thread zu erzeugen, der pollt, um das 
Hauptprogramm nicht zu blockieren.

: Bearbeitet durch User
von R. R. (elec-lisper)


Lesenswert?

Was Walter noch schrieb wollte ich auch gerade schreiben.
Es gibt tatsächlich keine Event-Schleifen basierten schönen
Lösungen in Python. In C++ ist das mit boost::asio immer garkein
Problem ohne Threads auszukommen.

In Python darf man sich dann immer schön mit Thread-Synchronisierung
beschäftigen (Mein Tip: Nur Queues für Inter-Thread-Kommunikation 
benutzen)...

von Peter Z. (hangloose)


Lesenswert?


von Sven B. (scummos)


Lesenswert?

R. R. schrieb:
> Was Walter noch schrieb wollte ich auch gerade schreiben.
> Es gibt tatsächlich keine Event-Schleifen basierten schönen
> Lösungen in Python. In C++ ist das mit boost::asio immer garkein
> Problem ohne Threads auszukommen.

So ein Unfug, es gibt einen Haufen Libraries mit Event Loops in Python 
... fängt mal an mit PyQt und twisted, aber man findet sicherlich 
fünfzig andere.

von Jonathan (Gast)


Lesenswert?

ich wollte es nun mittels threats realisieren. Es läuft aber noch nicht 
wie es sollte. Im folgenden Program zählt ein counter immer wieder bis 
10. Egal wie oft ich in dieser Zeit Daten über uart sende, es wird nur 
jeweils einmal Bingo angezeigt

1
def check_uart()
2
3
  global uart_data_available
4
        uart_data_available = 0
5
6
  while True:
7
    uart_data = ser.readline()
8
    
9
    if (uart_data!=""):
10
      uart_data_available = 1
11
12
    sleep(0.1)
1
def task():
2
        global uart_data_available
3
        for i in range (0,10):
4
                print i
5
                if (uart_data_available==1):
6
            print "BINGO"
7
                        uart_data_available = 0
8
                sleep(1)
9
10
[c]
11
def main():
12
        ...
13
        ser = serial.Serial(port='/dev/ttyAMA0',baudrate =9600, timeout=1)
14
        start_new_thread(check_uart,())
15
        sleep(1)
16
        ...
17
        while True:
18
          ....
19
                task()
20
                ....

von Jonathan (Gast)


Lesenswert?

oops, line indent wurde nicht richtig übernommen, hier nochmals:
1
def check_uart()
2
3
    global uart_data_available
4
    uart_data_available = 0
5
6
    while True:
7
        uart_data = ser.readline()  
8
        if (uart_data!=""): uart_data_available = 1
9
        sleep(0.1)
1
def task():
2
    global uart_data_available
3
    for i in range (0,10):
4
        print i
5
        if (uart_data_available==1):
6
            print "BINGO"
7
            uart_data_available = 0
8
        sleep(1)
1
def main():
2
    ...
3
    ser = serial.Serial(port='/dev/ttyAMA0',baudrate =9600, timeout=1)
4
    start_new_thread(check_uart,())
5
    sleep(1)
6
    ...
7
    while True:
8
        ....
9
        task()
10
        ....

von Dr. Sommer (Gast)


Lesenswert?

R. R. schrieb:
> Es gibt tatsächlich keine Event-Schleifen basierten schönen
> Lösungen in Python.

Oh weia. Ruby kann sowas und läuft auch auf dem PI. Es gibt da eine 
select () Funktion.

Wer "Thread" nicht mal richtig schreiben kann sollte vielleicht nicht 
damit programmieren. Da gibt es unendlich viele Fallen, es ist extrem 
schwer das korrekt hin zu bekommen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.