RS232 und Trixbus
|
|
Igel Matthias,
Ellner Ralf
|
Unbenanntes Dokument
JX-Treiber für serielle Schnittstelle, Eisenbahnsteuerung
Bearbeiter: Matthias Igel, Ralf Ellner
1. Aufgabe
Ziel war es, einen Treiber für die serielle Schnittstelle für JX zu
programmieren. Darauf aufbauend sollte eine Modelleisenbahn über ein Selectrix
® Interface gesteuert werden. Als Sonderaufgabe sollte ausserdem ein neu
entwickelter Besetztmelder für das Selectrix System auf korrekte Funktionalität
hin überprüft werden. Ebenso sollten die Daten eines GPS-Empfängers
über die serielle Schnittstelle empfangen und ausgewertet werden.
2. Implementierung des Treibers
Grundidee der ersten Version war es, dass die Daten aus dem Sende- und Empfangspuffer
(FIFO) von Interrupthandler entnommen bzw. geschrieben werden und anschliessend
evtl. gesetzte Blockierungen des Schreibers bzw. Lesers aufgehoben werden. Die
Blockierung tritt beispielsweise dann auf wenn der Sendepuffer voll ist und
versucht wird, weitere Daten in den Puffer zu schreiben. Beim Empfangspuffer
werden die empfangenen Daten bei einem Pufferüberlauf verworfen. Die Interrupts
werden bei einem leeren Senderegister bzw. vollem Empfangsregister ausgelöst.
Dafür ist es notwendig bei einem leeren Sende-register und -puffer das
Byte direkt in das Senderegister zu schreiben, um das oben beschriebene Verhalten
auzustossen.
In der ersten Version waren die Registerwerte, wie z.B. Baudrate, noch fest
im Quelltext. In der aktuellen Version lassen sich alle Registerwerte bequem
über Funktionen stezten bzw. lesen. In der aktuellen Version wird der Interruptbetrieb
durch Polling erstetzt. Dies hat folgende Ursachen:
- Probleme mit den Puffern (Interrupt zwischen Abfrage der Blockierungsbedingung
und waitForSignal() führte zu Datenverlust)
- Interrupts können bei hohen Baudraten verloren gehen
- Probleme mit dem Monitor
Beim Pollingbetrieb ist es auch möglich einen Timeout für das Lesen
bzw. Schreiben einzubauen, was in der jetztigen Implementierung geschehen ist.
3. Implementierung der Eisenbahnsteuerung
Zunächst war eine graphische Oberfläche mit AWT nach dem vorgesehen.
Das Programm war bereits unter Windows lauffähig, allerdings gab es unter
JX erhebliche Probleme mit dem Windowmanager, so dass wir zu einer textbasierten
Steuerung übergingen.Hier kann der Benutzer über eine Konsole mit
einer fest vorgegebenen Menge von Befehlen bequem die Steuerung der Züge,
aber auch von Weichen, sowie die Abfrage von Besetzmeldern vornehmen.Als Erweierung
war eine Wegdurchschaltung und eine Kollisionsüberwachung angedacht, deren
Realisierung aus Zeitmangel leider nicht mehr erfolgte. (vielleicht im nächsten
AKBP?)
4. Dateien
Interface der seriellen Schnittstelle: libs/serial_if/*
Implementierung der seriellen Schnittstelle: libs/serial_hw/*
Implementierung der Eisenbahnsteuerung: libs/railway/*
Graphische Oberfläche: libs/railway/akbp2/railway/graphic/*
GPS Empfänger: libs/gps/*
5. Probleme/Bugs/Flaws
FIFO Puffer der seriellen Schnittstelle konnte zwar aktiviert werden, aber Interrupts
blieben aus. GPS Empfänger sendete keine Daten (Wurde auch mit anderen
Betriebssystemen getestet). Vermutlich war der verwendete Adapter ungeeignet.
Der zu testende Besetztmelder lieferte meist falsche Adressdaten des Zuges.
Ausserdem waren die Daten für Ein- oder Ausfahrt eines Zuges fehlerhaft.