Um ein Modem anzuschliessen und zu verwenden, brauchen Sie nicht unbedingt ein Grundwissen über Modems oder serielle Ports. Falls Fehler auftreten, ist es aber für die Problemlösung sehr hilfreich, wenn Sie die Grundlagen verstehen. Wenn Sie diesen Abschnitt gelesen haben und noch mehr über Modems wissen möchten, finden Sie weitere Informationen im Abschnitt Wie ein Modem technisch funktioniert (dieser Abschnitt ist allerdings noch nicht fertiggestellt). Im Serial HOWTO finden Sie weitere Informationen über serielle Ports.
Die meisten Telefon-Hauptleitungen sind bereits digital, aber die Kabel, die zu Ihrem Haus oder Ihrer Firma führen, sind normalerweise analog. Das bedeutet, dass sie eine Welle in Form einer Spannungsschwankung übertragen, die ein Abbild der Schallwelle ist, die von Ihrer Stimme erzeugt wird. Eine solche Spannungsschwankung heißt »analog«. Würde man sie auf einem Oszilloskop sichtbar machen, dann würde sie aussehen wie eine Sinuskurve mit wechselnder Frequenz und Amplitude. Ein digitales Signal hat dagegen einen rechteckigen Verlauf. Bsp: 3 V (Volt) könnte einer digitale Eins und 0 V könnte einer digitalen Null entsprechen. Bei den meisten seriellen Ports, die von einem externen Modem verwendet werden, entspricht +12 V einem 0-bit und -12 V einem 1-bit (einige verwenden auch + oder -5 V).
Um Daten von Ihrem Computer über eine Telefonleitung zu senden, nimmt das Modem die digitalen Signale vom Computer entgegen und wandelt sie in ein analoges Signal. Dies wird erreicht, indem es eine Spannung in Form einer analogen Sinuskurve erzeugt und diese dann »MOduliert«. Das Ergebnis repräsentiert noch immer digitale Daten, es könnte auch digitales Signal anstelle von analoges Signal heißen. Aber es sieht so ähnlich aus wie ein analoges Signal und beinahe jeder nennt es auch so. Am anderen Ende der Telefonleitung »DEModuliert« ein anderes Modem dieses Signal und das rein digitale Signal ist wiederhergestellt. Ein Modem ist daher ein »MOdulator-DEModulator«.
Nachdem sich zwischen dem Modem und dem Computer ein serieller Anschluß befindet, ist es notwendig, neben dem Modem auch die Arbeitsweise eines seriellen Ports zu verstehen. Der serielle Port ist ein I/O (Input/Output, Eingabe/Ausgabe) Gerät.
Die meisten PCs haben ein oder zwei serielle Ports. Jeder hat einen 9-poligen (manchmal auch einen 25-poligen) Anschlussstecker auf der Rückseite des Computers. Einer der Anschlussstifte ist für das Senden von Daten zuständig, ein anderer für den Empfang. Die anderen Pins sind entweder auf Masse gelegt oder für Kontrollaufgaben vorgesehen.
Der serielle Port ist mehr als nur ein einfacher Anschlussstecker. Er wandelt parallele Daten in serielle Daten und ändert ihre elektrische Darstellung. Innerhalb des Computers fließen die Datenbits parallel (und brauchen viele parallele Leitungen gleichzeitig). Ein serieller Datenstrom fließt über eine einzige Leitung (wie die Leitung, die mit dem Pin für das Senden oder Empfangen des Anschlusssteckers verbunden ist). Damit der serielle Port solch einen Datenstrom erzeugen kann, muß er die parallelen Daten (aus dem Inneren des Computers) in serielle Daten umwandeln, um sie zu senden. Für den Empfang gilt genau das umgekehrte Verhalten.
Der größte Teil der Elektronik eines seriellen Ports befindet sich auf einem Chip (oder in einem bestimmten Abschnitt eines Chips), der unter dem Namen UART bekannt ist. Im Serial HOWTO finden Sie weiter Informationen über UARTs.
Im restlichen Teil dieses Kapitels wird die Rolle des UART im Gesamtsystem vorgestellt.
Ältere PCs verwendeten 25-polige Anschlüsse, aber nur höchstens 9 Pins waren tatsächlich belegt, deshalb sind die meisten Anschlussstecker heutiger PCs nur 9-polig. Jeder der neun Anschlussstifte (Pins) ist mit einer Leitung verbunden. Neben den beiden Leitungen, die für das Senden und Empfangen der Daten verwendet werden, ist ein weiterer Pin bzw. eine weitere Leitung mit der Signalmasse belegt. Die Spannung auf jeder Leitung wird in Bezug auf diese Signalmasse gemessen. Es müssen also mindestens drei Leitungen verwendet werden, um Daten gleichzeitig senden und empfangen zu können. Es ist aber auch möglich, ohne die Masseleitung zu arbeiten, allerdings langsamer und manchmal treten Fehler auf.
Die übrigen Leitungen sind nur für die Kontrolle des Datenaustausches vorgesehen und nicht für die Übertragung von Bytes. Alle diese Signale könnten über eine einzige Leitung gesendet werden, aber für jedes Signal gibt es eine eigene dedizierte Leitung. Diese Leitungen werden Modem-Steuerleitungen genannt. Diese Steuerleitungen befinden sich entweder im aktiven Zustand (Ein) mit einer Spannung von +12 V oder im inaktiven Zustand (Aus) mit einer Spannung von -12 V. Eine der Leitungen signalisiert dem Computer, das Senden von Bytes an das Modem zu unterbrechen. Umgekehrt signalisiert eine andere Leitung dem Modem, das Senden von Bytes an den Computer einzustellen. Wieder andere Leitungen veranlassen das Modem, aufzulegen, oder teilen dem Computer mit, dass eine Verbindung hergestellt wurde oder dass ein Klingelsignal auf der Leitung liegt (wenn jemand versucht anzurufen).
Für ein internes Modem gibt es keinen 9-poligen Verbindungsstecker, aber das Verhalten ist exakt so, als würden die oben erwähnten Leitungen existieren. Anstelle eines 12-Volt Spannungspegels auf einer Leitung, der den Status auf einer Modemsteuerleitung angibt, verwendet das interne Modem einfach ein Statusbit in seinem eigenen Speicher (ein Register), um den Status dieser nicht existierenden Steuerleitung zu bestimmen. Der interne serielle Port des Modems sieht für den Computer aus wie ein richtiger serieller Port. Für ihn gelten sogar die selben Geschwindigkeitsgrenzen für die Datenübertragung, die man bei gewöhnlichen seriellen Schnittstellen einstellt, z.B. 115200 Bits/s. Unglücklicherweise arbeiten viele interne Modems nicht auf diese Weise, sondern nutzen MS Windows Software für ihre Funktion und arbeiten daher nicht unter Linux. Siehe auch den Abschnitt Interne Modems, die zu meiden sind (Winmodems etc.).
Weil der Computer mit jeder seriellen Schnittstelle kommuniziert, muss das Betriebssystem (Operating System, OS) wissen, dass die seriellen Schnittstellen existieren, wo sie sind (ihre I/O-Adressen) und welche Leitung die serielle Schnittstelle verwendet, um einen Dienst der CPU des Computers in Anspruch zu nehmen. Deshalb muss innerhalb der seriellen Schnittstelle sowohl die Ein-/Ausgabe-Adresse (I/O) als auch die Interrupt ReQuest Nummer (IRQ) in einem nicht flüchtigen Speicher abgelegt werden. Der IRQ bestimmt, welche Leitung für ein Interrupt Signal verwendet wird, um einen Dienst der CPU zu beanspruchen. Siehe auch Abschnitt Interrupts.
Beim PCI-Bus funktioniert das alles etwas anders, da der PCI-Bus über eine eigene Interrupt-Verarbeitung verfügt. Das BIOS auf PCI-Boards bildet die PCI-Interrupts jedoch auf IRQs ab, so dass sich nach außen hin alles so verhält wie oben beschrieben, mit der Ausnahme, dass sich zwei oder mehr Geräte einen IRQ teilen können.
I/O-Adressen sind nicht dasselbe wie Adressen im Hauptspeicher. Wenn eine I/O-Adresse auf dem Adressbus des Computers anliegt, wird eine andere Leitung aktiviert. Beides bedeutet für den Hauptspeicher, die Adresse zu ignorieren, und es bedeutet für alle angeschlossenen Geräte, die über I/O-Adressen-verfügen (wie z.B. der serielle Port) die Adresse auszuwerten und sie mit der eigenen zu vergleichen. Wenn die Adresse übereinstimmt, liest das I/O-Gerät die Daten auf dem Datenbus.
Die seriellen Schnittstellen heißen unter Linux ttyS0
,
ttyS1
, usw.
(die korrespondierenden Schnittstellen unter DOS/Windows heißen
normalerweise COM1, COM2, usw).
Im /dev
Verzeichnis gibt es eine spezielle Datei für jeden Port.
Um sie anzuzeigen, können Sie folgenden Befehl eingeben:
ls /dev/ttyS*
Nur weil es z.B. eine Datei ttyS3
gibt, muss das aber nicht
heißen, dass auch ein physischer serieller Port existiert.
Welcher dieser Namen (ttyS0
, ttyS1
, etc) zu welchem
physikalisch Port
gehört, wird wie folgt bestimmt: die Treibersoftware des seriellen Ports
verwaltet eine Tabelle, welche die Zuordnung von I/O-Adressen und ttyS-Namen
enthält. Diese Abbildung von Namen auf I/O-Adressen und IRQs kann mit
Hilfe des Befehls setserial
sowohl gelesen als auch gesetzt werden, siehe
Was ist setserial?.
Dieser Befehl setzt
nicht die I/O-Adressen und IRQs in der Hardware selbst (dies wird
durch Jumper oder Plug-and-Play Software vorgenommen). Welcher physikalische
Port also z.B. mit ttyS1
korrespondiert, hängt folglich sowohl davon ab,
was die Treibersoftware (per setserial
Befehl) denkt und wie die Hardware
konfiguriert ist. Falls ein Fehler gemacht wurde, kann es vorkommen, dass
der physikalische Port keinem einzigen Namen (wie z.B. ttyS2
)
entspricht und daher auch nicht verwendet werden kann. Siehe auch
Gerätedateien für die serielle Schnittstelle /dev/ttyS2, usw..
Bytes kommen über die Telefonleitung zum Modem, werden vom Modem von analog nach digital umgewandelt und werden auf dem Weg zu ihrem Ziel innerhalb des Computers der seriellen Schnittstelle übergeben. Wenn die serielle Schnittstelle z.B. 8 Bytes vom Modem empfängt (diese Anzahl kann auch auf 1, 4, 8 oder 14 eingestellt sein), signalisiert sie der CPU, diese Daten abzuholen, indem sie ein elektrisches Signal sendet. Dieses Signal liegt auf einer ganz bestimmten Leitung an und ist eine Aufforderung an die CPU, ihre momentane Arbeit kurz zu unterbrechen und sich um die serielle Schnittstelle zu kümmern (engl: Interrupt Request, abgekürzt IRQ). Ältere serielle Schnittstellen senden so ein Unterbrechungssignal für jedes einzelne empfangene Byte.
Jede Interrupt-Leitung innerhalb des Computers hat eine Nummer (im
allgemeinen ebenfalls als IRQ bezeichnet) und die serielle Schnittstelle
muss wissen, auf welcher Leitung sie ihre Anforderung zu signalisieren
hat. Z.B. verwendet ttyS0
in der Regel die IRQ Nummer 4 (IRQ4). Eine Liste
dieser Nummern (und mehr) ist in der Manual Page des Kommandos
setserial
zu finden (man setserial
, im Abschnit »Configuring
Serial Ports«). Ein Interrupt Signal wird ausgelöst, wann immer die
serielle Schnittstelle die Aufmerksamkeit der CPU benötigt. Es ist
wichtig, dass dies rechtzeitig geschieht, weil der Speicherpuffer
der seriellen Schnittstelle nur 16 empfangene Bytes (in älteren
Modems ist es nur ein Byte) aufnehmen kann. Wenn die
CPU es nicht schafft, diese emfangenen Daten rechtzeitig abzuholen, dann
bleibt für weitere ankommende Bytes kein Platz mehr übrig und der kleine
Buffer kann überlaufen (Overrun). Es gehen dann Bytes verloren. Für ein
externes Modem gibt es keine Möglichkeit, den Datenfluss schnell genug zu
stoppen, um diese Situation zu verhindern. Bei einem internen Modem ist
der 16 Byte Buffer auf derselben Karte und ein gutes Modem wird nicht in
diesen Buffer schreiben, wenn er voll ist. Deshalb wird ein gutes internes
Modem den Buffer nicht zum überlaufen bringen und dies ist ein Vorteil eines
internen Modems.
Interrupts werden auch ausgelöst, wenn die serielle Schnittstelle gerade alle 16 Bytes ihres kleinen Sendebuffers zum Modem übertragen hat. Es ist dann wieder Platz für 16 weitere, zu sendende Bytes. Der Interrupt teilt dies der CPU mit, so dass sie weitere Bytes in den Sendebuffer schreiben kann. Ein Interrupt wird auch ausgelöst, wenn eine Modem-Steuerleitung ihren Status ändert.
Die oben genannten Buffer sind alle in Form von Hardware realisert. Die serielle Schnittstelle hat auch große Buffer im Bereich des Hauptspeichers. Dies wird später erklärt.
Interrupts übertragen eine Menge Informationen, allerdings nur indirekt. Der Interrupt selber signalisiert lediglich einem Chip, dem Interrupt Controller, dass ein bestimmter serieller Port um Aufmerksamkeit bittet. Die CPU wird darüber vom Interrupt Controller unterrichtet. Die CPU führt dann ein bestimmtes Programm aus, um den seriellen Port zu bedienen. Dieses Programm wird Interrupt Service Routine genannt und ist Bestandteil der Treibersoftware für den seriellen Port. Es versucht herauszufinden, was im seriellen Port passiert ist und behandelt dann das Problem, wie z.B. die Übertragung von Datenbytes aus oder in den Buffer des Ports. Die Service Routine kann leicht feststellen, was passiert ist, weil der serielle Port über spezielle Register verfügt, deren I/O-Adressen der Treibersoftware bekannt sind. Diese Register enthalten Statusinformationen über den seriellen Port. Die Software liest diese Register aus, erhält dadurch Information, was passiert ist und kann entsprechende Maßnahmen einleiten.
Bevor wir mit den Grundlagen zur seriellen Schnittstellen fortfahren, müssen wir noch eine weitere Funktion des Modems verstehen: Datenkompression. In manchen Fällen wird diese Aufgabe in Wirklichkeit von der Software ausgeführt, die auf der CPU des Computer läuft, aber unglücklicherweise funktioniert diese Software bislang nur unter MS Windows. Wir beschäften uns hier mit dem Fall, dass das Modem selbst diese Aufgabe erledigt, denn dies ist eine Voraussetzung, damit das Modem auch unter Linux funktioniert.
Um Daten schneller über die Telefonleitung übertragen zu können, kann man sie komprimieren, indem man ein maßgeschneidertes Kodierungsverfahren verwendet, welches selber wieder von der Art der Daten abhängt. Die kodierten Daten sind kleiner (sie enthalten die gleiche Information in weniger Bytes) und können in kürzerer Zeit über das Internet übertragen werden. Dieser Vorgang wird als »Datenkompression« bezeichnet.
Wenn Sie Dateien aus dem Internet herunterladen, dann sind sie wahrscheinlich bereits komprimiert und es ist für das Modem unmöglich, sie noch weiter zu komprimieren. Ihr Modem kann evtl. feststellen, dass die Daten bereits komprimiert wurden und einen weiteren Kompressionsversuch unterlassen. Wenn Sie Daten empfangen, die von dem anderen Modem komprimiert wurden, so wird Ihr Modem sie dekomprimieren und sehr viel mehr Bytes erzeugen, als über die Telefonleitung gesendet wurden. Daher wird der Datenfluss vom Modem in den Computer höher sein als der Fluss über die Telefonleitung zu Ihnen. Das Verhältnis beider Flussgrößen wird Kompressionsrate genannt. Kompressionsraten bis zu einem Wert von 4 sind möglich, aber sehr selten.
Ähnlich wie Datenkompression können Modems auch eine Fehlerkorrektur durchführen. Eigentlich ist der Name »Fehlerkorrektur« falsch, denn das Modem kann einen Fehler nur erkennen und den fehlerhaften Datenblock ein zweites Mal anfordern. Das Modem kann den Fehler aber nicht selbständig korrigieren. Wenn man es genau nimmt, müsste man also von »Fehlererkennung« sprechen.
Die serielle Schnittstelle erwartet, dass jedes zu übertragende Byte von zwei zusätzlichen Bits eingerahmt ist: ein Start-Bit und ein Stop-Bit. Ohne Verwendung einer Fehlerkorrektur werden diese zusätzlichen Bits vom Modem über die Telefonleitung übertragen. Obwohl bei den Fehlerkorrekturverfahren zusätzliche Steuer- und Prüfsummeninformationen übertragen werden, die den effektiven Datendurchsatz (in Byte/s) reduzieren, führt die Tatsache, dass jetzt auf die Start- und Stop-Bits verzichtet werden kann, in Wirklichkeit zu einer leichten Erhöhung des Datendurchsatzes. Die Bytes werden jetzt in einzelnen Paketen übertragen, und die Start- und Stop-Bits werden überflüssig.
Daten (Bytes, aus denen Briefe, Bilder usw. bestehen) fließen vom Computer zum Modem und dann über die Telefonleitung (und umgekehrt). Durchsatzraten wie z.B. 56k (56000 Bits/s) werden fälschlicherweise auch als »Übertragungsgeschwindigkeit« bezeichnet, dieser Begriff hat sich jedoch weitgehend durchgesetzt. Gäbe es keine Datenkompression, dann würde die Durchsatzrate zwischen Computer und Modem etwa mit der Durchsatzrate auf der Telefonleitung übereinstimmen.
In Wirklichkeit sind jedoch zwei verschiedene Übertragungsgeschwindigkeiten an Ihrem Ende der Telefonleitung zu unterscheiden:
Wenn Sie eine Verbindung mit einem Modem auf der anderen Seite der
Telefonleitung aufbauen, schickt Ihnen das Modem oft eine Nachricht wie
z.B. CONNECT 28000
oder CONNECT 115200
. Was bedeuten diese Angaben?
Nun, damit kann entweder die DCE- oder die DTE-Geschwindigkeit gemeint sein.
Wenn der Wert höher ist als auf dem Modem angegeben, muss es die DTE
Geschwindigkeit zwischen Modem und Computer sein. Dies ist der Fall für
den oben genannten Wert 115200. Der Wert 28800 kann nur die DCE-Geschwindigkeit
sein, weil die serielle Schnittstelle diesen Wert nicht kennt. Das Modem
kann so konfiguriert werden, dass es die eine oder die andere Geschwindigkeit
meldet. Einige Modems melden beide Werte und zeigen den DCE-Wert z.B. als
CARRIER 28800
an.
Wenn Sie ein internes Modem verwenden, würden Sie vielleicht nicht erwarten, dass es eine Begrenzung für die Übertragungsgeschwindigkeit zwischen Ihrem Modem und Ihrem Computer gibt, weil sich das Modem innerhalb des Computers befindet und fast ein Teil Ihres Computers ist. Aber es gibt diese Grenze, weil das Modem einen fest zugeordneten seriellen Port enthält.
Es ist wichtig zu verstehen, dass die durchschnittliche Geschwindigkeit häufig kleiner ist als die angegebene Geschwindigkeit, besonders auf der kurzen Übertragungsstrecke zwischen Computer und Modem. Die geringere Durchschnittsgeschwindigkeit ist durch Wartezeiten bedingt. Wegen der Flusskontrolle können durchaus Wartezeiten von etwa einer Sekunde auftreten. Andererseits können auch sehr kurze Verzögerungen von wenigen Mikrosekunden vorkommen, die das Ende des einen Bytes und den Anfang des nächsten kennzeichnen. Außerdem können Modems auf kleinere Geschwindigkeiten umschalten, wenn die Qualität der Telefonleitung während der Verbindungsdauer schlechter wird.
Im Abschnitt Welche Geschwindigkeit sollte ich verwenden? wird erläutert, welche DTE Geschwindigkeit eingestellt werden sollte.
Unter Flusskontrolle wird die Fähigkeit verstanden, den Fluss von Bytes auf einer Übertragungsleitung zu unterbrechen und ohne Datenverlust wieder aufzunehmen. Mittels Flusskontrolle kann das Modem die momentane Durchsatzrate der Daten beeinflussen.
Nehmen wir einmal an, Sie verbinden ein 33,6k Modem, welches einfach Bytes mit genau 33,6 kBits pro Sekunde (bps) über die Telefonleitung sendet und empfängt, mit dem seriellen Port. Das Modem soll keinerlei Datenkompression oder Fehlerkorrektur durchführen. Und nehmen wir weiter an, dass Sie die Geschwindigkeit der seriellen Schnittstelle auf 115.200 Bits/s (bps) eingestellt haben und Daten vom Computer zum Modem übertragen. Dann beträgt der Datenfluss vom Computer zum Modem 115,2 kbps. Der Datenfluss des Modems über die Telefonleitung beträgt im besten Fall jedoch nur 33,6 kbps. Weil ein höherer Datenfluss in das Modem hineingeht als von ihm wieder herauskommt, speichert das Modem die Differenz (115,2k - 33,6k = 81,6k) in einem seiner Buffer. Dieser Buffer kann schnell überlaufen, wenn der 115,2k-Fluss nicht gestoppt wird.
Und nun kommt die Flusskontrolle zu Hilfe. Wenn der Buffer des Modems fast voll ist, sendet das Modem ein Stop-Signal zum seriellen Port. Der serielle Port leitet dieses Signal zum Gerätetreiber weiter der 115,2 kbps Fluss wird gestoppt. Das Modem sendet weiterhin Daten mit 33,6 kbps aus seinem vorher angefüllten Buffer. Weil keine Daten mehr in diesen Buffer hineinfließen, beginnt er sich zu leeren. Wenn fast keine Bytes mehr im Buffer vorhanden sind, sendet das Modem ein Start-Signal zum seriellen Port und der 115,2 kbps Datenstrom beginnt wieder zu fließen. Flusskontrolle bewirkt also im Ergebnis einen durchschnittlichen Datendurchsatz (in unserem Fall 33,6 kbps), der deutlich unter dem Durchsatz von 115,2 kbps im eingeschalteten Zustand liegt. Dies ist die so genannte »Start-Stop« Flusskontrolle.
Das eben geschilderte ist ein einfaches Beispiel für Flusskontrolle für einen Datenfluss vom Computer zum Modem, aber auch für die entgegengesetzte Übertragungsrichtung (vom Modem oder einem anderen Gerät zum Computer) kann Flusskontrolle genutzt werden. Bei jeder Richtung des Datenflusses spielen 3 verschiedene Buffer ein Rolle: 1. innerhalb des Modems, 2. innerhalb des UART-Bausteins im seriellen Port und 3. in dem Hauptspeicher, der vom Gerätetreiber des seriellen Ports verwendet wird. Flusskontrolle schützt diese Buffer vor einem Überlauf. Die kleinen Hardware-Buffer des seriellen Ports sind durch diesen Mechanismus nicht direkt geschützt, sie vertrauen statt dessen auf die schnelle Reaktion auf die von ihnen ausgelösten Interrupt-Signale.
Dies war das Wichtigste über Flusskontrolle, aber es gibt natürlich noch mehr Details.
Für die Übertragungsrichtung vom Modem zum PC wird Flusskontrolle nur selten notwendig sein. Im Kapitel »Complex Flow Control Example« des Serial HOWTO wird ein Beispiel behandelt, in dem dies notwendig ist. Aber wenn Sie die Übertragungsrate zwischen Modem und Computer (Geschwindigkeit des seriellen Ports) nicht hoch genug eingestellt haben, dann ist es notwendig, den Datenfluss vom Modem zum Computer zu reduzieren. Um dies zu erreichen muss der über die Telefonleitung hereinkommende Datenfluss unterbrochen werden können. Ihr Modem muss das andere Modem veranlassen, weiter Daten zu senden. Siehe Modem-zu-Modem Flusskontrolle
Falls möglich, ist es das Beste, Hardware-Flusskontrolle zu verwenden; dabei werden zwei der Modem-Kontrollleitungen verwendet, um das Start- und Stop-Signal zu übermitteln. Software-Flusskontrolle nutzt die normalen Sende- und Empfangsleitungen, um die Start- und Stop-Signale zu übertragen. Für diesen Zweck werden die ASCII-Kontrollzeichen DC1 (Start) und DC3 (Stop) verwendet. Sie werden einfach in den normalen Datenstrom eingefügt. Software-Flusskontrolle ist nicht nur langsamer hinsichtlich der Reaktionszeit, auch die Übertragung binärer Daten ist nicht möglich, ohne dass besondere Vorsichtsmaßregeln getroffen werden. Weil beliebige binäre Daten sehr wahrscheinlich die Bitmuster DC1 und DC3 enthalten, muss mit besonderen Mitteln zwischen einem DC3-Zeichen, das das Flusskontroll-Zeichen »Stop« bedeutet und einem DC3-Zeichen, das Teil der binären Daten ist, unterschieden werden. Das gleiche gilt für DC1. Eine funktionierende Software-Flusskontrolle für binäre Daten setzt sowohl Modem- (Hardware) als auch entsprechende Software-Unterstützung voraus.
Die Theorie der Flusskontrolle zu verstehen, kann von praktischem Nutzen sein. Z.B. habe ich mein Modem für einen Internet-Zugang verwendet, und alles schien gut zu funktionieren. Nach einigen Monaten versuchte ich, große Dateien von meinem PC zum ISP (Internet Service Provider) zu übertragen, dabei kam es zu vielen Übertragungswiederholungen und Fehlern. Das Empfangen von Dateien aus der anderen Richtung (von meinem ISP zu mir) funktionierte einwandfrei. Es stellte sich heraus, dass das Problem ein Hardwarefehler in meinem Modem war, der dazu führte, dass die Flusskontrolle deaktiviert wurde. Der Buffer des Modems lief über, wenn große Dateien gesendet wurden, weil nie ein Stop-Signal zum Computer gesendet wurde, um den Datenfluss zum Modem zu unterbrechen. Für die entgegengesetzte Übertragungsrichtung vom Modem zum Computer trat kein Problem auf, weil die Endgerätegeschwindigkeit (z.B. 115,2 kBit/s) immer höher war als die Übertragungsgeschwindigkeit auf der Telefonleitung. Die Lösung des Problems bestand darin, ein Kommando zur Aktivierung der Flusskontrolle am Ende des Modem-Initialisierungsstrings anzuhängen.
Dies ist die Flusskontrolle für die Daten, die zwei Modems über die Telefonleitung austauschen. In der Praxis gibt es diese Flusskontrolle nur, wenn die Fehlerkorrektur eingeschaltet ist. Es ist aber tatsächlich möglich, Software-Flusskontrolle zwischen zwei Modems auch ohne Fehlerkorrektur einzuschalten, dies kann aber das Senden von binären Daten stören und daher wird sie selten verwendet.
Obwohl viel von diesem Thema schon erklärt wurde, z.B. Flusskontrolle, ein Paar 16 Byte Puffer der Hardware des seriellen Ports und ein Paar von größeren Puffern innerhalb des Modems, so gibt es doch noch ein anderes Pufferpaar. Dies sind größere Puffer (z.B. 8 kByte) im Hauptspeicher, die so genannten Schnittstellenpuffer des seriellen Ports. Wenn ein Anwendungsprogramm Bytes zum seriellen Port (und damit zum Modem) sendet, werden sie zuerst im Sendepuffer des seriellen Ports im Hauptspeicher zwischengespeichert. Das Pufferpaar besteht aus diesem Sendepuffer und einem Empfangspuffer für die entgegengesetzte Richtung des Datenstroms.
Der Gerätetreiber des seriellen Ports holt sich aus diesem Sendepuffer z.B. 16 Bytes, ein Byte nach dem anderen, und legt sie im 16 Byte Hardware-Sendepuffer zur Übertragung ab. Wenn die Bytes erst einmal in diesem Sendepuffer gelandet sind, gibt es keine Möglichkeit mehr, ihr Versenden zu verhindern. Sie werden dann zum Modem übertragen, welches wiederum über einen genügend großen Puffer (z.B. 1 kByte) verfügt. Wenn der Gerätetreiber (durch die Flusskontrolle angefordert) den ausgehenden Datenfluss des Computers unterbricht, wird in Wirklichkeit nur der Datenstrom aus dem großen Sendepuffer des Hauptspeichers unterbrochen. Selbst nachdem dies geschehen ist und der Datenfluss zum Modem gestoppt wurde, kann ein Anwendungsprogramm weiterhin Daten in diesen 8k-Sendepuffer hineinschreiben bis er voll wird.
Wenn dieser Puffer gefüllt ist, kann das Anwendungsprogramm keine Daten
mehr in diesen Puffer schreiben (der write()
-Befehl
in einem C-Programm
blockiert) und das Anwendungsprogramm stoppt vorübergehend in seinem
Ablauf und wartet, bis wieder ein wenig Speichplatz im Puffer verfügbar
wird (synchrone Arbeitsweise).
Daher kann ein Flusskontroll-»Stop« Signal im Extremfall das
Programm anhalten, welches die Bytes sendet. Obwohl dieses Programm steht,
muss das nicht bedeuten, das auch der Computer steht. Andere Prozesse
können die CPU Zeit beanspruchen, während er auf ein »Start«-Signal von
der Flusskontrolle wartet.
Die eben geschilderten Vorgänge wurden ein wenig vereinfacht dargestellt, da es für das Anwendungsprogramm auch die Alternative gibt, etwas anderes zu tun, während es auf die »write«-Anweisung wartet (asynchrone Arbeitsweise).
Befehle werden vom Kommunikationsprogramm über die selben Leitungen an das Modem gesendet, die auch für die Übertragung von Daten genutzt werden. Die Befehle bestehen aus kurzen ASCII-Strings, z.B. »AT&K3« um die Hardware-Flusskontrolle (RTS/CTS) zwischen Computer und Modem zu aktivieren, oder »ATDT5393401« um die Nummer 5393401 anzuwählen. Beachten Sie, dass alle Befehle mit »AT« beginnen. Einige Befehle, wie z.B. der Befehl zum Einschalten der Flusskontrolle, helfen dabei, das Modem zu konfigurieren. Andere Befehle wie z.B. der Wählbefehl bewirken, dass tatsächlich etwas passiert. Es gibt etwa 100 verschiedene möglich Befehle. Wenn Ihr Kommunikationsprogramm startet, sendet es zuerst einen Initialisierungsbefehl an das Modem, der aus mehreren AT-Befehlen bestehen kann, um es richtig einzustellen. Alle Befehle werden über die gewöhnlichen Datenleitungen gesendet, bevor das Modem wählt oder einen Anruf erhält.
Wenn das Modem mit dem anderen Modem verbunden ist (Online Modus), wird alles, was vom Computer zum Modem gesendet wird, direkt zum anderen Modem übertragen und vom Modem nicht als Befehl interpretiert. Es gibt eine Möglichkeit, diesen Modus zu verlassen und zurück in den Kommandomodus zurückzukehren, in dem alles, was an das Modem gesendet wird, als Befehl interpretiert wird. Der Computer sendet einfach die Zeichenfolge »+++«, wobei innerhalb eines bestimmten Zeitfensters vor und nach dem Senden dieses Befehls keine anderen Daten übertragen werden. Wenn das Zeitfenster eingehalten wird, kehrt das Modem in den Befehlsmodus zurück. Eine andere Möglichkeit dies zu erreichen ist ein Signal auf einer bestimmten Modemsteuerleitung.
Es gibt eine Reihe von Tabellen dieser Modem-Befehle im Internet. Der Abschnitt Seiten im Internet enthält Links zu einigen solchen WWW Adressen. Verschiedene Modem-Modelle und -marken verwenden nicht genau den gleichen Satz von Befehlen. Was bei einem Modem funktioniert, kann bei einem anderem Modem versagen. Einige gemeinsame Befehle (es wird nicht garantiert, dass sie für alle Modems funktionieren) sind in diesem HOWTO im Abschnitt Modem Konfiguration aufgelistet.
Der Gerätetreiber für den seriellen Port ist die Software,
die die Hardware des seriellen Ports anspricht. Der Linux Kernel bedient
sich der Funktionen der Treibersoftware, um die
serielle Schnittstelle zu nutzen. Dieser Gerätetreiber wird nun als
ladbares Modul angeboten. Das Modul wird normalerweise vom Kernel
automatisch geladen, wenn es benötigt wird. Kernel ab der Version 2.2
unterstützen dies. In älteren Kernel-Versionen musste der Prozess
kerneld
laufen, um Module bei Bedarf automatisch zu laden. Anderenfalls
musste das Modul explizit im Verzeichnis /etc/modules
zu finden sein. Bevor unter Linux Module verwendet wurden, waren
Gerätetreiber üblicherweise Teil des Kernels (»monolithischer Kernel«).
Wenn das Modul mit dem seriellen Gerätetreiber geladen wird, werden
Informationen über die vorhandenen seriellen Ports auf dem
Bildschirm angezeigt (oft mit einem falschen IRQ). Wenn aber mithilfe
von setserial
dem Gerätetreiber der hoffentlich richtige Wert
für den IRQ mitgeteilt wurde, sollten Sie eine weitere Bildschirmausgabe
mit den richtigen Werten sehen. Der Abschnitt
Was ist setserial enthält mehr Informationen über den
setserial
-Befehl.
Man kann den Treiber modifizieren, wenn man den Kernel-Quellcode ändert.
Vieles, was den seriellen Treiber betrifft, findet sich in der Datei
serial.c
. Informationen über die Entwicklung von Programmen für
den seriellen Port gibt das Serial Programming HOWTO.