Forum: PC Hard- und Software "reboot" über Serielle Schnittstelle (/dev/ttyACM0) unter Linux ausführen


von Kai G. (shangkai)


Lesenswert?

Hallo,

ich möchte vom AVR über die Serielle Schnittstelle Befehle (reboot, 
shutdown - h now usw.) an das OS von Linux senden und ausführen lassen. 
Verbindung mit minicom oder picocom funktioniert. Mir ist aber nicht 
ganz klar wie ich die empfangenen Daten von z.B. picocom an das 
Betriebssystem weiterleiten kann.
Es wäre schön wenn ich über die serielle Schnittstelle "reboot" sende 
Linux einen reboot ausführt. Geht das nur über ein script empfangene 
zeichnen über picocom einlesen und entsprechend darauf reagieren? 
Irgendwelche Tipps für mich?

Danke!!

Kai

von Thomas Z. (thomas_z41)


Lesenswert?

Du kannst dir eine ganz normale Konsole auf der Seriellen Schnittstelle 
bereitstellen:
https://www.kernel.org/doc/Documentation/serial-console.txt

von Kai G. (shangkai)


Lesenswert?

Wollte aber wirklich nicht den Kernel neu Kompilieren!

von Test (Gast)


Lesenswert?

Welche Distribution nutzt du denn ? Ansonsten schreib dir halt nen 
Script...

von Kai G. (shangkai)


Lesenswert?

Habe Ubuntu 12.04.3 LTS. Wie kann ich per bash die Ausgabe von "minicom 
-b 38400 /dev/ACM0" in eine Variable umleiten?

#!/bin/bash
test="Text"
echo "$test"
test = minicom -b 38400 /dev/ACM0 # oder wie auch immer ???
echo "$test"
exit 0

von Test (Gast)


Lesenswert?

Du brauchst kein minicom...kannst doch direkt mit cat, tail etc auf dem 
descriptor arbeiten. Vorher über stty konfigurieren..

BTW. Tu dir selber nen gefallen und nimm Python, Node.js o.ä. ..per 
Shell Script macht das doch keinen Spaß ;)

von Yalu X. (yalu) (Moderator)


Lesenswert?

Am einfachsten geht das mit
1
bash </dev/ttyS0

Dann kannst du von einem über die serielle Schnittstelle verbundenen
Rechner mit
1
echo "shutdown -h" >/dev/ttyS0

den Shutdown-Befehl senden (sofern die oben gestartete Shell mit
entsprechenden Rechten ausgestattet ist).

Wenn du nicht nur blind ein paar Befehle versenden möchtest, sondern
eine komplette interaktive Konsole (inkl. Login-Aufforderung) auf dem
zweiten Rechner möchtest, startest du auf dem Zielrechner
1
agetty /dev/ttyS0 38400

und auf dem zweiten Rechner ein Terminalprogramm (bspw. minicom).

von Reinhard S. (rezz)


Lesenswert?

Yalu X. schrieb:
1
echo "shutdown -h" >/dev/ttyS0

Müsste das nicht "shutdown -h now" heißen? So kenne ich es bis jetzt 
zumindest (Debian).

: Bearbeitet durch User
von Kai G. (shangkai)


Lesenswert?

Oh neee wie simpel!!

zuer mal ein
1
stty -F /dev/ttyACM0 cs8 38400 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts
absetzen.

dann eine Umleitung von ttyACM0 zur bash
1
bash < /dev/ttyACM0

und vom Microcontroller über UART senden was mann auführen möchte.

Jetzt bräuchte ich nur noch einen Tipp an welchen Orten unter Linux ich 
die beiden Befehle eintragen muss damit's nach einem reboot auch wieder 
funktioniert.

Danke im vorraus!!!

von Yalu X. (yalu) (Moderator)


Lesenswert?

Kai G. schrieb:
> Jetzt bräuchte ich nur noch einen Tipp an welchen Orten unter Linux ich
> die beiden Befehle eintragen muss damit's nach einem reboot auch wieder
> funktioniert.

Vermutlich (ich verwende kein Ubuntu) kannst du sie in /etc/rc.local
eintragen:

  http://wiki.ubuntuusers.de/rc.local


Reinhard S. schrieb:
> Yalu X. schrieb:echo "shutdown -h" >/dev/ttyS0
>
> Müsste das nicht "shutdown -h now" heißen? So kenne ich es bis jetzt
> zumindest (Debian).

Das "now" habe ich in Kais Anfrage einfach nur übersehen. Der Shutdown
wird aber auch ohne dieses Argument ausgeführt, allerdings mit einer
Verzögerung von 1 Minute. Vorher werden alle eingeloggten Benutzer noch
gewarnt, um ihnen die Chance zu geben, ihre offenen Dateien zu
speichern.

Da Kai den Rechner remote shutdownen möchte und er u.U. nicht sehen
kann, ob noch jemand an dem Rechner arbeitet, ist es vielleicht sogar
ratsam, das "now" wegzulassen ;-)

von Tgfdthfresdgjiknhgfdrggddrfg (Gast)


Lesenswert?

Serielle console lässt sich auch auf der kernelcommandline setzen, oder 
einen Getty drauf starten.

von Axel S. (a-za-z0-9)


Lesenswert?

Yalu X. schrieb:
> Kai G. schrieb:
>> Jetzt bräuchte ich nur noch einen Tipp an welchen Orten unter Linux ich
>> die beiden Befehle eintragen muss damit's nach einem reboot auch wieder
>> funktioniert.
>
> Vermutlich (ich verwende kein Ubuntu) kannst du sie in /etc/rc.local
> eintragen:

eher nicht

Für die Verwaltung der Konsolen ist init zuständig. Bzw. in neueren 
Distributionen upstart oder systemd. Letztere sind aber zumindest in 
diesem Punkt abwärtskompatibel. Das Configfile das man dafür ändern 
möchte, ist /etc/inittab:
1
~ $cat /etc/inittab | tail -9 
2
# Example how to put a getty on a serial line (for a terminal)
3
#
4
#T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100
5
#T1:23:respawn:/sbin/getty -L ttyS1 9600 vt100
6
7
# Example how to put a getty on a modem line.
8
#
9
#T3:23:respawn:/sbin/mgetty -x0 -s 57600 ttyS3

Zu beachten ist, daß man so einen Login-Prompt auf der seriellen 
Schnittstelle bekommt. Der µC muß sich also erst mit einem gültigen 
Account einloggen bevor er Kommandos absetzen kann. Allerdings will man 
das auch genauso.


XL

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.