HSG |
|
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.
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:
sudo ln -s /dev/tty.usbserial ~/Library/Application\ Support/Wine/prefixes/Terminal4/dosdevices/com1Bestä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).
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 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.
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;
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;