![]()  | 
			|||
| HSG | 
		    
  | 
		
Die folgenden Delphi-Programme enthalten den Protokollfehler, dass die Pause zwischen gesendeten Buchstaben fälschlich nur 2 Dit statt 3 Dit lang ist.
Der Sender hält sich an die bei wikipedia veröffentlichten Details des
Morse-Codes und verwendet auch die
gleiche Syntax für den Sendestring.
MorseSender0.zip
Es folgen Auszüge aus dem Quellcode:
//-------- create (public) ---------------------------------------------
constructor TMorseSender.create;
begin
  inherited create;
  dit := 100;
  frequenz := 2000;
end;
//-------- sende (public) ----------------------------------------------
procedure TMorseSender.sende (mstr: string);
var
  i,n : integer;
begin
  n := Length(mstr);
  for i := 1 to n do
  begin
    case mstr[i] of
      '.' : begin
              windows.Beep(frequenz,dit);
              sleep(dit);
            end;
      '-' : begin
              windows.Beep(frequenz,3*dit);
              sleep(dit);
            end;
      ' ' : begin
              sleep(dit);   // 1 dit Pause bereits hinter Symbol . oder -
            end;
      '/' : begin
              sleep(6*dit); // 1 dit Pause bereits hinter Symbol . oder -
            end;
    end; // of case
  end;
end;
Das eingehende Signal wird mit Hilfe eine Timers permanent "abgetastet". Es werden immer zwei
aufeinander folgende Zustände in alterzustand und zustand gespeichert.
Eine "ansteigende Flanke" 
kann dann durch (alterzustand = false) and (zustand = true) detektiert werden.
Über den QueryPerformanceCounter
wird die momentane Systemzeit tauf bestimmt. Geht man zunächst
davon aus, dass analog bei der fallenden Flanke tab bestimmt wurde, so kann die
Pausenlänge mit pLaenge := tauf - tab; bestimmt werden.
Eine "fallende Flanke" 
kann dann durch (alterzustand = true) and (zustand = false) detektiert werden.
Über den QueryPerformanceCounter
wird die momentane Systemzeit tab bestimmt. Geht man zunächst
davon aus, dass analog bei der steigenden Flanke tauf bestimmt wurde, so kann die Impulslänge
mit iLaenge := tab - tauf; bestimmt werden.
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  zustand := HW.GetEin;
  if (alterzustand = false) and (zustand = true) // auf
  then
  begin
    QueryPerformanceCounter(n); tauf := n/c;
    pLaenge := tauf-tab;
    if (1.5*dit < pLaenge) and (pLaenge < 2.5*dit)
    then puffer := puffer+' ';
    if (6*dit < pLaenge) and (pLaenge < 8*dit)
    then puffer := puffer+'/';
  end;
  if (alterzustand = true) and (zustand = false) // ab
  then
  begin
    QueryPerformanceCounter(n); tab := n/c;
    iLaenge := tab-tauf;
    if (0.5*dit < iLaenge) and (iLaenge < 1.5*dit)
    then puffer := puffer+'.';
    if (2.5*dit < iLaenge) and (iLaenge < 3.5*dit)
    then puffer := puffer+'-';
  end;
  alterzustand := zustand;
end;
MorseSender2.zip, 
exe-Dateien: MorseSender2_1.zip, 
MorseSender2_2.zip
MorseEmpfaenger3.zip, 
exe-Dateien: MorseEmpfaenger3_1.zip, 
MorseEmpfaenger3_2.zip
import threading
import time
class Timer(threading.Thread):
    def __init__(self,interval,routine):
        threading.Thread.__init__(self)
        self.interval = interval
        self.routine = routine
    def run(self):
        time.sleep(self.interval)
        self.routine()
import serial
import sys
def zeit():
    if sys.platform == 'linux2':
        return time.time()                 # fuer Linux
    else:
        return time.clock()
class Empf(object):
    def __init__(self,ser,dit=0.1):
        self.puffer = ''
        self.s = ser                       # serielle Schnittstelle
        self.akt = None                    # aktueller Zustand
        self.alt = self.s.getCTS()         # alter Zustand
        self.auf = 0                       # Zeit bei ansteigender Flanke
        self.ab = 0                        # Zeit bei abfallender Flanke
        self.dit = dit                     # dit-Zeit 
        self.interval = 0.01               # Polling-Intervall
        self.enabled = True
        self.timer = Timer(self.interval,self.poll)
        self.timer.start()
    def __del__(self):
        self.s.close()
    def poll(self):
        # Pollingroutine
        self.akt = self.s.getCTS()
        if not self.alt and self.akt:      # ansteigende Flanke
            self.auf = zeit()
            pausenlaenge = self.auf - self.ab 
            if 2.5*self.dit < pausenlaenge < 3.5*self.dit:
                self.puffer = self.puffer + ' '
                print(self.puffer)             # DEBUG
            elif 6*self.dit < pausenlaenge < 8*self.dit:
                self.puffer = self.puffer + '/'
                print(self.puffer)             # DEBUG
        elif self.alt and not self.akt:    # fallende Flanke
            self.ab = zeit()
            impulslaenge = self.ab - self.auf
            if 0.5*self.dit < impulslaenge < 1.5*self.dit:
                self.puffer = self.puffer + '.'
                print(self.puffer)             # DEBUG
            elif 2.5*self.dit < impulslaenge < 3.5*self.dit:
                self.puffer = self.puffer + '-'
                print(self.puffer)             # DEBUG
        self.alt = self.akt
        # Polling fortsetzen              
        if self.enabled:
            self.timer = Timer(self.interval,self.poll)
            self.timer.start()
s = serial.Serial('/dev/ttyS0')
e = Empf(s)
Es wurde 'ABC' mit dit = 0,1s gesendet. Bitte beachten, wie der Empfänger ausgeschaltet wird.
>>> . .- .- .- - .- -. .- -.. .- -... .- -... .- -... - .- -... -. .- -... -.- .- -... -.-. e.enabled = False >>>