Hallo Forum,
ich suche eine Möglichkeit, mit einem Shell-Skript den Zustand eines Reed-Kontakts/Schalters/Tasters zu überwachen. Das folgende Skript zeigt zwei Möglichkeiten, die ich gefunden habe, die aber nur im Dialog funktionieren, d. h., je nach Schalterstellung bekomme ich angezeigt, was ich eingetippt habe oder nicht.
Das Skript zeigt mir bisher nur, dass mein Kabel funktioniert. Ich habe es bisher nicht geschafft, durch das Skript etwas auf /dev/ttyS0 schreiben und wieder lesen zu lassen, um nach Vergleich und Gleichheit das weitere Programm zu steuern. Siehe folgenden Pseudo-Code:
Wie bekomme ich die Ein- und Ausgaben im Shell-Skript, oben ( bg() oder eineZeile() ), so umgeleitet, dass es so funktioniert, wie im Pseudo-Code angedeutet?
Danke für Tipps!
Gruß,
radiergummi
ich suche eine Möglichkeit, mit einem Shell-Skript den Zustand eines Reed-Kontakts/Schalters/Tasters zu überwachen. Das folgende Skript zeigt zwei Möglichkeiten, die ich gefunden habe, die aber nur im Dialog funktionieren, d. h., je nach Schalterstellung bekomme ich angezeigt, was ich eingetippt habe oder nicht.
Code:
#!/bin/sh
# Skript zur Überwachung eines Reed-Kontakts
#
# Anschluss:
# RS232 Sub-D 9pol DB9
# Pins 2 und 3 Reed-Kontakt : Tx -> Rx
# Pins 4-1-6 brücken : DTR -> CD und DSR
# Pins 7-8 brücken : RTS -> CTS
#
#
# Der geschlossene Reed-Kontakt erzeugt ein loop-back-Kabel
# Alles, was an /dev/ttySx geschickt wird, kommt wieder zurück.
# Ist der Kontakt geöffnet, kommt nichts zurück.
# --------------------------------------------------------------
initialise ()
{
DEVICE="/dev/ttyS0"
BAUDRATE=19200
}
setDevice ()
{
# ############################
# moserial (Terminal-Programm)
#
# der loop back test mit moserial :
# funktioniert wenn: : stty option
# -------------------------------------------------------
# soft- noch hardware handshake aus : -crtscts
# modus read/write : cread (?)
# kein lokales echo : -echo
#
# Schnittstellen-Settings auslesen:
# Wenn moserial läuft, liefert ein gleichzeitiges "stty -F /dev/ttyS0 -a" in einem Terminal:
#
# speed 19200 baud; rows 0; columns 0; line = 0;
# intr = <undef>; quit = <undef>; erase = <undef>; kill = <undef>; eof = <undef>; eol = <undef>; eol2 = <undef>;
# swtch = <undef>;
# start = <undef>; stop = <undef>; susp = <undef>; rprnt = <undef>; werase = <undef>; lnext = <undef>; discard = <undef>;
# min = 1; time = 1;
# -parenb -parodd -cmspar cs8 -hupcl -cstopb cread clocal -crtscts
# ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff -iuclc -ixany -imaxbel -iutf8
# -opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
# -isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt -echoctl -echoke -flusho -extproc
#
# daraus wird das folgende Kommando abgeleitet:
stty -F $DEVICE $BAUDRATE -parenb -parodd -cmspar cs8 -hupcl -cstopb cread clocal -crtscts \
ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff -iuclc -ixany \
-imaxbel -iutf8 -opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 \
ff0 -isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt -echoctl \
-echoke -flusho -extproc
}
# Lesen im Hintergrund
# https://unix.stackexchange.com/questions/22545/how-to-connect-to-a-serial-port-as-simple-as-using-ssh
# leicht modifiziert
bg ()
{
echo "bg()"
echo "zum Beenden: CTRL-C"
# Let cat read the device in the background
cat $DEVICE & bgPid=$!
# Read commands from user, send them to device
while read cmd; do
echo $cmd
done > $DEVICE
# Terminate background read process
kill $bgPid
}
# in einer Zeile
# https://unix.stackexchange.com/questions/117037/how-to-send-data-to-a-serial-port-and-see-any-answer
eineZeile ()
{
echo "eineZeile()"
echo "zum Beenden: CTRL-C"
cat $DEVICE & cat > $DEVICE
}
# ################################
echo "Start"
initialise
setDevice
# eine der beiden folgenden Zeilen auskommentieren
#bg # funktioniert nur im Terminal mit Tastatureingaben
eineZeile # funktioniert nur im Terminal mit Tastatureingaben
echo "Ende"
Das Skript zeigt mir bisher nur, dass mein Kabel funktioniert. Ich habe es bisher nicht geschafft, durch das Skript etwas auf /dev/ttyS0 schreiben und wieder lesen zu lassen, um nach Vergleich und Gleichheit das weitere Programm zu steuern. Siehe folgenden Pseudo-Code:
Code:
Pseudo-Code
raus="A"
rein="B"
reed="x"
echo $raus > /dev/ttyS0
rein=cat /dev/ttyS0
if $raus=$rein
reed="geschlossen"
else
reed="offen"
fi
Wie bekomme ich die Ein- und Ausgaben im Shell-Skript, oben ( bg() oder eineZeile() ), so umgeleitet, dass es so funktioniert, wie im Pseudo-Code angedeutet?
Danke für Tipps!
Gruß,
radiergummi