Bei einer Vollduplex Kommunikation lassen sich Nachrichten zur gleichen Zeit senden und empfangen. Der Propeller nutzt in seiner Voreinstellung nur das sogenannte Halbduplex-Verfahren mit dem SimpleIDE Terminal; es lässt sich aber in ein Vollduplex-System umwandeln. Im folgenden Beispiel wird gezeigt, wie eine Vollduplex-Kommunikation mit XBees und mit dem SimpleIDE Terminal aufgebaut werden kann.
Bevor es losgeht, muss sichergestellt werden, dass der Propeller Chip kein Signal an den DO Ausgangspin auf dem Activity Board sendet. Wird von einem Modul ein HIGH-Signal und von dem anderen zur gleichen Zeit ein LOW-Signal gesendet, kann dies zur Zerstörung des I/O Pins am Propeller oder am XBee führen. Deshalb wird zu Beginn ein kurzes Programm gestartet, das diese Situation entschärft.
Das Programm xbee_vorbereitung.c
Nach diesem Vorbereitungsschritt kann jetzt mit dem Aufbau der Testschaltung begonnen werden.
XBee Testprogramm | |
Material |
|
Aufgaben |
|
Das Testprogramm ist ein Schleifenprogramm, das nichts anderes tut, als eine gesendete Nachricht auch wieder zu empfangen. Nachdem das SimpleIDE Terminal über die Baudrate so eingestellt ist, dass es mit dem XBee Adapter kommunizieren kann, lassen sich Zeichen über die Tastatur an den XBee auf dem Adapter übertragen. Dieser XBee strahlt das Zeichen per Funk ab. Der XBee auf dem Propeller Board empfängt das Zeichen und überträgt es als serielle Nachricht an den Propeller Controller. Das Programm XBee_Testprogramm.c sendet den Text "Du hast eingegeben: " und das eingegebene Zeichen zurück an den XBee auf dem Prop-BoE, der es dann per Funk an den XBee auf dem Adapter überträgt. Der XBee auf dem Adapter erhält die Nachricht, sendet sie an den PC, die dieser dann im SimpleIDE Terminal anzeigt.
XBee Testprogramm | |
Aufgaben |
|
Terminalausgabe
Das Programm xbee_testprogramm.c
Wenn das Programm verändert und dann neu gestartet werden soll, gehe wie folgt vor:
Wie arbeitet das Programm XBee_Testprogramm.c?
Die Bibliothek, die den Voll-Duplex-Betrieb unterstützt, heißt fdserial. Mit
#include "fdserial.h"
werden alle Funktionen daraus für die neue Anwendung zugänglich.
fdserial *xbee
richtet eine Voll-Duplex-Gerätekennung ein. Im Hauptprogramm main() werden mit
xbee = fdserial_open(9, 8, 0, 9600)
alle Parameter der seriellen Verbindung festgelegt. Über P9 werden in diesem Fall die Nachrichten empfangen und über P8 gesendet. Der Modus ist auf 0 gesetzt und die Baudrate auf 9600 Bits pro Sekunde. Die Funktion
fdserial_open
liefert eine Speicheradresse an die Pointervariable xbee. Damit kann xbee zur Gerätekennung von jeder fdserial Funktion mit fdserial *term Parametern wie auch jeder simpletext Funktion mit fdserial *term Parametern benutzt werden. Das ist sinnvoll, da mit einem Propeller mehrere Voll-Duplex Geräte verbunden sein können. Mit der Gerätekennung wird Funktionen wie dprint und fdserial_rxChar mitgeteilt, mit welchem Gerät sie in Verbindung treten sollen. Deshalb taucht xbee in den Funktionen
dbprint(xbee, " , \n") und
c = fdserial_rxChar(xbee)
auf.
Wie beim seriellen Halb-Duplex-Verfahren lassen sich Voll-Duplex-Gerätekennungen auch mit dprint verwenden. Damit lassen sich dann auch Formatierungsanweisungen übertragen, die ähnlich sind wie im print-Befehl im SimpleIDE Terminal. Der Befehl
dprint(xbee, "Klicke in das Terminalfenster, \n")
überträgt die Mitteilung und einen Zeilenvorschub durch die Zeichenfolge \n. Für die Zahlendarstellung von ganzen Zahlenwerten kann das Formatierungszeichen %d und für Fließkommazahlen %f (floating point) benutzt werden.
Die Bibliothek fdserial führt den Programmcode in einem zugeschalteten Cog aus, der übertragene Bytes in einem Pufferfeld sammelt. Ist dieses leer, dann sendet die Funktion fdserial_rxReady eine -1 zurück. Sind ein oder mehrere Zeichen im Puffer, gibt fdserial_rxReady zuerst das Zeichen aus, das am längsten im Puffer verweilt und verfährt bei den nachfolgenden Zeichen aus dem Puffer auf genau die gleiche Weise, bis die Funktion eine -1 zurückgibt - der Puffer ist leer.
Innerhalb der Endlosschleife (while(1)) enthält die Variable c entweder eine -1 oder das älteste Zeichen aus dem Puffer. Bei einer -1 wird der Programmcode des Entscheidungsblocks (if ...) übersprungen. Enthält c ein Zeichen, dann ist es ungleich -1 und in diesem Fall wird der Programmcode im Entscheidungsblock ausgeführt:
dprint(xbee, "Du hast eingegeben: %c\n",c)
Die Deklaration fdserial *xbee (Programmzeile 7) ist global, da sie vor allen Funktionen steht. Das ist sinnvoll, da damit jede Funktion in der Anwendung XBee Nicknames beim Aufruf von simpletext Funktionen wie dprint und putChar weitergeben kann.
Alle simpletext Funktionen mit einem text_t *device Parameter lassen sich mit einem seriellen Vollduplex Peripheriegerät wie ein XBee-Modul benutzen. Wer sich einen Überblick über alle Funktionen aus der Bibliothek simpletext verschaffen möchte, der kann das aus dem Programm
SimpleIDE über den Aufruf von Help - Simple Library Reference. Unter dem gleichen Aufruf gelangt man auch zur Bibliothek fdserial und den in ihr enthaltenen Funktionen. Der Eingangspuffer der Bibliotheksfunktionen von fdserial ist ein FIFO (first in - first out) Typ. Das zuerst empfangene Byte wird auch als erstes wieder ausgegeben. Dies geschieht über die Funktion fdserial_rxChar(xbee).
Der Mode Parameter in der Funktion fdserial_open erwartet einen Binärwert. Mode 0 in der Programmzeile 11 des Programms Xbee_Testprogramm.c wird sehr häufig eingesetzt; es gibt aber weitere Einstellungen:
Es lassen sich mehrere Eigenschaftenbits gleichzeitig setzen. Werden einlaufende und abgehende Signale invertiert, geschieht das mit der Binärdarstellung 0b0011.