Hallo zusammen,
ich habe ein Problem bei dem ich nicht weiterkomme.
Ich habe an meinem RaspberryPi3 über ein USB-to-serial Kabel meinen AV-Receiver verbunden.
Nun erstelle ich in einem bash-Skript über "screen" eine Verbindung auf die serielle Konsole des AV-Receivers, um Befehle dorthin zu senden.
Das funktioniert ($stuffstuff ist der Befehl, den ich sende):
/usr/bin/screen -dmS AVR2807 /dev/avr2807 9600
/usr/bin/screen -S AVR2807 -X stuff $stuffstuff
/usr/bin/screen -S AVR2807 -X kill
Nun würde ich allerdings gerne die Antwort meines AV-Receivers in meiner Konsole ausgeben, damit ich sie weiterverarbeiten kann.
Da das irgendwie nicht einfach zu gehen scheint, habe ich den Umweg über ein logfike genommen, d.h. 'screen' mitloggen lassen, die logdatei dann auslesen und auf der Konsole ausgeben:
echo "logfile avrcom.log" > avrcom.screenrc
/usr/bin/screen -c avrcom.screenrc -dmLS AVR2807 /dev/avr2807 9600
/usr/bin/screen -S AVR2807 -X stuff $stuffstuff
rm avrcom.screenrc
sed 's/\r/\n/g' avrcom.log
rm avrcom.log
Das Problem ist aber, dass die Datei offensichtlich nicht schnell genug beschrieben wird. Jedenfalls kam meist keine Ausgabe und oft wurde die Datei danach auch nicht gelöscht. Allerdings funktioniert es, wenn die avrcom.log schon vorher besteht, er gibt mir aber dann den alten Wert aus, der schon im logfile stand. Deshalb habe ich vor dem 'sed' eine Warteschleife eingebaut:
Hilft aber nix.
Hat jemand einen Tip?! Danke!
Apollon.
P.S.: Hier das ganze Skript:
Display Spoiler
#! /bin/sh
# /usr/bin/avrcom
port=/dev/avr2807
device="AVR2807"
screenrc="/usr/bin/avrcom.screenrc"
logfile="/usr/bin/avrcom.log"
stuffstuff="$2\r"
timeout=5
#touch /var/lock/$device
case "$1" in
start)
if [ "$2" = "log" ]; then
echo "Starting serial connection to $device ..."
echo "Logging to $logfile ..."
echo "logfile $logfile" > $screenrc
/usr/bin/screen -c $screenrc -dmLS $device $port 9600
rm $screenrc
else
echo "Starting serial connection to $device ..."
/usr/bin/screen -dmS $device $port 9600
fi
;;
stop)
echo "Stopping serial connection to $device ..."
/usr/bin/screen -S $device -X kill
if [ "$2" = "keeplog" ]; then
if [ -f $logfile ]; then
echo "Keeping logfile $logfile ..."
else
echo "No logfile to keep ..."
fi
else
if [ -f $logfile ]; then
echo "Deleting Logfile $logfile ..."
rm $logfile
else
echo "No logfile to delete ..."
fi
fi
;;
restart)
echo "Restarting serial connection to $device ..."
/usr/bin/screen -S $device -X kill
/usr/bin/screen -dmS $device $port 9600
;;
send)
if [ -n "$2" ]; then
#echo "Sending $2..."
/usr/bin/screen -S $device -X stuff $stuffstuff
else
echo "Usage: $0 $1 {command}"
fi
;;
cmd)
if [ -n "$2" ]; then
if [ "$3" = "log" ]; then
echo "logfile $logfile" > $screenrc
#sleep 1
/usr/bin/screen -c $screenrc -dmLS $device $port 9600
/usr/bin/screen -S $device -X stuff $stuffstuff
rm $screenrc
#sleep 1
#echo "" > /dev/null
for i in `seq 1 $timeout`; do
if [ -s $logfile ]; then
#echo "Unterbrochen"
break
fi
sleep 1
echo $i
done
sed 's/\r/\n/g' $logfile > /dev/stdout
#echo $output
#rm $screenrc
#echo "" > /dev/null
#sleep 1
rm $logfile
else
/usr/bin/screen -dmS $device $port 9600
/usr/bin/screen -S $device -X stuff $stuffstuff
fi
/usr/bin/screen -S $device -X kill
else
echo "Usage: $0 $1 {command} (log)"
fi
;;
killall)
PID=`ps xa | grep $device | awk '{ print $1 }'`
kill $PID 2>>/dev/null
echo "Killed the following processes: $PID"
if [ -f $logfile ]; then
echo "$logfile deleted."
rm $logfile
fi
if [ -f $screenrc ]; then
echo "$screenrc deleted."
rm $screenrc
fi
;;
*)
echo "Usage: $0 {start (log) | stop (keeplog) | restart | send command | cmd command (log) | killall}"
exit 1
;;
esac
exit 0