RasPi Python UART interrupt

Gast #5717116
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
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
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
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.