3.2 RS232-Programmierung mit GW-Basic unter DOS




In vielen Bereichen hat das

Betriebssystem DOS immer noch eine gewisse Bedeutung. Vor allem wenn es um reine Steuerungen geht, bringt dieses einfachere Betriebssystem Vorteile. Vor allem die zeitliche Zuverlässigkeit von Abläufen ist wesentlich besser als unter Windows. Auch besteht hier die Möglichkeit, ältere PCs nutzbringend einzusetzen. Die Zugänge zur seriellen Schnittstelle sollen deshalb hier auch für Programmiersprachen unter DOS vorgestellt werden.

 

GW-Basic wie auch QBasic verwenden die serielle Schnittstelle über Interrupt-gesteuerte Hintergrundprogramme. Ankommende Zeichen werden in einen Datenpuffer geschrieben, ohne dass der Programmierer den genauen Zeitablauf bedenken muss. Die Standardgröße des Puffers von 256 Byte kann für GW-Basic durch einen Übergabeparameter verändert werden. (z.B. GWBASIC /C:32000). In QBasic kann die Puffergröße beim Öffnen der Schnittstelle mit angegeben werden.

 

Die serielle Schnittstelle wird wie eine Datei behandelt, aus der man Daten lesen oder in die man Daten schreiben kann. Sie muss zuerst geöffnet werden, wobei an Stelle eines Dateinamens die Bezeichnung der Schnittstelle mit ihren Parametern steht. Jeder Datei und auch der seriellen Schnittstelle muss beim Öffnen eine Dateinummer zugeteilt werden, die dann bei allen Datenzugriffen mit angegeben werden muss.

 

Die folgende Aufstellung zeigt die wichtigsten Befehle und ihre Parameter:

 

OPEN  "COMn: Baudrate, Parität, Zeichenlänge, Stoppbits  [RS],[CS[n]],[DS[n]],[CD[n]]" [FOR Modus] AS Dateinummer

 

   Baudrate:      75,110,150,300,600,1200,1800,2400,4800,9600

(19200, nicht für QBasic)

   Parität:          S (Space), O (ungerade), M (Mark), E (gerade) N (keine)

   Zeichenlänge:            5, 6, 7, 8

   Stopbits:       1, 2

 

Beispiel: OPEN "COM2:1200,N,8,1" as #1

Hier werden beim Öffnen der Schnittstelle DTR und RTS hochgesetzt und die Eingangsleitungen CTS, DSR und DCD überwacht. Sie müssen nach einer Sekunde hochgesetzt sein, sonst wird ein Timeout-Fehler gemeldet.

 

   Modus:         INPUT oder OUTPUT

 

Ohne Angabe des Modus wird die Schnittstelle für beide Richtungen geöffnet.

 

Die weiteren optionalen Parameter beeinflussen das Verhalten der Handshakeleitungen:

 

   RS:               Die Leitung RTS wird nicht hochgesetzt

 

   CS,DS,CD: ohne eine Zusatzangabe bewirken diese Parameter,dass die Eingangsleitungen CTS, DSR bzw. DCD nicht beachtet werden. Für jede dieser Eingangsleitungen kann eine Wartezeit n in ms angegeben werden, während der auf ein Signal eintreffen muss.

 

Beispiel: OPEN "COM1:9600,N,8,1,RS,CS,DS,CD" as #2

 

Beim Öffnen bleibt RS zurückgesetzt, und keine der Handshake-Eingangsleitungen wird beachtet.

 

CLOSE Dateinummer         

Schließen der Schnittstelle

 

Beispiel: Close #1

 

PRINT# Dateinummer, Text

Senden eines Zeichenstrings.

 

Beispiel: PRINT#1, "HALLO"

Dem Text wird ein CR (ASC 13) angefügt. Es kann mit einem Semikolon (;) unterdrückt werden.

 

INPUT$ (Anzahl, Dateinummer)

Einlesen eines Strings

 

Beispiel: B$ = INPUT$ (1,#2)

Es wird ein Zeichen von der mit der Dateinummer #2 geöffneten Schnittstelle gelesen. Das Programm wartet endlos, bis dieses Zeichen eingetroffen ist.

 

LINE INPUT# Dateiname, Stringvariable

Einlesen einer Zeile

 

Beispiel: LINE INPUT#2,A$

Eine Zeile wird von der Schnittstelle #2 in A$ eingelesen. Der Empfang wird mit einem eintreffenden CR abgeschlossen.

 

LOC (Dateinummer)

Liefert die Anzahl empfangener Zeichen

 

Beispiel: If LOC(2) > 14 THEN ....

Es wird abgefragt, ob mehr als 14 Zeichen im Puffer sind. LOC kann maximal den Wert 255 zurückgeben.

 

Basic verwendet für die serielle Schnittstelle eine erweiterte Ablaufkontrolle unter Verwendung der Handshakeleitungen. Beim Öffnen der Schnittstelle werden zunächst die Ausgänge DTR und RTS hochgesetzt. Das Programm erwartet dann, dass vom angeschlossenen Gerät DSR und DCD hochgesetzt werden. Andernfalls wird eine Timeout-Fehlermeldung ausgegeben. Dies kann man verhindern, indem man die Leitungen RTS, DSR und DCD direkt am Schnittstellenstecker verbindet.

 

Bei jedem Versuch, Daten über die Schnittstelle zu senden, wird zunächst der Zustand des Eingangs CTS geprüft. Das angeschlossene Gerät kann die Aussendung durch einen High-Pegel an dieser Leitung erlauben. Man kann sie z.B. im angeschlossenen Interface permanent an +5 V legen, um grundsätzlich das Senden von Daten zu erlauben.

 

Für die relevanten Handshakeleitungen können verlängerte Timeout-Zeiten angegeben werden:

 

 OPEN "COM1:1200,N,8,1,CS 20000,DS 20000" as #1

 

Hier werden 20 000 ms, also 20 Sekunden vorgegeben. In dieser Zeit müssen die erwarteten Pegel angelegt werden. Beim Öffnen der Schnittstelle lässt sich die erweiterte Ablaufkontrolle jedoch auch ganz abschalten, indem CS und DS ohne eine Zeitangabe verwendet wird.

 

 OPEN "COM1:1200,N,8,1,CS,DS" as #1

 

Nun kann ein einfaches Verbindungskabel mit den drei Leitungen GND, TXD und RXD, aber ohne jede Verwendung von Handshakeleitungen eingesetzt werden.

 

In einem ersten Anwendungsbeispiel soll ein kleines Terminalprogramm vorgestellt werden. Alle Tastatureingaben werden ohne Verzögerung als ASCII-Zeichen abgesandt, während gleichzeitig alle empfangenen Zeichen direkt auf dem Bildschirm erscheinen. Das Programm wurde für COM2 geschrieben und kommt ohne Verwendung der Handshakeleitungen aus. Nach dem Öffnen werden DTR und RTS zurückgesetzt. Dabei muss man beachten, dass BASIC den Interrupt der Schnittstelle benutzt. OUT2 muss also gesetzt bleiben. Der Out-Befehl zum direkten Zugriff auf Hardwareregister wird ab Windows 98 vom Betriebssystem unterdrückt. Dieser Zugang eignet sich daher nur für den Betrieb unter einem älteren DOS.

 

10 REM Mini-Terminal an COM2

20 OPEN "COM2:9600,N,8,1,CS,DS" AS #1

30 OUT (&H2FC),8    :REM RTS = 0, DTR = 0, OUT2 = 1

40 A$=INKEY$

50 IF A$ <> "" THEN PRINT#1,A$;

60 IF LOC(1) > 0 THEN B$ = INPUT$(1,#1): PRINT B$;

70 GOTO 40

 

Listing 3.1 Ein ASCII-Terminalprogramm in GW-Basic

 

Das einfache Terminalprogramm kann verwendet werden, um zwei PCs zu Testzwecken direkt zu verbinden. Dazu sind nur drei Leitungen erforderlich. Außer der Masseleitung brauchen nur die Signalleitungen TXD und RXD gekreuzt verbunden werden. Nach den Start des Programms auf beiden Rechnern erscheinen alle Zeichen jeweils am anderen Bildschirm. Das Programm arbeitet ohne Echo, d.h. die Eingaben werden nicht am eigenen Bildschirm sichtbar. Falls das erwünscht ist, braucht nur ein weiterer Print-Befehl eingesetzt zu werden.

 

In der Mess-, Steuer- und Regelungstechnik gibt es zahlreiche Geräte, die über Textzeichen mit einem PC kommunizieren. So erfordert z.B. der BASIC-Mikrocontroller 8052AH (vgl. Kap. 10) ein ASCII-Terminal. Digitale Handmultimeter (vgl. Kap. 6.1) und elektronische Laborwaagen besitzen oft eine serielle Schnittstelle zum Anschluss eines Druckers oder eines PCs. Das einfache Terminalprogramm lässt sich einsetzen, um die Kommunikation mit diesen Geräten zu untersuchen. Meist müssen die Schnittstellenparameter angepasst werden, und je nach Gerät sind bestimmte Zustände der Handshakeleitungen herzustellen.

 

Viele der in diesem Buch eingesetzten Interfaces und viele industrielle Geräte werden nicht über Textzeichen, sondern über Einzelbytes (Binärzeichen), also Zahlen im Bereich 0 bis 255 gesteuert und ausgelesen. Ein häufig angewandtes Verfahren besteht darin, Kommandos an ein Interface zu senden, die dann durch einzelne Antwortbytes vom Interface beantwortet werden. Auf diese Weise kann ein PC-Programm Daten vom Interface abfragen. Weil jeweils nur einzelne Bytes hin- und her geschickt werden, kann es keine Zeitprobleme beim Empfang geben. Sollen Steuerdaten an das Interface gesendet werden, folgt meist ein Datenbyte auf das Kommandobyte. Ein Beispiel für ein solches Interface ist der parallele Interface-Bus nach Kap. 5.

 

Das folgende kleine Byte-orientierte Terminalprogramm verwendet COM2 für die Kommunikation mit einem Interface. Nach jedem abgesandten Byte wird eine kleine Pause eingehalten, um ein eventuelles Antwortbyte zu empfangen.

 

100 REM Byte-Terminal

110 OPEN "COM2:1200,N,8,2,CS,DS" FOR RANDOM AS #1

120 INPUT "Kommando = ", A

130 PRINT #1, CHR$(A);

140 FOR n = 1 TO 1000: NEXT n

150 IF LOC(1) > 0 THEN PRINT "Interface: "; ASC(INPUT$(1, #1))

160 GOTO 120

170 CLOSE 1

 

Listing 3.2 Ein Byte-orientiertes Terminalprogramm


Download:  GWBasic-Beispiele

 

weiter
zurück