RasPi Python UART interrupt

Gast #5717116
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.
#5717130
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.
#5717142
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)...
#5717272
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.
Gast #5717355
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
                ....
Gast #5717373
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
        ....
Gast #5717374
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren