Datenstruktur zur Abfrage und Anzeige zus„tzlicher M”glichkeiten der seriellen (und evtl. sonstiger) Kommunikationsroutinen ==================================================================== Cookie ------ Name: RSVF (RS232 Version Fast) Wert: Zeiger auf Datenstruktur Zeiger muá <>0 sein und auf gerade Adresse weisen Datenstruktur ------------- Beliebig viele Objekte sind als Liste hintereinander abgelegt. An das Ende einer Liste kann ber eine Verkettung eine weitere Liste angeh„ngt sein. Am Ende der letzten Liste befindet sich eine Ende-Kennung. Objekt ------ Jedes Objekt ist 8 Byte lang und beginnt auf einer geraden Adresse. Byte 0..3 sind ein Zeiger auf den Namen der Schnittstelle (Filename) im ASCII-Code. Der Name muž auf einer geraden Adresse beginnen und ist nullterminiert. Byte 4..7 enthalten Angaben ber die Eigenschaften des Objektes (der Schnittstelle). Noch nicht definierte Bits/Bytes mssen vom anlegenden Programm auf 0 gesetzt werden. Sollten irgendwann zus„tzliche Informationen n”tig werden, so wird deren Vorhandensein auf noch zu definierende Weise in Byte 4..7 angezeigt. Die Informationen selbst liegen dann vor dem Namen der Schnittstelle. Besondere Objekte ----------------- Bei besonderen Objekten ist Byte4.Bit7 =0. Ende-Objekt: Byte 0..3 0, ein NIL-Zeiger, kennzeichnet das Ende der Datenstuktur Verkettungsobjekt: Byte 0..3 Zeiger auf die n„chste Liste mit Objekten. Eigenschaftsdefinitionen im Wert -------------------------------- Byte 4: Bit7 =1: dieser Name ist eine Schnittstelle Bit6 =1: Schnittstelle ist dem GEMDOS fr File-I/O bekannt Bit5 =1: Schnittstelle ist dem BIOS bekannt (Bco*-Routinen) fr den Rest f„llt uns noch was ein (F„higkeiten der Schnittstelle) Byte 5: noch frei Byte 6: BIOS-Nummer der Schnittstelle (Bco*-Routinen) Byte 7: noch frei Mindestforderung an Treiber bei gesetztem GEMDOS-Bit ---------------------------------------------------- Fopen, Fclose, Fread, Fwrite, Fcntl werden behandelt. Falls eine Funktion (oder auch Unterfunktion von Fcntl) nicht vorhanden ist, muá dafr der Fehlercode -32 (EINVFN) geliefert werden. Fopen darf immer nur mit dem vollen Pfad "U:\DEV\devicename" erfolgen. Konstruktionen mit Dsetdrv und Dsetpath sind UNZULŽSSIG. Fcntl hat die Funktionsnummer $0104 und die Parameter: handle, special, subfunction handle: 16Bit filehandle special: 32Bit parameter for subfunction subfunction: 16Bit number of subfunction HSMODEM1 untersttzt: -------------------- Fopen fr Lesen&Schreiben auf "U:\DEV\MODEM1" und natrlich Fclose. Fwrite und Fread sind nichtblockierend, d.h. es werden immer nur soviel Byte bertragen, wie der serielle Puffer aufnehmen/liefern kann. So sollten auch andere Treiber arbeiten. Einen Teil, aber immer mehr, der Fcntl-Funktionen. Rckgabewert der Fcntl-Funktionen ist 0 fr fehlerfreie Durchfhrung oder ein negativer Fehlercode (32Bit-Wert), falls nicht extra beschrieben. Manche Zeilen sind C, manche Kommentar. Bei den angegebenen Funktionsaufrufen handelt es sich wirklich um Musteraufrufe, und nicht etwa um mižgestaltete Prototypen. Ermittlung, wieviel Byte nichtblockierend bertragen werden k”nnen ------------------------------------------------------------------ #define FIONREAD (('F'<< 8) | 1) #define FIONWRITE (('F'<< 8) | 2) long Fcntl( handle, &count, FIONREAD) long Fcntl( handle, &count, FIONWRITE) In count wird als 32Bit-Wert die Anzahl der Byte hinterlassen, die beim n„chsten Fread/Fwrite mindestens gelesen/geschrieben werden k”nnen. Da aber m”glicherweise mehrere Programme auf einen Port schreiben k”nnten, sollte man nur den Returnwert von Fread/Fwrite fr voll nehmen. (Ich halte FION* fr sinnlos, aber es gibt das in MiNT. Harun.) Setzen und Rcksetzen von Break ------------------------------- #define TIOCCBRK (('T'<< 8) | 20) #define TIOCSBRK (('T'<< 8) | 21) Fcntl( handle, dummy, TIOCSBRK); /* Break aktivieren */ Fcntl( handle, dummy, TIOCCBRK); /* Break l”schen */ Nun werden noch weitere MiNT-m„žige Aufrufe untersttzt: (die klarere Definition von TIOC?BAUD ist so mit Eric Smith abgesprochen) Setzen/Abfragen der Eingabegeschwindigkeit und Steuerung der DTR-Leitung ------------------------------------------------------------------------ #define TIOCIBAUD (('T'<< 8) | 18) Fcntl( handle, &speed, TIOCIBAUD); Setze die Eingabegeschwindigkeit der Schnittstelle. In speed steht ein 32Bit-Wert, der die gewnschte Geschwindigkeit unkodiert in Bit pro Sekunde angibt. speed = 19200 wrde auf 19200bps setzen. In speed wird die Geschwindigkeit vor dem Aufruf von TIOCIBAUD zurckgegeben. Ist sie unbekannt, wird -1 geliefert. Ist beim Aufruf speed = -1, so wird nur die Geschwindigkeit erfragt. Ist speed = 0, so wird das DTR-Signal auf inaktiv gebracht (gel”scht), ohne die Geschwindigkeit zu beeinflussen. Bei geschwindigkeitssetzendem Aufruf wird DTR automatisch aktiviert. Rckgabewert ist ERANGE wenn die Geschwindigkeit nicht einstellbar ist. Dann wird als "Ausnahme" in speed die n„chstniedrigere m”gliche Geschwindigkeit geliefert. Gibt es keine n„chstniedrige, so wird die kleinstm”gliche zurckgegeben. Setzen/Abfragen der Ausgabegeschwindigkeit und Steuerung der DTR-Leitung ------------------------------------------------------------------------ #define TIOCOBAUD (('T'<< 8) | 19) Fcntl( handle, &speed, TIOCOBAUD); Setze die Ausgabegeschwindigkeit der Schnittstelle. Die Funktionsbeschreibung ist identisch zu TIOCIBAUD. Untersttzt eine Schnittstelle getrennte Ein- und Ausgabegeschwindigkeit nicht, so beeinflužt jeder Aufruf beide Geschwindigkeiten. šbertragungsprotokolleinstellungen erfragen ------------------------------------------- #define TIOCGFLAGS (('T'<< 8) | 22) Fcntl( handle, &flags, TIOCGFLAGS); Liefert in flags einen 16Bit-Wert der eingestellten Parameter, die eine ODER-Verknpfung der folgenden Werte darstellen. Alle anderen Bit sind reserviert. Bei TIOCGFLAGS sollte man sie ignorieren. Sinnvollerweise erfragt man mit TIOCGFLAGS, modifiziert die bekannten Werte, und setzt dann per TIOCSFLAGS. /* Anzahl der Stoppbits */ #define TF_STOPBITS 0x0003 /* 0x0000 nicht erlaubt (Anmerkung: Meine Wenigkeit schl„gt vor, damit einen evtl. vorhandenen Synchronmode zu aktivieren.) */ #define TF_1STOP 0x0001 /* 1 Stoppbit */ #define TF_15STOP 0x0002 /* 1.5 Stoppbit */ #define TF_2STOP 0x0003 /* 2 Stoppbit */ /* Anzahl der Bits pro Zeichen */ #define TF_CHARBITS 0x000C #define TF_8BIT 0x0 /* 8 Bit */ #define TF_7BIT 0x4 #define TF_6BIT 0x8 #define TF_5BIT 0xC /* 5 Bit */ /* Handshakemodi und Parit„t */ #define TF_FLAG 0xF000 #define T_TANDEM 0x1000 /* XON/XOFF (=^Q/^S) Flužkontrolle aktiv */ #define T_RTSCTS 0x2000 /* RTS/CTS Flužkontrolle aktiv */ #define T_EVENP 0x4000 /* even (gerade) Parit„t aktiv */ #define T_ODDP 0x8000 /* odd (ungerade) Parit„t aktiv */ /* even und odd schliežen sich gegenseitig aus */ šbertragungsprotokolleinstellungen setzen #define TIOCSFLAGS (('T'<< 8) | 23) Fcntl( handle, &flags, TIOCSFLAGS); Setzt die Einstellungen, Beschreibung dieser bei TIOCGFLAGS. Rckgabewert ist ERANGE bei illegaler / nicht untersttzer Kombination in flags. Besonders Funktionen zum Einstellen der Schnittstelle, zur šberwachung von DCD und RING, sowie zum L”schen der Sende- und Empfangspuffer fehlen noch. Ich warte auf Vorschl„ge, aber mit Angabe der subfunction-Nummer und Syntax. Ein nichtzerst”rendes Lesen aus dem Empfangspuffer und eine Steuerung des Handshakes (vorausschauende Inaktivierung) fallen mir auch noch ein. Dafr l„uft ab 21.08.1993 im Mausnetz in ATARI-EXP unter "Serieller Soft-Standard" eine Diskussion. Harun Scheutzow, 16.05.1993 letzte Žnderung: 22.08.1993