webentwicklung-frage-antwort-db.com.de

Linux Serial Port Listener und Interpreter?

Ich verwende ein serielles Gerät für ein Projekt, und was ich auf der PC-Seite erreichen möchte, ist, auf einen Befehl zu warten, der vom seriellen Gerät gesendet wird, die Abfrage zu interpretieren, einen Code abhängig von der Abfrage auszuführen und das Ergebnis zurückzusenden .

Um ehrlich zu sein, habe ich versucht, PHP als Listener zu verwenden, und es funktioniert. Leider lädt die Endlosschleife, die erforderlich ist, damit das Skript als Empfänger fungiert, die CPU auf 25%. Es ist also nicht wirklich die beste Option.

Ich benutze gerade cygwin und möchte ein Bash-Skript mit nativen Linux-Befehlen erstellen.

Ich kann Daten empfangen mit:

cat /dev/ttyS2

Und senden Sie eine Antwort mit:

echo "command to send" > /dev/ttyS2

Meine Frage ist, wie mache ich einen automatisierten Listener, um Daten empfangen und senden zu können? Das Hauptproblem ist, wie ich den Befehl cat/dev/ttyS2 stoppe, sobald Informationen empfangen wurden, und sie in eine Variable lege, die ich dann mit einem Schalter oder einer Reihe von Blöcken vergleichen kann, wenn sonst . Senden Sie anschließend eine Antwort zurück und starten Sie den Zyklus erneut?

Vielen Dank

9
Matt

Ist das nicht das, wonach du suchst?

while read -r line < /dev/ttyS2; do
  # $line is the line read, do something with it
  echo $result > /dev/ttyS2
done
10
rici

Verwenden Sie eine plattformübergreifende Programmiersprache wie Python , verwenden Sie eine plattformübergreifende serielle Bibliothek wie pySerial , und führen Sie die Verarbeitung in einem Skript durch, um weitgehend systemunabhängig zu bleiben. Ich habe pySerial verwendet und konnte das Skript plattformübergreifend ohne Änderungen im Quellcode ausführen. Durch die Verwendung von BASH beschränken Sie sich ein wenig.

1
Aniket Inge

Wenn Sie die richtigen Tools verwenden, ist es möglich, dass Ihre CPU-Auslastung exakt 0 ist, wenn Ihr Gerät keine Ausgabe hat.

Um dies zu erreichen, sollten Sie eine höhere Sprache verwenden (Perl, Python, C/C++ würde dies tun, aber nicht bash) und die Select-Schleife über dem Datei-Handle Ihres seriellen Geräts verwenden. Dies ist ein Beispiel für Perl http://perldoc.Perl.org/IO/Select.html , aber Sie können jede andere Sprache verwenden, sofern sie select () syscall unterstützt.

0
mvp