HSG

Aktuelle Seite: HSG/Fächer/Informatik/Netze/Programme

Terminal4 unter wine/Linux

Erstaunlicherweise funktionieren Delphi-Programme erfahrungsgemäß sehr gut unter wine. Man muss aber z.B. dafür sorgen, dass ein Zugriff auf COM1 entsprechend umgeleitet wird. Dazu setzt man entsprechende symlinks in /home/mk/.wine/dosdevices.

mk@x2:~$ cd .wine/dosdevices
mk@x2:~/.wine/dosdevices$ ls -l
insgesamt 0
lrwxrwxrwx 1 mk mk 10 2010-07-23 14:18 c: -> ../drive_c
mk@x2:~/.wine/dosdevices$ sudo ln -s /dev/ttyS0 com1
[sudo] password for mk: 
mk@x2:~/.wine/dosdevices$ sudo ln -s /dev/ttyS1 com2
mk@x2:~/.wine/dosdevices$ ls -l
insgesamt 0
lrwxrwxrwx 1 mk   mk   10 2010-07-23 14:18 c: -> ../drive_c
lrwxrwxrwx 1 root root 10 2011-01-19 18:46 com1 -> /dev/ttyS0
lrwxrwxrwx 1 root root 10 2011-01-19 18:46 com2 -> /dev/ttyS1

Das Windows-Programm Terminal4 versucht zuerst den 'ProrityBoost' abzuschalten, was unter Linux nicht gelingen kann. Eine entsprechende Fehlermeldung kann also getrost übergangen werden. Getestet ist eine Baudrate von 50 Baud. Grundsätzlich scheint ein USB-zu-seriell-Adapter Probleme mit dem Einlesen von CTS direkt nach dem Setzen von RTS zu haben.

Terminal4.exe auf dem Mac

Vielen Dank an Oliver Schneider!

Um Terminal4.exe auf dem Mac laufen zu bekommen braucht es folgende Dinge:

Ist alles vorhanden, so kann wie folgt vorgegangen werden:

  1. Mounte WineBottlerCombo_*.*.*.dmg und ziehe die beiden Apps auf das Programme-Icon zur Installation.
  2. Lade Terminal4.exe herunter.
  3. öffne den Winebottler aus dem Programme-Ordner, wähle in der linken Spalte Create Custom Prefixes
  4. Wähle nun im rechten Teil die Terminal4.exe als Datei aus und setze den Haken "Nur Kopieren/Copy only", da Terminal4 nicht installiert, sondern nur ausgeführt werden muss.
  5. Klicke "Installieren/Install" mit dem Namen "Terminal4". Es wird eine App-Datei erzeugt, die du in deinen Programme-Ordner legen solltest.
  6. öffne das Terminal und verwende folgenden Befehl:
    sudo ln -s /dev/tty.usbserial ~/Library/Application\ Support/Wine/prefixes/Terminal4/dosdevices/com1			
    
    Bestätige und du wirst nach deinem Passwort gefragt (Administratorrechte). Wichtig ist hierbei, dass der USB2Seriell-Adapter auch als tty.usbserial gelistet ist. Dies kannst du vorher mittels
    ls /dev/*tty.usbserial*
    überprüfen. Sind mehrere Adapter angesteckt, so erhalten Adapter 2-n eine Nummer (nicht vorhersehbar).
  7. Nun kannst du Terminal4.app wie ein "normales" OS X Programm aus dem Programme Ordner starten und im Dock ablegen (wenn du möchtest). Der PriorityBoost Fehler scheint normal zu sein, Fehler2 darf aber beim Start nun nicht mehr auftauchen, wenn der Adapter richtig angesteckt ist.

Windows

GUI zu Terminal4 Bei Terminal3 wurde kritisiert:

Seltsamerweise funktioniert eine Baud-Umschaltung des Senders erst im zweiten Versuch. D.h. nach einer Baud-Umschaltung 'sende Text','breche ab' und wieder 'sende Text' anklicken. Man hat den Eindruck, dass der Empfänger erst 'auf Touren' kommen muss. Sendet man viele gleiche Zeichen, so werden zunächst unterschiedlich - falsche - empfangen. Danach hat sich der Empfänger gefangen und empfängt immer das gleiche Muster. Da die Synchronisation verlorengegangen ist, ist das empfangene Zeichen falsch.

Dieses Phänomen verschwindet, wenn der Sender eine 'Präambel' bestehend aus einem Startbit und 40 Null-Bits sendet.

Quelltexte: terminal4.zip, mit Delphi7 kompilierte *.exe: Term4.zip

Präambel

// Präambel aus Startbit und 40 Null-Bits
  SetAus(true);
  sleep(bitZeit);
  for j := 1 to 40 do
  begin
    SetAus(false);
    sleep(bitZeit);
  end;
  // Ende der Präambel

Die Präambel kann auch als das 40-Bitzeiten-lange 'Abhorchen' des Busses interpretiert werden. Denn mit jedem Setzen eines 0-Bits wird anschließend der Bus gelesen.

Kollisionserkennung

Eine Kollision bzw. eine andere Störung liegt sicher vor, wenn das Bit, das man auf einen Bus schreibt, beim sofortigen Wiedereinlesen verändert ist. Natürlich ist umgekehrt die Gleichheit beider Bits keine Garantie für Kollisionsfreiheit.

Im folgenden Quelltextauszug sieht man, wie der Sender nach dem Setzen eines Bits das Bit einliest ( er benutzt das Hardware-Objekt HW) und bei Ungleichheit das Ereignis 'OnColl' auslöst. Die Ereignisbehandlung soll in der GUI liegen, daher muss der Sender-Thread 'synchronize' benutzen.

procedure TSender.SetAus(wert : boolean);
begin
  HW.SetAus(wert);
  if HW.GetEin  wert then
    if Assigned(OnColl) then synchronize(OnColl);
end;

Anzeige der Kollisionserkennung

Nach Erkennen einer Kollision soll sie eine gewisse Zeit angezeigt werden. Nach Ablauf der Zeit soll die Anzeige wieder verschwinden. Eine typische Aufgabe für Nebenläufigkeit

....
TKollisionsAnzeige = class(TThread)
  public
    procedure AnzeigeAn;
    procedure AnzeigeAus;
    procedure execute; override;
  end;
....
procedure TKollisionsAnzeige.AnzeigeAn;
begin
  Form1.lKollision.caption := 'Kollision';
end;

procedure TKollisionsAnzeige.AnzeigeAus;
begin
  Form1.lKollision.caption := '';
end;

procedure TKollisionsAnzeige.execute;
begin
  synchronize(AnzeigeAn);
  sleep(100);
  windows.beep(500,1); // 500 Hz, 1ms
  synchronize(AnzeigeAus);
end;