next up previous contents index
Next: Systeminfo/Systemsteuerung Up: L3 Referenzhandbuch Previous: Managertasks

Kommunikation mit Terminals

Einführung

Um mit einem Benutzer zu kommunizieren, also Eingaben zu empfangen oder Ausgaben zu machen, muß eine Task an ein Terminal gekoppelt sein. Ein Terminal im Sinne von L3 ist eine Tastatur und ein Bildschirm, gleichgültig, ob »fest eingebaut« wie die CONSOLE oder über serielle Schnittstelle angeschlossen. Im System wird ein Terminal durch eine Terminaltask repräsentiert, die drei Sohntasks hat. Eine dieser Sohntasks ist das Terminalmenü, die anderen beiden sind Manager für Tastatur und Bildschirm. Den Ausgangspunkt aller Zuordnungen eines Terminals an irgendwelche Tasks bildet die »Menütask«, die das Terminalmenü ausgibt. Diese Task, die ja aus Benutzersicht das Terminal darstellt, heißt für die CONSOLE CONSOLE.term, für weitere Terminals dementsprechend ??.term.

Tastatur- und Bildschirmmanager sind im Grundzustand des Systems mit »ihrer« Menütask gekoppelt. Von dieser Task wird das Terminal an andere Tasks gekoppelt. »Eine Task an ein Terminal koppeln« bedeutet demzufolge, daß eine Zuordnung vorgenommen wird, die zur Folge hat, daß eine Task Botschaften vom Tastaturmanager erhält und Botschaften an den Bildschirmmanager absetzt. Die Regelung der Zuordnung von Terminals zu Tasks obliegt der Task SYSIO.

Ein Beschreibung der Botschaften zwischen Tasks und SYSIO findet sich in Kap.13.7.

Ausschnitt aus taskinfo(2):

SYSIO...........................    0:08:04   1    wait   - 
    T 2.........................    0:00:02   1    wait   - 
        T 2.term................    0:00:00   1    wait   "T 2" 
        T 2.kbd.................    0:00:00   1    wait   - 
        T 2.dsp.................    0:00:01   1    wait   - 
    CONSOLE.....................    0:04:39   1    wait   - 
        CONSOLE.term............    0:01:32   1    wait   - 
        CONSOLE.kbd.............    0:01:32   1    wait   - 
        CONSOLE.dsp.............    0:15:48   1    wait   -

SYSIO führt für jedes Terminal einen Terminalstack, auf dem zunächst nur die Terminaltask eingetragen ist. Von der Terminaltask CONSOLE kommt nun ein Auftrag an SYSIO das Terminal an die Task OPERATOR zu koppeln, von der Terminaltask T 2 der Auftrag Pascal 5.5 anzukoppeln, von dort der Auftrag die Task PRINTER anzukoppeln (link(printer)). Intern stellt sich der Zustand der Taskstacks in SYSIO dann so dar:

tabular8278

Offensichtlich ist nach Abkoppeln von OPERATOR wieder die Terminaltask CONSOLE am Bildschirm sichtbar, nach Abkoppeln von PRINTER die Task PASCAL 5.5.

Das Erzeugen und Ankoppeln von Task kann durch Passworte überwacht werden. Da Tasks autonom sind und das Passwort in der Task aufbewahrt wird, ist dieser Mechanismus hart. Wenn eine Task durch ein Passwort vor dem Ankoppeln geschützt ist, läßt sich diese Task so lange nicht zum Dialog ankoppeln, bis ihr das korrekte Passwort eingegeben wurde. Wenn das Passwort richtig eingegeben wurde, wird die Task angekoppelt. Solange sie im Terminalstack des zugeordneten Terminals steht, ist keine erneute Eingabe des Passworts nötig. Es ist also durchaus möglich per HotKey via Terminalmenü in eine andere Task zu wechseln und anschließend wieder in die geschützte Task zurückzukehren, ohne sich erneut zu identifizieren.

Die Zuordnung von Tasks und Terminals bleibt auch über Systemabschaltungen hinweg bestehen. Um zu verhindern, daß mit Passwort geschützte Terminals nach Neustart des Systems (noch) einem Terminal zugeordnet sind, kann durch die Prozedur auto unlink erzwungen werden, daß die Task beim Neustart des Systems auf jeden Fall abgekoppelt ist.

Prozeduren

tabular8288

link

PROC link (TASK CONST task)

Wirkung: Es wird versucht, die angegebene Task an das Terminal zu koppeln. Die aufrufende Task bleibt im Terminalstack des Terminals. Falls die Task, in der link versucht wird, nicht on line ist, passiert nichts.

PROC link

Wirkung: Die Terminaltask wird angekoppelt, ohne die aufrufende Task aus dem Terminalstack zu nehmen.

on line

BOOL PROC on line (TASK CONST task)

Wirkung: Liefert 'TRUE', falls 'task' an der Spitze eines Terminalstacks steht.

BOOL PROC on line

Wirkung: Wie on line (myself).

unlink

PROC unlink

Wirkung: Die aufrufende Task koppelt sich vom Terminal ab.

terminal info

PROC terminal info

Wirkung: In einer temporären Datei wird der aktuelle Stand des Terminalstacks ausgegeben.

terminal task

TASK PROC terminal task (TASK CONST task)

Wirkung: Liefert die Terminaltask in deren Terminalstack 'task' enthalten ist. Es spielt dabei keine Rolle, ob 'task' an der Spitze des Stack steht (on line ist). Falls 'task' keinem Terminal zugeordnet ist, wird niltask geliefert.

auto unlink

PROC auto unlink (BOOL CONST op):

Wirkung: Tasks, in denen diese Option angewählt ist, werden bei einem Neustart des Systems (normales Starten nach shutup oder Rückfall auf Fixpunkt (RERUN)) aus dem Terminalstack entfernt. Auf diese Weise kann erzwungen werden, daß z.B. geschützte Tasks bei Neustart grundsätzlich abgekoppelt sind, so daß eine erneute Passworteingabe nötig wird, um in ihnen zu arbeiten.

Die Voreinstellung für alle Tasks ist auto unlink (FALSE).

BOOL PROC auto unlink (TASK CONST task)

Wirkung: Liefert die Einstellung in der Task 'task'.

BOOL PROC auto unlink

Wirkung: Wie auto unlink (myself)

max number terminals

INT PROC max number terminals

Wirkung: Liefert die Anzahl von Arbeitsplätzen, die höchstens für das System konfiguriert werden können. Der Wert ist auf der ersten Systemdiskette eingestellt. Er ist verschlüsselt abgespeichert, so daß eine Änderung der Einstellung nur durch eine passend verschlüsselte und damit lizensierte Systemdiskette 1 vorgenommen werden kann. Der Wert ist natürlich unabhängig von der Anzahl der eingebauten seriellen Schnittstellen oder dergleichen.

terminal inquiery

PROC terminal inquiery (INT CONST timeout)

Wirkung: Die Task wartet 'timeout' Millisekunden darauf, von SYSIO ein Terminal zu erhalten. Auf diese Weise kann auch erzwungen werden, daß die Task an das Terminal gekoppelt bleibt.

PROC terminal inquiery

Wirkung: wie terminal inquiery (0).
Beispiel:
PACKET inq beispiel DEFINES bsp: 
 
PROC bsp: 
INT VAR i; 
FOR i FROM 1 UPTO 10 
    REP create (hex(i), dir) PER; 
{ Die Prozedur macht irgendwas } 
    terminal inquiry (never) 
{ wartet dann auf ein Terminal } 
 
FOR i FROM 10 UPTO 15 
    REP putline(hex(i)) PER; 
    { und dann macht sie was im dialog } 
 
monitor; 
END PROC bsp; 
END PACKET inq beispiel; 
 
{.. so sieht das in der aufrufenden Task aus, } 
{ nachdem 'bsp' insertiert wurde              } 
TASK VAR t; 
 
putline ("jetzt das begin"); 
begin ("son task 1", PROC bsp, t); 
{ start, Sohntask legt Verzeichnisse an } 
 
terminal inquiry ; { ich will erstmal am Terminal bleiben  } 
 
putline ("Sohntask angelegt..."); 
TEXT VAR tx  := "......................" ; 
editget (tx);  { Die Vatertask bleibt am Terminal } 
 
link (/"son task 1");   { jetzt Sohntask ankoppeln und } 
unlink;                 { selbst aus Terminalstack raus }
begin password

PROC begin password

Wirkung: Es wird ein Passwortdialog geführt. Falls bereits ein Passwort gesetzt ist, wird dieses zunächst abgefragt. Das neue Passwort muß zweimal eingegeben werden. Es wird anschließend immer dann abgefragt, wenn eine neue Task als Nachkomme der Task, in der dieser Dialog geführt wurde, eingerichtet werden soll. Desweiteren ist dieses Passwort direkt task password für die neu eingerichtete Task.

begin password (TEXT CONST old, new)

Wirkung: Ändern oder Überprüfen des eingestellten Passworts.

task password

PROC task password

Wirkung: Es wird ein Passwortdialog geführt. Das neue Passwort muß zweimal eingegeben werden. Es wird anschließend immer dann abgefragt, wenn die Task an ein Terminal gekoppelt werden soll.

task password (TEXT CONST old, new)

Wirkung: Ändern oder Überprüfen des eingestellten Passworts.

Meldungen auf dem Bildschirm

Gerade für Aufgaben der Systemverwaltung ist es zweckmäßig, allen oder einzelnen Benutzern des Systems Nachrichten zukommen lassen zu können. terminal broadcast bietet die Möglichkeit einzelnen Tasks oder allen Benutzern Texte zu schicken, die temporär in einem passenden Fenster über dem aktuellen Bildschirminhalt ausgegeben werden. Durch Drücken der ESC Taste kann der Benutzer die Nachricht nach Durchlesen verschwinden lassen. Der Empfang solcher Nachrichten läßt sich pro Terminal einstellen. In der Voreinstellung sind für alle Terminals »die Nachrichten eingeschaltet«. Durch die Hotkey Tastenkombination:

Shift STRG ALT b Broadcast Ein/Ausschalten

läßt sich für jeden Arbeitsplatz einstellen, ob Nachrichten angezeigt werden sollen oder nicht. Falls der Empfang abgeschaltet ist, wird das im Terminalmenü angezeigt.

terminal broadcast

PROC terminal broadcast (TEXT CONST message, TASK CONST recv, INT CONST timeout)

Wirkung: Die Nachricht 'message' wird in einem passenden Fenster auf dem Bildschirm ausgegeben, wenn die Task 'recv' an ein Terminal gekoppelt ist oder innerhalb des 'timeout' angekoppelt wird.

PROC terminal broadcast (TEXT CONST message)

Wirkung: Die Nachricht 'message' wird an alle Terminals gesendet. SYSIO stellt für jedes Terminal fest, welche Task angekoppelt ist, und stellt dieser Task die Nachricht zu.

terminal menu

PROC terminal menu

Wirkung: Startprozedur für das Terminalmenü einer Terminaltask. Siehe unten.

setup terminal

PROC setup terminal (TEXT CONST terminal name)

Wirkung: Das Terminal 'terminal name' wird neu gestartet. Es werden neue Manager für Tastatur und Bildschirm mit den in configurator eingestellten Tabellen gestartet und eine Menütask mit der Prozedur terminal menu gestartet. Das Terminal 'terminal name' muß noch nicht existieren (deshalb hat die Prozeduren eine Text- statt des naheliegenden Taskparameters).
Bemerkung: Falls die Prozedur terminal menu in configurator überinsertiert wurde, wird selbstverständlich diese nachinsertierte Prozedur gestartet.

Behandlung des Terminalstacks

Es kann auch von Interesse sein, innerhalb eigener Programme Informationen über eine Terminaltask zu erhalten. Falls es beispielsweise nötig ist, dem Benutzer eines bestimmten Terminals eine Mitteilung zu senden, so muß zunächst klar sein, welche Task an der Spitze des zu diesem Terminal gehörigen Terminalstacks steht, um dann per terminal broadcast die Mitteilung an genau diese Task zu senden.

Der Inhalt eines Terminalstacks wird in Datenobjekte des Typs TASKARRAY verwaltet. Ein TASKARRAY ist eine Folge von TaskIDs (interne Taskbezeichner), die dynamisch verwaltet wird. Zu diesem Zweck ist die interne Repräsentation nicht ROW xy TASK, sondern TEXT. Dieses ELAN Packet TASKARRAY ist auf der Diskette mit ELAN Beispielprogramme enthalten und sei jedem ELAN Interessenten wärmstens empfohlen. Es ist nichttrivial, kurz und zeigt bestens, wie man unter L3 mit ELAN programmiert.

TASKARRAY

TYP TASKARRAY

Wirkung: Datentyp für den Inhalt der Terminaltaskstacks.

get terminal stack

PROC get terminal stack (TASK CONST terminal, TASKARRAY VAR tarray)

Wirkung: Der aktuelle Taskstack der Terminaltask 'terminal'wird in die Variable 'tarray' geschrieben. Das oberste Element des Stacks liegt an letzter Stelle des TASKARRAYs.
Beispiel:
TASKARRAY VAR terminal stack; 
TASK PROC terminal top (TASK CONST terminal) : 
    get terminal stack (terminal, terminal stack); 
    terminal stack SUB LENGTH terminal stack 
END PROC terminal top; 
 
put (name (terminal top (task ("CONSOLE"))));
Bemerkung: Der Operator SUB liefert das ite Element eines Taskarray, LENGTH die Länge des ARRAYs, also die Anzahl der Elemente. tarray SUB »letztes Element« liefert also gerade die Task an der Spitze des Taskstacks. name (task) schließlich liefert den Tasknamen.

Modifikation des Terminalmenüs

Das Terminalmenü stellt die äußerste Schicht des laufenden L3 Systems dar. Es wird durch die Menütask ausgegeben und kontrolliert. Diese Task ist im Normalfall Brudertask zu den Managern für Tastatur und Bildschirm. Um ein anderes Terminalmenü zu erhalten, muß das standardmäßig angebotene entweder ersetzt oder überlagert werden.

Eine vollständige Ersetzung des Menüs kann dadurch erreicht werden, daß in der Task configurator eine Prozedur terminal menu insertiert wird. Wenn im configurator eine modifizierte Prozedur terminal menu insertiert ist, werden anschließend alle neuinstallierten Terminals mit diesem neuen Menü gestartet. Dieses Vorgehen erfordert eine Ersetzung der Task configurator. Die dazu nötigen Aktionen sind am Ende dieses Abschnitts beschrieben.

Eine Alternative zu diesem Eingriff ins System ist die Erzeugung von Tasks mit modifiziertem Menü und die Zuordnung dieser Task als Menütask für ausgewählte Terminals. Zur Programmierung des Terminalmenüs sei an dieser Stelle auf das Standardmenü verwiesen, das auf der Diskette mit ELAN Beispielprogrammen enthalten ist.

Um den Terminaltasks neue Terminalmenüs zuzuordnen, sollte man im Systemzweig eine Task einrichten, unter der für alle Arbeitsplätze, denen ein neues Menü zugeordnet werden soll, eine neue Menütask erzeugt wird. Diese Tasks werden dann dem jeweiligen Arbeitsplatz als neue Menütask zugeordnet, indem ein dementsprechender Auftrag an die Terminaltask geschickt wird. Im nachfolgenden Beispiel sei die Ausgangslage, daß in einer eigens dafür erzeugten Task im Systemzweig eine passend gestaltete Prozedur special terminal menu insertiert wurde. Um die Terminaltask oli 1 mit diesem neuen Menü zu starten, sind folgende Aktionen nötig:

Beispiel:
PACKET change terminal menu DEFINES 
                          change terminal menu : 
 
LET terminal menu code = 0x 06 00 00 11; 
 
PROC change terminal menu (TASK CONST terminal) : 
 
  TASK VAR menu; 
 
  IF exists (terminal) 
     THEN begin new terminal menu; 
          send new terminal menu; 
     ELSE errorstop ("Terminal existiert nicht"); 
  FI; 
 
  . begin new terminal menu : 
    IF exists task (menu name) 
       THEN end (task (menu name), quiet) 
    FI; 
    begin (menu name, PROC special terminal menu, menu); 
 
  . menu name : name (terminal) + ".menu" 
 
  . send new terminal menu : 
    INT VAR reply; 
    new msg; 
    put msg (terminal menu code); 
    put msg (menu); 
    call manager (terminal, reply); 
 
END PROC change terminal menu; 
 
 
PROC special terminal menu : 
 
     new menue 
        { eigenes Terminalmenü } 
END PROC special terminal menu; 
 
END PACKET change terminal menu; 
 
change terminal menu (task ("oli 1"));
Auch die Option ein derart modifiziertes Terminal neu zu starten, sollte an die veränderten Gegebenheiten angepaßt werden. Da ein modifiziertes Terminalmenü wahrscheinlich dazu dient, den »freien« Umgang der Benutzer mit dem System unnötig zu machen, sollte auch die Möglichkeit, ein hängengebliebenes Terminal neu zu starten, für die Benutzer verpackt werden. Der Kern einer solchen Leistung könnte (in der Vatertask des selbstgebauten »Menüzweiges«) so aussehen:

Beispiel:
set up terminal ("oli 1"); 
    { starten } 
change terminal menu (task ("oli 1")); 
    { eigenes Menü installieren }

Austausch der Task configurator

Um das Terminalmenü auszutauschen, kann auch eine passende Task configurator, in der ein selbstgestaltetes Terminalmenü insertiert ist, in das System gebracht werden. Dazu muß zunächst eine neue Task als Sohntask von UTILITIES begonnen werden. In dieser neuen Task wird dann das neue Terminalmenü insertiert. Bei dieser Vorgehensweise muß diese neue Prozedur terminal menu heißen. Anschließend müssen alle Datenräume (Tastaturtabellen etc.) aus der Task configurator in die neue Task geholt werden. Anschließend wird die alte Task configurator gelöscht un in der neuen Task die Prozedur configuration manager aufgerufen. Diese benennt die Task in configurator um und startet das gewohnte Menü. Bei Benutzung des ersten Menüpunkts terminal installieren wird für das neue Terminal das eigene, neue Terminalmenü gestartet.

Beispiel:
begin ("conf", /"UTILITIES"); 
 
insert ("new terminal menu"); 
  { die Datei enthält ein ELAN Packet, das eine neue 
    Prozedur 'terminal menu' definiert } 
 
fetchall (/"configurator"); 
  { Der configurator ist ein 'configuration manager'. 
    Im Systemzweig kann man deshalb seine Managerfunktionen 
    benutzen. } 
 
end (/"configurator"); 
  { Da die neue Task 'conf' als Sohntask von UTILITIES 
    Systemprivileg hat, kann man beliebige Tasks löschen. 
 
configuration manager; 
  { Die Task, die nun alle benötigten Tabellen enthält, 
    wird zum neuen configurator }

Treiber

Einführung

Zum Betrieb von Modems, Druckern oder anderen Geräten, die über parallele oder serielle Schnittstelle an das L3 System angeschlossen werden sollen, gibt es Prozeduren zur Entwicklung eigener Treiberroutinen. Die Benutzung dieser Routinen erspart die »Low Level Programmierung« auf GDP (General Driver Protocol) Ebene.

Eine solche Treiberroutine besteht aus:

Identifikation der Realprozesse

Ein Schnittstellenbaustein mit V24 oder CENTRONICS Ausgang ist im Sinne von L3 ein Gerät. Wie ausführlicher in Kapitel 13 dargestellt ist, werden Geräte in einem L3 Systems durch besondere Tasks bedient. Diese Tasks sind Realprozesse, sie befinden sich permanent im Realspeicher und steuern die ihnen zugeordnete Hardware. Die Treibertasks finden sich im Taskbaum unterhalb der Task SYSHW. Aus historischen Gründen sind die Treiber für parallele Schnittstellen noch im Systemkern enthalten und werden erst in einer kommenden L3 Version als Tasks (= ladbare Treiber) realisiert. Es gibt jedoch Pseudonamen für die erste und zweite parallelen Schnittstelle, so daß sie wie Task angesprochen werden können. Sie lauten 'LPT1' bzw. 'LPT2'.

Für serielle Schnittstellen gibt es zwei ladbare Treiber im System. Für die integrierte serielle Schnittstelle und weitere auf »unintelligenten Karten« eingebauten Schnittstellen, gibt es die Task COM8250, für Schnittstellen auf »intelligenten Karten« von DIGIBOARD tex2html_wrap_inline15155 , gibt es die DIGI Treiber. Da serielle Schnittstellen bidirektional funktionieren, können mit einem Realprozess zwei Pseudonamen assoziiert werden: 'COMx.out' als Ausgabetreibername und 'COMx.in' als Eingabetreibername. 'x' ist dabei die Schnittstellennummer der angesprochenen seriellen Schnittstelle. Falls Ausgabe- und Eingabetreiber auf der ersten seriellen Schnittstelle (COM1) eingerichtet werden sollen, wird COM1 also durch die Pseudonamen 'COM1.out' für den Ausgabetreiber und 'COM1.in' für den Eingabetreiber angesprochen. Entsprechend heißen die Treiber für die Bausteine auf einer intelligenten Karte 'DIGI1.in', 'DIGI1.out' usw.

Zuordnung von Treibern

out driver

PROC out driver(TEXT CONST out driver name)

Wirkung: Der aufrufenden Task wird der mit out driver name spezifizierte Realprozess als Ausgabetreiber zugeordnet. Der Aufruf beinhaltet eine Initialisierung, so daß beim Aufruf der Prozedur open out driver oder beim ersten folgenden Aufruf der Prozedur driver out der Ausgabetreiber geöffnet und, falls es ein V24 Treiber ist, konfiguriert wird.

TEXT PROC out driver

Wirkung: Liefert den Pseudonamen des eingestellten Ausgabetreibers.

in driver

PROC in driver(TEXT CONST in driver name)

Wirkung: Der aufrufenden Task wird der mit in driver name spezifizierte Realprozess als Eingabetreiber zugeordnet. Der Aufruf beinhaltet eine Initialisierung, so daß beim Aufruf der Prozedur open in driver oder beim ersten folgenden Aufruf der Prozedur driver in eine Sohntask als Eingabemanager eingerichtet wird. Dieser Eingabemanager öffnet den Eingabetreiber. Die Konfiguration dieses Treibers muß über den entsprechenden Ausgabetreiber erfolgen.

TEXT PROC in driver

Wirkung: Liefert den Pseudonamen des eingestellten Eingabetreibers.

stream transfer

PROC stream transfer (INT CONST baud, data bits, stop bits, parity)

Wirkung: Setzt den Übertragungsmodus für einen Treiber auf einer seriellen Schnittstelle fest. Beim nächsten Öffnen des eingestellten Ausgabetreibers wird dieser Treiber mit den angegebenen Werten konfiguriert.

Parameter: Einstellbare Werte sind:

Baudrate : 75, 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200

Datenbits: 7 oder 8

Stopbits : 0 , 1 oder 2

Parity : Zur Einstellung der gewünschten Paritybits gibt es folgende Konstanten:

INT CONST no parity
INT CONST odd parity
INT CONST even parity
INT CONST high parity
INT CONST low parity

flow control

PROC dtr dsr flow control (BOOL CONST flag)

Wirkung: 'flag' = TRUE gibt an, daß für den gewählten Ausgabetreiber DTR/DSR Flußkontrolle benötigt wird. Falls die Prozedur vor der Initialisierung durch driver out nicht benutzt wird, wird »keine DTR/DSR Flußkontrolle« eingestellt.

PROC rts cts flow control (BOOL CONST flag)

Wirkung: 'flag' = TRUE gibt an, daß für den gewählten Ausgabetreiber RTS/CTS Flußkontrolle benötigt wird. Falls die Prozedur vor der Initialisierung durch driver out nicht benutzt wird, wird »keine RTS/CTS Flußkontrolle« eingestellt.

PROC xon xoff flow control (BOOL CONST flag)

Wirkung: 'flag' = TRUE gibt an, daß für den gewählten Ausgabetreiber XON/XOFF Flußkontrolle benötigt wird. Falls die Prozedur vor der Initialisierung durch driver out nicht benutzt wird, wird »keine XON/XOFF Flußkontrolle« eingestellt.

Öffnen und Schließen von Treibern

open out driver

PROC open out driver

Wirkung: Der mit out driver eingestellte Ausgabetreiber wird für die Task reserviert und wie eingestellt konfiguriert.

close out driver

PROC close out driver

Wirkung: Der mit out driver eingestellte Ausgabetreiber wird von der Task freigegeben.

open in driver

PROC open in driver

Wirkung: Der mit in driver eingestellte Eingabetreiber wird für die Task reserviert. Dazu wird eine unbenannte Task (Pseudoname -), die als Eingabemanager fungiert, angelegt.

close in driver

PROC close in driver

Wirkung: Der Eingabetreiber wird freigegeben, indem der Eingabemanager gelöscht wird.

Senden/Empfangen

driver out

PROC driver out (TEXT CONST string)

Wirkung: Der Bytesting 'string' wird an den eingestellten Ausgabetreiber geschickt. Falls der Treiber noch nicht konfiguriert ist, wird die Konfigurationsbotschaft vor dem String geschickt.

PROC driver out (TEXT CONST string, INT CONST from)

Wirkung: Wie oben, jedoch wird nur der Teilstring von Position 'from' bis zum Ende von 'string' geschickt.

PROC driver out (TEXT CONST string, INT CONST from, to)

Wirkung: Wie oben, jedoch wird nur der Teilstring von Position 'from' bis zur Position 'to' geschickt.

PROC driver out (TEXT CONST string address,string length)

Wirkung: Angefangen von der Adresse 'string address' werden 'string length' Bytes an den Ausgabetreiber geschickt. Die maximal zulässige Stringlänge beträgt 32 KB.

driver in

PROC driver in (INT CONST timeout, TEXT VAR string)

Wirkung: 'timeout' Millisekunden lang versucht der Inputmanager, einen Bytestring vom Eingabetreiber zu lesen. Wenn 'timeout' abgelaufen ist, ohne daß etwas empfangen wurde, ist die Länge von 'string' 0. Die Größe des Empfangspuffers im Eingabemanager - und somit die maximale Länge für einen in einem Zug zu empfangenden Bytestring - beträgt 4092 Byte. Die Variable 'string' muß im Standarddatenraum liegen. Bei vollem Eingabepuffer vom Eingabetreiber übertragene Botschaften gehen verloren.

PROC driver in (INT CONST timeout, string address, max string length, INT VAR string length)

Wirkung: Wie oben, es wird jedoch explizit die Adresse des Empfangspuffers im eigenen Standarddatenraum angegeben.

Beispiel: Auf der seriellen Schnittstelle 6 (COM6) sollen Daten eines Senders, der mit 9600 Baud, 8 Datenbit, einem Stopbit, even parity und RTS/CTS Protokoll sendet, empfangen und in einer Textdatei protokolliert werden.

FILE VAR file := sequential file (output, "protokoll"); 
 
in driver  ("COM6.in"); 
out driver ("COM6.out"); 
stream transfer  (9600, 8, 1, even parity); 
rts cts flow control (TRUE); 
open out driver ; 
 
TEXT VAR t :=  ""; 
 
REP 
   driver in (1000,  t) ; 
   IF t <> "" THEN putline (t, file); t := ""; FI 
PER;


next up previous contents index
Next: Systeminfo/Systemsteuerung Up: L3 Referenzhandbuch Previous: Managertasks

Michael Hohmuth
Sun Mar 31 04:49:53 MET DST 1996