home *** CD-ROM | disk | FTP | other *** search
- .. //////////////////////////////////////////////////////////////////
- .. /// Dokumentation zum Multi-Tasking Subsystem V2.10 / April 1990
- .. /// Modul V24PIPE
- .. /// Format: DOCLIST 1.00-Format
- .. //////////////////////////////////////////////////////////////////
- .. /// Bitte passen Sie die nachfolgenden Zeile ggf. für Ihren
- .. /// Drucker an. Die Voreinstellung paßt auf einen EPSON FX-85
- .. /// mit Papierformat 12"
- .. //////////////////////////////////////////////////////////////////
- .PL 72 Seitenlänge 72 Zeilen
- .LL 80 Zeilenlänge 80 Zeichen
- .ID 5 Einrücken um 5 Zeichen vom linken Rand
- .RM 5 5 Zeichen bis zum rechten Rand Platz lassen -> 70
- .. Zeichen Text je Zeile
- .HS = Zeichen für Kopf-/Fuß-Trenner
- .RS - Zeichen für Trennung von Referenz-Einträgen
- .CO (c) Copyright 1988..1990 Ch.Philipps Software-Technik
- .. //////////////////////////////////////////////////////////////////
- .SE Multi-Tasking Subsystem für Turbo-Pascal 5.x Version 2.10
-
-
-
-
-
-
-
-
- Turbo Pascal 5.x Multi-Tasking Subsystem
-
-
- V24PIPE - Benutzerhandbuch
-
-
-
-
-
-
-
-
- (c) Copyright 1988, 1989, 1990
-
- Christian Philipps Software-Technik
-
- alle Rechte vorbehalten
-
-
- Version 2.10 / April 1990
-
-
-
-
-
-
-
-
-
-
-
-
- Anschrift: Christian Philipps
- Software-Technik
- Düsseldorfer Str. 316
-
- D-4130 Moers 1
-
- Telefon..: 02841 / 35932
- Fido-Netz: 509/3.4
-
- .SE Lizenzvereinbarung, Garantie- und Haftungsausschluß, Warenzeichen
- siehe hierzu CPMULTI.DOK
- .SE V24PIPE / Leistungsbeschreibung
- 1. Leistungsbeschreibung
-
- Die Units V24 und V24Pipe ermöglichen in Kombination den
- Datentransfer von und zur seriellen Schnittstelle Ihres PC mit
- Geschwindigkeiten bis zu 115200 baud.
- Hereinkommende Daten werden interruptgesteuert entgegengenommen.
-
- Die Höchstgeschwindigkeit von 115200 baud konnte auf einem 12 MHz AT
- kompatiblen PC problemlos eingesetzt werden; ein 8 MHz XT
- kompatibler Rechner kam immerhin auf 19200 baud.
-
- Die Verbindung zum Anwendungsprogramm erfolgt über Pipes, wodurch
- die Schnittstelle mit den Pascal-Standardprozeduren Read/ReadLn und
- Write/Writeln bearbeitet werden kann.
-
- Die Unit V24 habe ich auf Basis eines PD-Produktes von Mike
- Halliday, das er damals für Turbo Pascal 3.0 geschrieben hat,
- entwickelt und bereits vor längerer Zeit als Public Domaine
- freigegeben. Sie ist nun zur Basis der Unit V24Pipe geworden und
- somit auch im Lieferumfang des Multi-Tasking Subsystems enthalten.
- Sie ist nach wie vor Public Domaine und steht Ihnen im Quellcode zur
- Verfügung.
-
-
- Hinweis für registrierte Anwender des Multi-Tasking Subsystems
- --------------------------------------------------------------
-
- Bitte beachten Sie, daß für diese Unit gleichfalls die Lizenzver-
- einbarungen gelten, die in der Dokumentation zum Multi-Tasking Sub-
- system aufgeführt sind.
- Insbesondere bedeutet dies, daß Sie die lizenzierte Version dieses
- Produktes, seine Dokumentation und seinen Quellcode unter keinen
- Umständen an Dritte weitergeben dürfen, weder auszugsweise, noch
- vollständig. Diese Unit einschließnlich ihrer Dokumentation ist, wie
- auch CPMulti, in der lizenzierten Version KEINE ShareWare, sondern
- ausschließlich gemäß den Lizenzvereinbarungen (siehe CPMULTI.DOK) zu
- behandeln.
- .SE V24PIPE / Einbindung der Unit
- 2. Einbindung der Unit in eigene Programme
-
- Wie beim Multi-Tasking-Subsystem selbst, gestaltet sich auch hier die
- Einbindung unproblematisch. Durch Eintragung der Units V24 und
- V24Pipe in Ihr USES-Statement, wird die Unterstützung für die
- serielle Schnittstelle in Ihr Programm integriert.
-
- Die Unit V24 initialisiert sich durch die Einbindung automatisch und
- installiert insbesondere eine eigene Exit-Routine. Diese sorgt
- dafür, daß die Verbindung zur Schnittstelle bei Beendigung Ihres
- Programmes oder bei einem Programmabbruch ordnungsgemäß getrennt wird.
-
- Eine Initialisierung der Unit V24Pipe findet nicht statt; die
- Verbindung zur Schnittstelle wird erst durch Aufruf einer speziellen
- Prozedur durch das Anwendungsprogramm hergestellt.
-
- Beispiel: USES CPMULTI, V24, V24Pipe;
-
- Bitte beachten Sie die Reihenfolge der Einbindung, die in Kapitel 8
- des Handbuches zu CpMulti angegeben ist.
- .SE V24PIPE / Konzept
- 3. Konzept
-
- Nachdem ich die Unit V24 bereits einigen registrierten Benutzern des
- Multi-Tasking Subsystems separat zur Verfügung gestellt hatte, habe
- ich mich nun dazu entschlossen, sie künftig zusammen mit dem
- Subsystem auszuliefern.
-
- Die Routinen dieser Unit ermöglichen die Programmierung jeweils
- einer der beiden Schnittstellen Com1 und Com2 mit Geschwindigkeiten
- von 110 bis 115200 baud. Hereinkommende Daten werden interruptge-
- steuert in einem internen Ringpuffer zur Abholung bereitgestellt. Um
- derart hohe Geschwindigkeiten erreichen zu können, wurde auf die
- Auswertung des Modem-Statusregisters und des Leitungs-Status-
- registers verzichtet. Das Kabel zur Datenübertragung benötigt daher
- nur drei Adern: Transmit-Data, Receive-Data und Signal-Ground.
- Ein Nachteil dieser Vorgehensweise ist, daß die Programmierung
- komplexer Terminalprogramme, die in der Regel den Status der
- einzelnen Steuerleitungen abfragen bzw. manipulieren, nicht ohne
- Modifikation möglich ist.
- Diese Unit kann jedoch als Basis für Eigenentwicklungen dienen,
- da sie Ihnen ja im Quellcode vorliegt und somit leicht erweitert
- werden kann.
-
- Wenngleich sich diese Dokumentation in erster Linie mit der Unit
- V24Pipe befaßt, werde ich doch an einigen Stellen auf Teile der Unit
- V24 eingehen müssen. Letztere wird jedoch nicht im Detail behandelt.
-
- Die Schnittstellenroutinen der Unit V24 waren ursprünglich nicht für
- den Multi-Tasking Einsatz gedacht und sind daher nicht vom
- Multi-Tasking Subsystem abhängig. Selbstverständlich fehlt dadurch
- auch jegliche Unterstützung der Synchronisations- und Kommunikations-
- mechanismen des Subsystems.
- Um V24 in Verbindung mit dem Subsystem einsetzen zu können, entstand
- damals das "Ereignis". Auf Basis dieses Ereignisses (ab Version 2.02
- des Subsystems unter der Bezeichnung "MemoryEvent" geführt) und in
- Verbindung mit den Routinen der Unit MtPipe, entstand die Unti
- V24Pipe.
-
- V24Pipe reduziert die zur Schnittstellenbehandlung erforderlichen
- Routinen auf ein Minimum und ermöglicht die gepufferte
- Datenübertragung von und zur Schnittstelle über Turbo Pascal
- TEXT-Dateien.
-
- Nach Eröffnen der Schnittstelle stehen zwei Pipes bereit, von denen
- eine (AuxIn) zum Lesen von der Schnittstelle, und die zweite
- (AuxOut) zum Schreiben auf die Schnittstelle verwendet werden. Die
- Anwendung greift auf diese Pipes wie auf TEXT-Dateien zu.
-
- Beispiel: Writeln(AuxOut,'Ich sende über die Schnittstelle');
-
- oder Read(AuxIn,C); {lies ein Zeichen}
- Write(C); {und gib es aus }
-
- Mit wie wenig Aufwand die Programmierung der Schnittstelle verbunden
- ist, beweist das Demoprogramm GLASSTTY, ein sehr einfaches Terminal-
- programm.
-
- Ein weiteres Demoprogramm, V24PTEST, programmiert die Schnittstelle
- so, daß die gesendeten Daten in einer Prüfschleife sofort wieder
- empfangen werden. Es sendet sich also in einer Schleife selbst Daten
- mit verschiedenen Geschwindigkeiten. Das Programm V24PTEST ist
- jedoch nicht auf allen Computern lauffähig. Je nach Architektur
- Ihrer Schnittstellenkarte, funktioniert die Prüfschleifenfunktion
- nicht einwandfrei. In diesem Fall werden keine Daten empfangen.
- .SE V24PIPE / Realisierung
- 4. Realisierung
-
- Wie bereits erwähnt, basiert V24Pipe auf der Unit MtPipe, dem
- TEXT-Datei Gerätetreiber für Pipes.
-
- Pipes sind ja, wie in der Dokumentation zu MtPipe beschrieben,
- Einweg-Kommunikationskanäle. Dies war im Fall des Print-Spoolers
- aus vollkommen ausreichend. Nun aber muß eine Kommunikation in zwei
- Richtungen stattfinden.
- Aus diesem Grunde sind auch zwei Pipes erforderlich.
-
- Sobald die Schnittstelle mittels der Prozedur "OpenAux" eröffnet
- wurde, kann das Anwendungsprogramm auf diese Pipes über die globalen
- Variablen "AuxIn" und "AuxOut" zugreifen.
- Innerhalb der Unit V24Pipe wird die jeweils andere Seite dieser
- Pipes von einem Hintergrundprozeß überwacht; es existieren also zwei
- zusätzliche Prozesse im System.
-
- Der Pipe "AuxIn", auf die das Anwendungsprogramm lesend zugreift,
- steht die Task "AuxInTask" der Unit V24Pipe gegenüber, die den
- Ringpuffer der Unit V24 entleert und diese Daten in die Pipe
- einspeist. Diese Task wird von "OpenAux" mit der Priorität
- Pri_Kernel gestartet, damit sie möglichst schnell hereinkommende
- Daten bearbeiten kann. Dennoch kann es bei der Übertragung sehr
- großer Datenblöcke (> 2KB) zum Überlauf des Ringpuffers in der Unit
- V24 kommen. In diesem Fall sollten sie letzeren vergrößern und die
- Unit neu übersetzen.
-
- Die Schreibseite, vertreten durch die Dateivariable "AuxOut", wird
- innerhalb von V24Pipe von der Task "AuxOutTask" bearbeitet. Diese
- liest die Daten der Anwendung aus der Pipe und sendet sie
- zeichenweise über die Schnittstelle hinaus. Sie bedient sich dabei
- der Ausgaberoutine der Unit V24. Die Task "AuxOutTask" besitzt die
- Priorität Pri_Kernel-1, ist also nicht ganz so wichtig wie ihr
- Gegenstück. Dennoch sorgt die hohe Priorität dafür, daß auch
- Sendeaufträge möglichst bald abgearbeitet werden.
-
- Ein Wort noch zum Verbindungsaufbau. Sollte während des Öffnens der
- Schnittstelle ein Fehler auftreten, so wird das Programm mit einer
- Fehlermeldung abgebrochen. Ich habe mich für diesen radikalen Weg
- entschieden, weil der saubere Abbau der Kommunikation nicht ganz
- unkritisch und ein sinnvolles Weiterarbeiten bei Nichtzustande-
- kommen der Verbindung in der Regel nicht möglich ist.
-
- Nach getaner Arbeit, kann die Anwendung die Verbindung zur
- Schnittstelle wieder lösen. Dies ist jedoch nicht unbedingt
- erforderlich, da auch durch das Beenden der Anwendung automatisch
- die Interruptbehandlung der Schnittstelle deaktiviert wird
- (Exit-Routine von V24). Dennoch wollte ich Ihnen eine Möglichkeit an
- die Hand geben, ggf. im laufenden Programm die Schnittstellen-
- behandlung wieder abschalten zu können. Das Demoprogramm GLASSTTY,
- z. B. macht auch von dieser Möglichkeit Gebrauch.
-
- Der Abbau der Verbindung zur Schnittstelle, und damit das Entfernen
- der Pipes und Beenden der Hintergrundprozesse, ist eine nicht ganz
- triviale Angelegenheit. Insbesondere verstößt das Schließen aller
- Pipe-Kanäle von einer einzigen Prozedur aus gegen die in den Pro-
- grammierhinweisen zu Pipes gegebenen Ratschläge.
- Zum Zeitpunkt des "Schließens" der Schnittstelle mittels der
- Prozedur "CloseAux", sind mindestens zwei Prozesse aktiv, die auf
- die Pipes zugreifen, nämlich die Hintergrundprozesse. Im Regelfall
- wird es auch noch einen dritten Prozeß geben, nämlich eine Task der
- Anwendung (siehe GLASSTTY), die versucht, Daten aus der Pipe zu
- lesen und die höchstwarscheinlich blockiert ist, da gerade keine Daten
- empfangen werden.
-
- "CloseAux" muß daher schrittweise vorgehen und die Verbindung unter
- ständiger Überwachung trennen. Hierbei wird auch ein evtl.
- blockierter Anwendungsprozeß einbezogen, dessen Task-Id der Prozedur
- "CloseAux" übergeben werden kann. Es muß jedoch sichergestellt sein,
- daß außer diesem keine weiteren Prozesse auf die Pipes zugreifen.
- Genauere Anweisungen finden Sie noch im Referenzteil bei der
- Beschreibung von "CloseAux".
-
- Problematisch ist zudem, daß diejenige Hintergrundtask, die den
- Ringpuffer der seriellen Schnittstelle bearbeitet, von einem
- externen Ereignis abhängig ist und daher den größten Teil ihres
- Daseins mit Warten auf dessen Eintreten verbringt. Diese Task
- zu beenden, ist schon ein recht gewagtes Unterfangen und nur bedingt
- zur Nachahmung empfohlen.
- .SE V24/V24PIPE / Exportierte Typ- und Datendefinitionen
- 5. Exportierte Typ- und Datendefinitionen
-
- Typdefinitionen der Unit V24
-
- ComType = (Com1,Com2);
-
- Mittels dieser symbolischen Namen wird die zu eröffnende
- Schnittstelle im "OpenAux"-Aufruf angegeben.
-
-
- BaudType = (b110,b150,b300,b600,b1200,b2400,b4800,b9600,b19200,
- b38400,b57600,b115200);
-
- Der Datentyp "BaudType" dient zur Auswahl der zu verwendenden
- Übertragungsgeschwindigkeit.
-
-
- ParityType = (Space,Odd,Mark,Even,None);
-
- "ParityType" gibt die zu benutzende Parität an; normalerweise wird
- man den Wert "None" wählen.
-
-
- DataBitsType = (d5,d6,d7,d8);
-
- Dieser Datentyp gibt an, wieviele Bits je Zeichen übertragen
- werden. Die häufigsten Werte sind "d7" (nur Zeichen von 0-127)
- und "d8" (alle Bits eines Bytes).
-
-
- StopBitsType = (s1,s2);
-
- Die Anzahl Stopbits je übertragenem Zeichen wird durch einen
- Parameter vom Typ "StopBitsType" angegeben.
-
-
- Variablen der Unit V24Pipe
-
- AuxIn, AuxOut : Text;
-
- Dies sind die Dateivariablen, über die auf die serielle
- Schnittstelle zugegriffen werden kann.
- AuxIn dient zur Dateineingabe; AuxOut zur Datenausgabe. Es ist zu
- beachten, daß Zugriffe auf diese Variablen erst nach erfolgreichem
- Aufruf von "OpenAux" zulässig sind.
- .SE V24PIPE / Referenzteil
- 6. Funktionsbeschreibung (alphabetisch)
-
-
- .RE AuxSendTimeout
- Deklaration
-
- FUNCTION AuxSendTimeout:BOOLEAN;
-
- Funktion
-
- Die Unit V24 pflegt eine Variable mit Namen "V24Timeout", die den
- Wert TRUE enthält, wenn bei der letzten Sendeoperation ein
- Timeout-Fehler aufgetreten ist.
- "AuxSendTimeout" liefert lediglich den Inhalt dieser Variablen
- zurück, kann also auch durch direkte Abfrage von "V24Timeout"
- ersetzt werden.
-
- Beispiel
-
- ......
-
- IF AuxSendTimeout
- THEN BEGIN
- Writeln('Zeitfehler beim Senden!');
- Halt(1);
- END;
-
- ......
- .EE
- ────────────────────────────────────────────────────────────────────
- .RE CloseAux
- Deklaration
-
- PROCEDURE CloseAux(Reading:TaskNoType);
-
- Funktion
-
- Schließen der Schnittstelle; Abbau der Verbindung.
- Die Hintergrundtasks werden beendet und die Pipes entfernt,
- nachdem die Interruptbehandlung der Schnittstelle deaktiviert wurde.
- Der Parameter "Reading" enthält die ID einer Task, die Daten über
- die Dateivariable "AuxIn" entgegennimmt. Diese Task muß derart
- programmiert sein, daß sie das Beenden der Kommunikation über
- IOResult erkennt und sich anschließend beendet.
-
- Ist sichergestellt, daß zum Zeitpunkt des Aufrufes von "CloseAux"
- keine Tasks mehr auf die Schnittstelle zugreifen, so kann der Wert
- 0 in "Reading" übergeben werden. "CloseAux" verläßt sich dann
- allerdings auf die Richtigkeit Ihrer Angabe!!!!
-
- Beispiel
-
-
- VAR V24InTask : TaskNoType;
-
- ......
-
- {$F+}
- PROCEDURE V24Input(P:Pointer);
-
- VAR C : Char;
-
- BEGIN
- Read(AuxIn,C);
- WHILE Not Ende AND (IoResult = 0) DO
- BEGIN
- Write(C);
- Read(AuxIn,C);
- END;
- END;
- {$F-}
-
- ......
-
- V24InTask := CreateTask(V24Input,NIL,Pri_User+1,500);
-
- ......
-
- CloseAux(V24InTask);
-
- ......
-
- Kommentar
-
- ACHTUNG!!! "CloseAux" wartet auf das Ende der Task, deren ID
- übergeben wurde!! Beendet sich diese Task nicht,
- hängt "CloseAux" in einer Endlosschleife!!!
-
- Weiterhin muß sichergestellt sein, daß keine weiteren Tasks auf
- die Schnittstelle zugreifen. Wird dies nicht beachtet, sind die
- Ergebnisse unvorhersehbar!!!
- .EE
- ────────────────────────────────────────────────────────────────────
- .RE OpenAux
- Deklaration
-
- PROCEDURE OpenAux(ComPort:ComType;Baudrate:BaudType;
- Parity:ParityType;Bits:DataBitsType;
- Stop:StopBitsType;BufSize:Word);
-
- Funktion
-
- Initialisieren der Schnittstelle entsprechend den übergebenen
- Parametern, Starten der Hintergrundprozesse und Eröffnen der Pipes.
- Zu den Parametern "ComPort", "Baudrate", "Parity", "Bits" und "Stop"
- läßt sich nicht sehr viel sagen. Die symbolischen Namen der
- Datentypen sprechen für sich selbst.
- "BufSize" bezeichnet die Anzahl Bytes, die für den Datenbereich
- der beiden Pipes auf dem Heap reserviert werden.
-
- Beispiel
-
- OpenAux(Com2,b300,none,d8,s1,2048);
-
- Diese Zeile initialisiert die Schnittstelle COM2: mit 300 Baud,
- ohne Paritätsprüfung, 8 Datenbits,, 1 Stopbit und einem
- Pipe-Puffer von 2 KB (4 KB Heap gesamt).
-
- Kommentar
-
- Verläuft der Verbindungsaufbau nicht erfolgreich, wird das
- Programm mit einer Fehlermeldung abgebrochen.
-
- siehe auch
-
- Typdefinitionen ComType, ParityType, BaudType, DataBitsType,
- StopBitsType