Forum: Mikrocontroller und Digitale Elektronik Raspberry "Absturz" nach Empfangen serieller Daten


von Sven (Gast)


Lesenswert?

Hallo,

mein Problem ist folgendes: Ich habe einen Raspberry (A+) mit einem 
Teensy 3.6 über die serielle Verbunden, denn der Teensy soll den 
Raspberry über ein serielles Protokoll steuern. Auf den Raspberry wird 
ein Python-Programm automatisch gestartet welches dann an der serielle 
Schnittstelle "lauscht", sprich auf Befehle des Teensy's wartet. Der 
Teensy wartet ca. 1 Minute bis der Raspberry gebootet hat und versucht 
dann den den Raspberry "anzusprechen". Sobald der Teensy einige Bytes 
über sie serielle Schnittstelle an den Raspberry geschickt hat - stürzt 
der Raspberry ab. Ich vermute er geht in den "Halt"-Modus.
Wenn ich das Python-Programm am Respberry über ein Terminal (ssh) starte 
funktioniert alles problemlos, die Kommunikation zwischen den Devices 
ist ok - aber eben nicht beim Autostart des Skipts. Auf dem Raspberry 
habe ich die serielle Shell-Login, Modemmanager und getty deaktiviert.

Nach einigen Tagen Tagen des Probierens und Konfigurierens weiss ich nun 
nicht mehr weiter und hoffe auf einen Tip.

Danke ...

von Hans (Gast)


Lesenswert?

Wie startest du das Programm denn automatisch nach dem Booten?

Falls du die rc.local verwendest: Schiebst du die Anwendung in den 
Hintergrund? Sonst blockiert die den Bootvorgang.

von Stefan D. (mackie05)


Lesenswert?

Kann es sein, dass Dein Teensy mit Uart in TTL Pegel sendet? Der 
Raspberry mag hier nur LVTTL.

von PittyJ (Gast)


Lesenswert?

Hans schrieb:
> Wie startest du das Programm denn automatisch nach dem Booten?
>
> Falls du die rc.local verwendest: Schiebst du die Anwendung in den
> Hintergrund? Sonst blockiert die den Bootvorgang.

Würde mich jetzt auch interessieren. Ich habe auch verschiedene 
Möglichkeiten probiert, und am besten war immer ein Script in init.d und 
ein Link in rcX.d.

So wie Methode 1 in
https://jankarres.de/2014/07/raspberry-pi-autostart-von-programmen-einrichten/

von Horst (Gast)


Lesenswert?

Welches System läuft auf dem Pi?
Öffnet es eine Konsole oder eine Logausgabe währen des Bootens auf der 
seriellen?

von Sven (Gast)


Lesenswert?

Hallo,

ich habe jessie lite installiert und das Python Skript mittels rc.local 
automatisch gestartet. Jetzt starte ich das Skript mit crontab und es 
scheint zu laufen wie gewünscht. Ich werde das heute Abend nochmal 
genauer nachprüfen. Auf jeden Fall vielen Dank für die Hilfe.

von Hans (Gast)


Lesenswert?

Sven schrieb:
> Jetzt starte ich das Skript mit crontab und es
> scheint zu laufen wie gewünscht.

Kannst du deinen Auszug aus der Crontab hier mal posten? Je nachdem 
könnte es sein, dass dein Script nach etwa 15 Minuten erneut gestartet 
wird

von Hans (Gast)


Lesenswert?

Das richtige Vorgehen wäre übrigens systemd zu verwenden

von Horst (Gast)


Lesenswert?

Hans schrieb:
> Das richtige Vorgehen wäre übrigens systemd zu verwenden

Warum? Ist es bei Linux nicht grad so, daß es viele unterschiedliche 
Methoden gibt und nicht nur 'die richtige' und 'die falsche'?
Und wenn nicht, wer entscheidet welche der Möglichkeiten die einzig 
'richtige' ist?

von Hans (Gast)


Lesenswert?

Horst schrieb:
> Warum? Ist es bei Linux nicht grad so, daß es viele unterschiedliche
> Methoden gibt und nicht nur 'die richtige' und 'die falsche'?
> Und wenn nicht, wer entscheidet welche der Möglichkeiten die einzig
> 'richtige' ist?

Alles hat seinen Zweck.

In der rc.local und per Crontab @reboot sollten nur Scripte und 
Programme gestartet werden, die nur kurz! laufen und sich danach 
automatisch beenden. Hier wird allerdings offenbar ein Programm 
gestartet, dass über lange Zeit läuft. Daher hat es auch den Boot per 
rc.local blockiert. Das Problem ist nun, dass du ein Programm, dass du 
über die rc.local oder einen cronjob nur per killall bzw. kill <pid> 
beenden kannst.
Dazu kommt, dass über die rc.local gestartete Anwendungen (ohne 
Umleitung nach /dev/null) ihre Ausgaben auf  /dev/tty1 ausgeben. Möchte 
man auf dieser Konsole arbeiten, ist das schwierig.

Machst du das allerdings sauber über einen service, dann kannst du das 
Programm jederzeit per Befehl starten, stoppen oder neustarten. Dazu 
kommt, dass du bei systemd auch Abhängigkeiten erfüllen kannst. Benötigt 
dein Programm z.B. eine Netzwerkverbindung, dann wird es erst 
ausgeführt, sobald die dafür notwendigen Prozesse laufen.
Dazu kannst du im Fehlerfall die Ausgaben des Programms abfragen und 
somit Probleme identifizieren. Bei Cron oder rc.local landen diese 
Informationen im Nirvana.

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.