Hallo Ich hab bislang nichts konkretes finden können, wie man einen UART Intterrupt unter Python programmiert. Kann jemand helfen?
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.
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
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)...
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.
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 | ....
|
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 | ....
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.