
Ich habe eine Reihe von Programmen geschrieben, mit denen ich mithilfe eines Funksenders/-empfängers (NRF24L01) zwei Geräte so verbinden möchte, als wären sie über eine serielle Schnittstelle verbunden.
Derzeit kann ich Bash-Befehle in eine Richtung senden, sagen wir von Gerät A zu B. Mein Gerät A ist derzeit ein AVR-Mikrocontroller.
Mein B-Gerät ist ein Rapberry Pi. Ich verwende den folgenden Befehl, um den empfangenen Text an Bash weiterzuleiten. Dadurch können Befehle gesendet werden, ihre Ausgabe kann jedoch nicht an das A-Gerät zurückgesendet werden.
./program | bash
Ich bin nicht sicher, wie ich die Ausgabe von Bash so in mein Programm zurückleiten kann, dass sie nicht blockiert wird und das Programm nicht daran gehindert wird, auf empfangene Daten zu reagieren. Auch wenn es möglich ist, eine Pipe in beide Richtungen einzurichten, glaube ich trotzdem nicht, dass ich Funktionen wie diese verwenden kann, fgets
da sie blockieren.
Beide Geräte nutzen die gleiche Bibliothek für Sende- und Empfangsfunktionen. Diese Sende- und Empfangsfunktionen können mit der Option aufgerufen werden, sie blockierungsfrei zu machen.
Antwort1
Der einfachste Ansatz besteht wahrscheinlich darin, Ihr Programm so zu konfigurieren,pipe2
dreimal, um drei Pipes zu erstellen (für jeweils stdin, stdout und stderr). Wahrscheinlich möchten Sie sie im nicht blockierenden Modus. Dann forken Sie und lassen Sie das Kind verwendendup2
um die Pipes in die Dateideskriptoren 0, 1 und 2 zu setzen. Das Kind verwendet dann einen derExec-Familielaufen bash
.
Der Elternteil kann dannselect
um zu bestimmen, wann Daten zum Lesen oder Speicherplatz zum Schreiben vorhanden sind.
Wahrscheinlich gibt es Bibliotheken oder vorhandene Implementierungen, die Sie nutzen könnten.
Hinweis Nr. 1: pipe2
Gibt zwei Dateideskriptoren zurück, einen für die Leseseite und einen für die Schreibseite der Pipe. Für Bashs Standardeingabe beispielsweise benötigt Bash die Leseseite (um die Eingabe zu lesen) und Ihr Programm die Schreibseite (um die Eingabe von Bash zu schreiben). Bashs Standardausgabe wäre das Gegenteil: Bash benötigt die Schreibseite, Ihr Programm benötigt die Leseseite.
Hinweis Nr. 2: Dies bietet Ihnen keine vollständige Terminalerfahrung. Dafür müssten Sie sich mit ptys befassen, was die Komplexität erheblich erhöht (und ehrlich gesagt müsste ich das nachschlagen). Wenn Sie das möchten, empfehle ich Ihnen auf jeden Fall, nach einem ähnlichen Programm zu suchen, mit dem Sie beginnen können.